You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())

代码说明

  1. PKCS7填充逻辑:将明文转为字节后,计算需要填充的长度,生成对应数量的填充字节(每个字节的值等于填充长度),确保最终明文长度是16的整数倍。
  2. 密钥规范处理:将密钥转为字节类型传入AES.new,符合pycryptodome库的参数要求。
  3. 长度校验:通过断言强制验证密钥长度,避免因密钥长度不符引发后续错误。

内容的提问来源于stack exchange,提问作者Abin Benny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:25:30