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

Python AES加解密解密结果为空问题排查求助

AES解密返回空字符串的问题排查与修复

核心问题分析

  1. Key处理逻辑不一致
    加密时随机生成的key是16字节(AES.block_size),通过get_key()保存的是该key的Base64编码;但解密时,将Base64字符串传入AESCipher构造函数后,代码会对这个字符串执行SHA256哈希,生成完全不同的32字节key,导致解密失败,最终返回空字符串。

  2. Unpad方法存在缺陷
    原__unpad方法的判断逻辑冗余,且未验证padding的有效性。当解密失败得到乱码时,可能错误地截断内容为空。


修复方案

1. 修正Key处理逻辑

修改AESCipher的构造函数,区分传入的是Base64编码的随机key还是用户自定义密码:

def __init__(self, key=None):
    self.block_size = AES.block_size
    if key:
        try:
            # 尝试解码Base64,对应随机生成的key
            self.key = b64decode(key)
        except:
            # 解码失败则视为用户自定义密码,执行SHA256哈希
            self.key = hashlib.sha256(key.encode()).digest()
    else:
        # 随机生成16字节key(AES-128)
        self.key = Random.new().read(self.block_size)

2. 修复Unpad方法

优化padding验证逻辑,避免解密错误导致的异常:

@staticmethod
def __unpad(plain_text):
    if not plain_text:
        return b''
    last_byte = plain_text[-1]
    # 验证padding的有效性,防止解密错误导致的异常
    if last_byte < 1 or last_byte > len(plain_text):
        return plain_text
    # 检查所有padding字节是否符合PKCS7规范
    if plain_text[-last_byte:] == bytes([last_byte]) * last_byte:
        return plain_text[:-last_byte]
    return plain_text

调试建议

  • 在加密和解密时分别打印self.key的Base64编码,确认两者一致;
  • 在decrypt方法中打印解密后未unpad的plain_text,若显示乱码,大概率是key不匹配;
  • 验证IV的提取是否正确:加密时IV和密文拼接后Base64编码,解密时需确保正确拆分出前16字节作为IV。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:36:10