运行AES ECB解密代码报错ValueError:数据需对齐块边界求解决
问题解决思路与修正代码
错误原因
AES-ECB模式要求待解密数据的长度必须是16字节(AES固定块大小)的整数倍,你的代码触发该错误,本质是读取后的加密数据长度不符合要求,或是数据读取/处理过程中出现了损坏。
核心修复步骤
- 用二进制模式读取加密文件:加密数据属于二进制流,文本模式读取可能因编码、换行符处理导致数据损坏,直接用
rb模式读取:with open('file.json', 'rb') as f: enc_data = f.read() - 规范密钥处理:AES密钥长度必须是16、24或32字节(对应AES-128/192/256),读取密钥时要去除多余的换行、空格:
with open('Key.txt', 'r', encoding='utf-8') as f: key = f.read().strip() # 清除首尾空白字符 key_bytes = key.encode('utf-8') # 提前验证密钥长度,避免后续报错 assert len(key_bytes) in (16, 24, 32), "密钥长度必须为16/24/32字节" - 校验加密数据长度:读取后直接检查数据长度是否为16的倍数,排除数据截断或附加无关内容的情况:
assert len(enc_data) % 16 == 0, "加密数据长度必须是16字节的整数倍"
完整修正代码
from Crypto.Cipher import AES # 读取加密二进制数据 with open('file.json', 'rb') as enc_file: enc_data = enc_file.read() # 读取并格式化密钥 with open('Key.txt', 'r', encoding='utf-8') as key_file: key = key_file.read().strip() key_bytes = key.encode('utf-8') # 前置校验,提前排查格式问题 assert len(key_bytes) in (16, 24, 32), "密钥长度不符合AES标准" assert len(enc_data) % 16 == 0, "加密数据未对齐AES块边界" # 执行解密 cipher = AES.new(key_bytes, AES.MODE_ECB) decrypted_bin = cipher.decrypt(enc_data) # 二进制转JSON字符串(优先UTF-8,失败则尝试Latin1) try: decrypted_json = decrypted_bin.decode('utf-8') print(decrypted_json) except UnicodeDecodeError: decrypted_json = decrypted_bin.decode('latin1') print(decrypted_json)
额外注意点
如果校验时发现数据长度不符合要求,大概率是文件读取方式错误,或是文件本身在传输/保存时出现了截断;在线工具能正常解密,说明原始加密数据本身是符合格式的。另外,ECB模式安全性极低,后续新的加密场景建议改用CBC/GCM等模式。
内容的提问来源于stack exchange,提问作者Zach Stear
相关产品推荐
相关产品推荐

