Angular用CryptoJS AES加密,Python PyCryptodome解密填充错误求助
问题根源与解决方法
你的填充错误本质是Angular端CryptoJS和Python端PyCryptodome的加密参数完全不匹配:
- 模式不匹配:CryptoJS AES加密默认用CBC模式,你Python代码误用了ECB模式
- 密钥处理不匹配:CryptoJS传入字符串密码时,会自动通过PBKDF2算法派生密钥和IV,而你Python代码直接用原始字符串当密钥
- 变量错误:Python代码里
key未定义(应使用secretKey),encrypted未定义(应使用data)
修正后的Python解密代码
from Crypto.Cipher import AES from Crypto.Protocol.KDF import PBKDF2 from Crypto.Util.Padding import unpad import base64 secretKey = "lazydog" # 替换为Angular端实际输出的加密字符串 encrypted_data = "s2SS6ugKbTGjTaT0U+X8mw==" def decrypt(enc): # 1. 解码Base64格式的加密文本 enc_bytes = base64.b64decode(enc) # 2. 解析CryptoJS默认的OpenSSL格式:前8字节为"Salted__",接下来8字节是盐,剩余部分是密文 salt = enc_bytes[8:16] ciphertext = enc_bytes[16:] # 3. 用PBKDF2派生密钥和IV(与CryptoJS默认参数对齐:SHA1哈希、1000次迭代、生成32字节密钥+16字节IV) key_iv = PBKDF2(secretKey, salt, dkLen=32+16, count=1000, hmac_hash_module='SHA1') key = key_iv[:32] iv = key_iv[32:] # 4. CBC模式解密并去除PKCS7填充 cipher = AES.new(key, AES.MODE_CBC, iv=iv) decrypted_bytes = unpad(cipher.decrypt(ciphertext), AES.block_size) return decrypted_bytes.decode('utf-8') # 执行解密并打印结果 decrypted = decrypt(encrypted_data) print('解密结果:', decrypted)
关键参数对齐说明
- 密钥派生:CryptoJS默认用PBKDF2,参数为密码、随机盐、SHA1哈希、1000次迭代,生成32字节AES-256密钥+16字节CBC初始化向量(IV)
- 加密模式:统一使用CBC模式(CryptoJS默认)
- 填充方式:CryptoJS与PyCryptodome的PKCS7填充规则完全一致,直接用
unpad即可处理 - 输出格式:CryptoJS的
toString()默认返回OpenSSL格式(Salted__前缀+盐+密文),解密时需先拆分盐与密文
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

