AES加密遇ValueError:输入长度需为16倍数,求实现PKCS7填充方案
解决AES加密的ValueError及配置实现方案
报错原因
ValueError: Input strings must be a multiple of 16 in length 是因为AES块大小为128位(16字节),ECB模式下要求明文必须是块大小的整数倍,你的明文vgfcomo#456长度仅11字节,不满足要求,因此触发错误。
配置匹配与实现要点
你要求的配置对应实现如下:
- aes.KeySize = 128:你的密钥
qwertyui87654388长度为16字节,正好符合128位密钥要求,无需修改。 - aes.BlockSize = 128:AES-128默认块大小就是128位,无需额外配置。
- aes.Mode = CipherMode.ECB:保持使用
AES.MODE_ECB,注意该模式安全性极低,绝不建议在生产环境使用。 - aes.Padding = PaddingMode.PKCS7:手动实现PKCS7填充逻辑,补足明文长度至块大小的整数倍。
修改后的代码
from Crypto.Cipher import AES def pkcs7_pad(data, block_size=16): # 计算需要填充的字节数 padding_len = block_size - len(data.encode('utf-8')) % block_size # 生成PKCS7格式的填充字节 padding = bytes([padding_len]) * padding_len return data.encode('utf-8') + padding key = 'qwertyui87654388' plaintext = "vgfcomo#456" # 强制验证密钥长度符合128位要求 assert len(key) == 16, "密钥长度必须为16字节(128位)" # 初始化ECB模式的AES加密器 cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB) # 对明文执行PKCS7填充 padded_plaintext = pkcs7_pad(plaintext) # 执行加密并输出十六进制密文 encrypted_data = cipher.encrypt(padded_plaintext) print(encrypted_data.hex())
代码说明
- PKCS7填充逻辑:将明文转为字节后,计算需要填充的长度,生成对应数量的填充字节(每个字节的值等于填充长度),确保最终明文长度是16的整数倍。
- 密钥规范处理:将密钥转为字节类型传入
AES.new,符合pycryptodome库的参数要求。 - 长度校验:通过断言强制验证密钥长度,避免因密钥长度不符引发后续错误。
内容的提问来源于stack exchange,提问作者Abin Benny
相关产品推荐
相关产品推荐

