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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:25:18