AES解密报错ValueError: Padding is incorrect,密钥IV已验证正确求解决
AES解密出现"ValueError: Padding is incorrect."的问题排查与修复
问题根源
你的代码存在两个关键错误:
- 错误对密文执行填充操作:AES加密后的密文本身已经是符合块大小的(加密阶段会对明文做填充),解密时完全不需要对密文调用
pad。你代码里的enc_text1=pad(enc_text,16)会篡改原始密文结构,直接导致解密后的数据无法通过unpad校验。 - 未解码Base64密文:
enc_text是Base64编码后的字符串,必须先解码成二进制密文才能传入AES解密函数,直接用字符串字节解密会导致数据格式完全错误。
修正后的代码
from Crypto.Cipher import AES from Crypto.Util.Padding import unpad import base64 # Base64编码的密文,先解码为二进制 enc_text = "u/jR/dq99cIt9n5JdeJqA6h1keoUvnotNYgEGUKrcscG2/ytj3iQPJAhe//OPsBATwJS61/SItlqxH6rfzgVvo6un1/ja7nFQS3rkNDRaC8rj+qBtNoeoOCk32E73A8rZAXzBks7hb0aGaN0+GAGMdnSCQHGgXWtolN9zRuemwvYLOHEadTryo577AyInKa35TUOwDub/1OYl+xo+I+auZL4suMNcNNTYE9lhKFU0iY=" key = "3e60a9e7ba37f66060ca7597d5fbc1bc".encode("utf-8") iv = "www.elahmad.com/".encode('utf-8') # 解码Base64密文为二进制 ciphertext = base64.b64decode(enc_text) # 初始化AES CBC实例 cipher = AES.new(key, AES.MODE_CBC, iv) # 解密后对明文去填充 decrypted_data = unpad(cipher.decrypt(ciphertext), 16) # 转为UTF-8字符串输出 print(decrypted_data.decode("utf-8"))
修正说明
- 移除了对密文的
pad操作,仅在解密后对明文执行unpad。 - 新增
base64.b64decode(enc_text)步骤,将Base64字符串转换为AES可处理的二进制密文。 - 最后把解密得到的二进制数据解码为UTF-8字符串(适配明文为文本的场景)。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

