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 bthis is source code from source.txt encrypted content is bAxb3xe4x8flqxfb)~rx1cxedxefEkmxd3xceLx07)8x9fxb1xd7xa1x8ax90Lx8d<xfc rewrite to source.txt decrypt content bthis is source code 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参数的意义
- key length(密钥位数,密码长度) AES128,AES192,AES256(128 位、192 位或 256 位) 128位对应的是16个字节,所以部分平台库上,会使用16个字符或者长度为16的字符串来做密码。
- key (密钥,密码) key指的就是密码了,AES128就是128位的,如果位数不够,某些库可能会自动填充到128。
- IV (向量) IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。
- mode (加密模式) AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显。
- padding (填充方式) 对于加密解密两端需要使用同一的PADDING模式,大部分PADDING模式为PKCS5, PKCS7, NOPADDING。