NodeJS解密ColdFusion AES/CBC/PKCS5Padding加密内容问题
解决Node.js解密ColdFusion AES加密内容的问题
当然可以解密!咱们一步步修正你的代码,搞定遇到的所有问题:
问题核心梳理
首先得搞清楚ColdFusion encrypt() 函数在你的调用参数下的隐性行为:
- 当使用
AES/CBC/PKCS5Padding且未显式指定IV时,ColdFusion会默认使用16字节的全0 IV(AES-128的块大小固定为16字节) - 你生成的密文是
HEX编码,所以Node.js解码时必须对应使用hex作为输入编码 - 你的Buffer用法不符合当前Node.js规范,需要替换为官方推荐的方法
修正后的完整代码
const crypto = require('crypto'); const key = "nQw7y6QejwGFh/SNrul20Q=="; // 用Buffer.from替代废弃的new Buffer,正确解码base64格式的密钥 const binaryEncryptionKey = Buffer.from(key, "base64"); // ColdFusion默认使用16字节全0的IV,这里生成对应Buffer const iv = Buffer.alloc(16, 0); const decrypt = (encryptedHex) => { try { // 创建Decipheriv实例,必须传入算法、密钥、IV三个参数 const decipher = crypto.createDecipheriv("AES-128-CBC", binaryEncryptionKey, iv); // 密文是HEX编码,所以输入编码设为hex,输出指定为utf8 let decrypted = decipher.update(encryptedHex, "hex", "utf8"); decrypted += decipher.final("utf8"); return decrypted; } catch (err) { console.error('解密失败:', err); return null; } } // 测试你提供的示例密文 const sampleCiphertext = "FB391CAAE5CD8FF47C55211ED8636D213C95F233B615D4E56CB7CD6B051D01DF356E1C45ED7AABAB5F9BCBB9EED6355B"; console.log(decrypt(sampleCiphertext));
关键修正点说明
- Buffer弃用问题解决:把
new Buffer(key, "base64")替换为Buffer.from(key, "base64"),这是Node.js官方明确推荐的替代方案,彻底消除弃用警告 - IV参数补充:ColdFusion不会省略IV,只是默认用了全0的16字节IV,所以Node.js必须传入这个参数,否则会触发参数类型错误
- 密文编码匹配:你的示例密文是HEX格式,所以
decipher.update的输入编码要设为hex,而不是之前错误的base64,这是解密成功的核心前提
内容的提问来源于stack exchange,提问作者myTest532 myTest532
相关产品推荐
相关产品推荐

