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

Windows系统下Python基于PyCryptodome的加解密编码问题

问题分析与修复方案

我来帮你排查这段AES加解密代码里的问题,主要集中在EAX模式的正确使用和编码一致性上,咱们一步步拆解:

1. AES EAX模式的核心误用

EAX是带认证的加密模式,它依赖**加密时生成的nonce(随机数)和tag(认证标签)**才能完成正确解密和完整性校验,你的代码犯了两个关键错误:

  • 加密和解密时分别创建新的AES实例,导致两次生成的nonce完全不同——解密必须复用加密时的同一个nonce才能得到正确结果。
  • 直接调用decrypt方法而非EAX专属的decrypt_and_verify,跳过了数据完整性校验,失去了EAX模式的安全特性。

2. 编码不一致导致乱码

加密时你用field.encode('UTF-8')将字符串转成字节,但解密后却用.decode('cp1252')解码,两种编码规则不兼容,必然会出现乱码。必须保证加密和解密的编码全程一致,推荐通用的UTF-8。

3. 未完成的打印语句

代码里的print(...)是未完成的,需要补充打印解密后的文本内容。


修正后的完整代码

下面是修复后的代码,同时加入了nonce和tag的复用逻辑,保证加解密的一致性:

from Cryptodome.Cipher import AES
from Cryptodome.Random import get_random_bytes

class CryptHelper:
    # 注意:AES密钥长度必须是16/24/32字节(对应AES-128/192/256)
    secret_key = get_random_bytes(32)  # 示例生成256位密钥,实际要固定密钥并安全存储

    @staticmethod
    def encryptdecrypt(field):
        if field is None:
            return None
        
        print(f"Input Text is --> {field}")
        
        # 加密流程:生成nonce、密文和认证标签
        cipher = AES.new(CryptHelper.secret_key, AES.MODE_EAX)
        ciphertext, tag = cipher.encrypt_and_digest(field.encode('UTF-8'))
        print(f"Encrypted String --> {ciphertext.hex()}")  # 用十六进制打印更易读
        
        # 解密流程:必须复用加密时的nonce和tag
        cipher = AES.new(CryptHelper.secret_key, AES.MODE_EAX, nonce=cipher.nonce)
        try:
            plaintext = cipher.decrypt_and_verify(ciphertext, tag)
            decrypted_text = plaintext.decode('UTF-8')
            print(f"Decrypted String --> {decrypted_text}")
            return decrypted_text
        except ValueError:
            print("解密失败:数据可能被篡改或密钥错误")
            return None

额外注意事项

  • 密钥管理:实际项目中不要用临时生成的随机密钥,要使用固定且安全存储的密钥,否则重启程序后无法解密之前的数据。
  • 数据持久化:如果需要保存加密后的数据,要把nonce、tag和ciphertext一起存储(比如拼接成字节串或用JSON结构化存储),解密时必须同时用到这三个值。
  • 编码规范:全程使用UTF-8编码可以避免绝大多数乱码问题,不要随意切换编码格式。

内容的提问来源于stack exchange,提问作者javaShilp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:03:19