问题现象与背景
在使用Python的pycryptodome库执行AES加密时,开发者经常会遇到以下报错:
ValueError: Incorrect AES key length (X bytes)
该错误表明输入的加密密钥不符合AES算法的密钥规范。AES标准严格定义了密钥长度必须为128位(16字节)、192位(24字节)或256位(32字节),而实际提供的密钥长度与这些要求不匹配。
错误原因深度分析
导致该问题的常见原因包括:
- 原始密钥长度不足:用户直接使用短密码(如8字符字符串)作为密钥
- 编码转换错误:未正确处理字符串到字节的转换(如忘记
.encode('utf-8')) - 哈希处理缺失:未使用密钥派生函数(如PBKDF2)将可变长度密码转换为固定长度密钥
- 数据截断:读取密钥文件时意外截断了部分内容
解决方案大全
方法1:密钥长度修正
使用填充补全技术确保密钥长度合规:
from Crypto.Util.Padding import pad
key = pad(raw_key.encode(), 32) # 扩展到256位
方法2:密钥派生函数
推荐使用PBKDF2生成符合规范的密钥:
from Crypto.Hash import SHA256
from Crypto.Protocol.KDF import PBKDF2
salt = b'random_salt_value'
key = PBKDF2(password, salt, 32, count=100000, hmac_hash_module=SHA256)
方法3:二进制密钥验证
添加长度检查逻辑:
assert len(key) in (16, 24, 32), "Invalid key length"
最佳实践建议
- 始终使用密钥派生函数处理用户输入密码
- 在单元测试中加入密钥长度验证
- 对密钥使用Base64编码存储和传输
- 考虑使用环境变量管理生产环境密钥
扩展知识
不同加密模式对密钥的要求差异:
| 模式 | 最小密钥长度 |
|---|---|
| AES-128-CBC | 16字节 |
| AES-256-GCM | 32字节 |