AES加密报错:密钥长度不正确(15字节)如何解决?
解决AES密钥长度错误的加密方案
错误原因
报错信息ValueError("Incorrect AES key length (%d bytes)" % len(data))明确指出:你使用的密钥'thisisabadkey'长度为13字节,不符合AES的密钥长度要求。AES仅支持三种合法密钥长度:
- 16字节(对应AES-128)
- 24字节(对应AES-192)
- 32字节(对应AES-256)
解决方案
以下两种方法可解决该问题:
方法1:通过哈希生成合法长度密钥(推荐)
用哈希函数将原密钥转换为固定长度的字节串,既保证密钥长度合规,也提升安全性:
from Crypto.Cipher import AES from hashlib import sha256 original_key = 'thisisabadkey' # 用SHA-256哈希原密钥,生成32字节的AES-256密钥 aes_key = sha256(original_key.encode()).digest() # 注意:ECB模式不安全,实际建议用CBC/GCM等模式 cipher = AES.new(aes_key, AES.MODE_ECB) # 处理明文:AES要求明文长度为16字节的倍数,需填充 data = b'your_data_to_encrypt' padding_length = 16 - len(data) % 16 padded_data = data + bytes([padding_length]) * padding_length encrypted_data = cipher.encrypt(padded_data)
方法2:补全原密钥到合法长度
如果必须保留原密钥的字节内容,可将其补全到最近的合法长度(比如补3个字节到16字节):
from Crypto.Cipher import AES original_key = 'thisisabadkey' # 用\x00填充至16字节,也可选择其他填充字符 aes_key = original_key.encode().ljust(16, b'\x00') cipher = AES.new(aes_key, AES.MODE_ECB) # 同样需要对明文进行填充处理 data = b'your_data_to_encrypt' padding_length = 16 - len(data) % 16 padded_data = data + bytes([padding_length]) * padding_length encrypted_data = cipher.encrypt(padded_data)
重要提醒
ECB模式属于不安全的加密模式,它不会使用初始化向量(IV),相同明文会生成相同密文,容易被破解。实际生产环境中建议使用CBC、GCM等更安全的模式,其中GCM还能提供数据完整性校验。
内容的提问来源于stack exchange,提问作者Yusuf Ganiyu
相关产品推荐
相关产品推荐

