使用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
相关产品推荐
相关产品推荐

