python怎么对文件进行加密解密

使用python的pycrypto库AES的CBC模式加密和解密文件

AES (Advanced Encryption Standard),它是一种加密对称密码算法,可用于加密和解密信息 。
该算法可以使用 128、192 和 256 位的密钥,并对 128 位(16 字节)的数据块进行操作 。
由于我们可能要加密大于 128 位的数据,因此我们需要使用块(block)模式进行加密。下面的例子会加密source.txt文件并将source.txt文件解密到target.txt文件 。

安装pycryptodome,文章使用Python 3.6.8

pip3 install pycryptodome

Python脚本内容

#!/usr/bin/env python3
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

#打开需要加密的文件并将内容赋值给data
in_file = open("/root/work/study/ransomware/source.txt", "rb") 
data = in_file.read() 
in_file.close()
print('source content %s from source.txt' %data)
#使用随机字符生成AES相关的参数
key = get_random_bytes(32)
iv = get_random_bytes(16)

cipher1 = AES.new(key, AES.MODE_CBC, iv)
#使用AES.MODE_CBC对data进行加密并赋值给ct
ct = cipher1.encrypt(pad(data, 16))
print ('encrypted content is %s rewrite to source.txt ' %ct)
#将加密后的数据回写至文件source.txt,得到加密后的source.txt
out_file = open("/root/work/study/ransomware/source.txt", "wb")
out_file.write(ct)
out_file.close()
#秘钥和向量IV没动过,所以使用秘钥进行解密并解密回target.txt
cipher2 = AES.new(key, AES.MODE_CBC, iv)
#解密文件
pt = unpad(cipher2.decrypt(ct), 16)
print('decrypt content %s to target.txt' %pt)
out_file = open("/root/work/study/ransomware/target.txt", "wb") 
out_file.write(pt)
out_file.close()

测试代码

[root@BlogServer ransomware]# ls
crypt.py  source.txt
[root@BlogServer ransomware]# cat source.txt 
this is source code
[root@BlogServer ransomware]# python3 crypt.py 
source content b'this is source code\n' from source.txt
encrypted content is b'A\xb3\xe4\x8flq\xfb)~r\x1c\xed\xefEkm\xd3\xceL\x07)8\x9f\xb1\xd7\xa1\x8a\x90L\x8d<\xfc' rewrite to source.txt 
decrypt content b'this is source code\n' to target.txt
[root@BlogServer ransomware]# cat source.txt 
A??q??km?L)8±?L<[root@BlogServer ransomware]# 
[root@BlogServer ransomware]# cat target.txt 
this is source code

AES的参数

1. key length(密钥位数,密码长度)
2. key (密钥,密码)
3. IV (向量)
4. mode (加密模式)
5. padding (填充方式)

AES参数的意义

  1. key length(密钥位数,密码长度)
    AES128,AES192,AES256(128 位、192 位或 256 位)
    128位对应的是16个字节,所以部分平台库上,会使用16个字符或者长度为16的字符串来做密码。
  2. key (密钥,密码)
    key指的就是密码了,AES128就是128位的,如果位数不够,某些库可能会自动填充到128。
  3. IV (向量)
    IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。
  4. mode (加密模式)
    AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显。
  5. padding (填充方式)
    对于加密解密两端需要使用同一的PADDING模式,大部分PADDING模式为PKCS5, PKCS7, NOPADDING。

Leave a Reply