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

使用Python解密Node.js CryptoJS加密数据时遇Padding错误求助

解密CryptoJS加密数据时Padding错误的解决办法

问题重现

用Python解密Node.js CryptoJS加密的字符串,运行代码后报错:{ValueError}Padding is incorrect.,尝试代码如下:

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad

make = make.json()['data']
key = "SecretPassphrase"
encrypted_make = self.decrypt(make,key)

def decrypt(self,encrypted, passphrase):
    encrypted = base64.b64decode(encrypted)
    IV = encrypted[:16]
    aes = AES.new(passphrase.encode('utf-8'), AES.MODE_CFB, IV, segment_size=128)
    return unpad(aes.decrypt(encrypted[16:]),aes.block_size)

错误原因及修正步骤

  • 流加密模式无需填充:CFB属于流加密模式,加密时不会对明文做填充处理,解密后自然不需要调用unpad,这是触发padding错误的直接原因。
  • 匹配CryptoJS默认加密模式:CryptoJS的AES.encrypt默认使用CBC模式,而非CFB。如果Node.js端用的是默认加密逻辑,Python必须对应使用CBC模式。
  • 适配CryptoJS密钥与结果格式:CryptoJS传入字符串密钥时,会默认用PBKDF2生成实际密钥,同时自动生成随机salt;加密结果的Base64字符串解码后,结构为Salted__(8字节标识)+8字节salt+16字节IV+密文。

修正后的代码

场景1:Node.js用CryptoJS默认逻辑加密

如果Node.js加密代码是CryptoJS.AES.encrypt(明文, 密钥字符串)这类默认写法,Python解密代码如下:

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import SHA256

def decrypt(self, encrypted, passphrase):
    # 解码Base64加密数据
    encrypted_data = base64.b64decode(encrypted)
    # 验证CryptoJS默认的Salted__标识
    assert encrypted_data[:8] == b'Salted__'
    # 提取salt和IV
    salt = encrypted_data[8:16]
    iv = encrypted_data[16:32]
    # 用PBKDF2生成密钥,匹配CryptoJS默认参数:迭代1000次、SHA256哈希
    key = PBKDF2(passphrase, salt, dkLen=32, count=1000, hmac_hash_module=SHA256)
    # 使用CBC模式解密
    aes = AES.new(key, AES.MODE_CBC, iv)
    # CBC模式需要解PKCS7填充
    decrypted = unpad(aes.decrypt(encrypted_data[32:]), AES.block_size)
    return decrypted.decode('utf-8')

场景2:Node.js明确使用CFB模式加密

如果Node.js端自定义用了CFB模式加密,只需去掉unpad调用即可:

def decrypt(self, encrypted, passphrase):
    encrypted = base64.b64decode(encrypted)
    IV = encrypted[:16]
    aes = AES.new(passphrase.encode('utf-8'), AES.MODE_CFB, IV, segment_size=128)
    # 直接返回解密结果,无需解填充
    return aes.decrypt(encrypted[16:]).decode('utf-8')

内容的提问来源于stack exchange,提问作者Syed Arsalan Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:01:01