pyAesCrypt加密字典存文件后读取解密报文件损坏问题排查
问题原因
报错完全是密文读写逻辑错误导致的:
pyAesCrypt.encryptStream生成的密文是原始二进制字节流,你在加密后调用str(fCiph.getvalue())把字节对象转成了Python字符串字面量(比如把字节b'\xa3\xf1'转成了字符串"b'\\xa3\\xf1'"),相当于把字节的打印输出存进了文件,根本不是原始密文。- 读取时你把这个字符串重新encode转成字节,得到的内容和原始密文的字节结构完全不同,pyAesCrypt校验不到合法的AES文件头,就会抛出文件损坏的错误。
核心原则:二进制密文必须用二进制模式读写,不能转成普通文本字符串存储。
修正步骤
- 加密写文件时,使用二进制写模式
wb打开文件,直接写入fCiph.getvalue()返回的原始字节,不要做str()转换 - 解密读文件时,使用二进制读模式
rb打开文件,直接读取原始密文字节,不需要额外做encode转换
修正后的可运行代码如下:
import io import json import pyAesCrypt password = 'some_password' bufferSize = 64 * 1024 def enc(): loaded_settings = {'pass1': 'xxx', 'pass2': 'ccc', 'key': 'ddd', 'secret': 'sss'} # 将字典序列化为utf-8编码的字节数据 user_encode_data = json.dumps(loaded_settings).encode('utf-8') fIn = io.BytesIO(user_encode_data) fCiph = io.BytesIO() pyAesCrypt.encryptStream(fIn, fCiph, password, bufferSize) # 以二进制写模式打开文件,直接写入原始密文字节 with open("Output.txt", "wb") as ciph_file: ciph_file.write(fCiph.getvalue()) def dec(): # 以二进制读模式打开文件,直接读取原始密文字节 with open("Output.txt", "rb") as ciph_file: cipher_data = ciph_file.read() fCiph = io.BytesIO(cipher_data) ctlen = len(cipher_data) fCiph.seek(0) fDec = io.BytesIO() pyAesCrypt.decryptStream(fCiph, fDec, password, bufferSize, ctlen) # 将解密后的字节反序列化为字典 output_dict = json.loads(fDec.getvalue()) print(output_dict['pass1']) enc() dec()
额外提示:当前实现解密后的明文仅存储在内存变量中,不会落地生成明文文件,符合你的使用需求。如果要进一步提升安全性,建议不要将加密密码硬编码在代码中,可以通过环境变量、运行时用户输入等方式传入。
内容的提问来源于stack exchange,提问作者Cai Allin
相关产品推荐
相关产品推荐

