Python AES加解密解密结果为空问题排查求助
AES解密返回空字符串的问题排查与修复
核心问题分析
Key处理逻辑不一致
加密时随机生成的key是16字节(AES.block_size),通过get_key()保存的是该key的Base64编码;但解密时,将Base64字符串传入AESCipher构造函数后,代码会对这个字符串执行SHA256哈希,生成完全不同的32字节key,导致解密失败,最终返回空字符串。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
相关产品推荐
相关产品推荐

