Node.js crypto模块与CryptoJS实现AES256解密的差异问题排查
问题原因
这个报错是填充规则差异导致的,和编码处理无关:
- 你编写的CryptoJS代码明确指定了
padding: CryptoJS.pad.ZeroPadding零填充,并且后续通过自定义的strippadding方法处理填充内容 - Node.js内置
crypto模块的createDecipheriv默认启用PKCS7填充校验,解密时会自动校验末尾的PKCS7填充是否合法,你的密文使用的是自定义填充规则,自然会触发bad decrypt报错
修复方案
只需要在创建decipher实例后关闭默认的自动填充校验即可,其余逻辑不需要改动:
function create_aes_decrypt(tradeinfo, key, iv, algorithm) { let return_str = ""; const decipher = crypto.createDecipheriv(algorithm, key, iv); // 新增这一行关闭默认PKCS7填充校验 decipher.setAutoPadding(false); let decrypted_data = decipher.update(tradeinfo, "hex", "utf-8"); decrypted_data += decipher.final("utf-8"); return_str = strippadding(decrypted_data); return return_str; }
修改后运行代码即可得到你预期的解密结果。
内容的提问来源于stack exchange,提问作者GoRo
相关产品推荐
相关产品推荐

