You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:30:56