Node.js 从ColdFusion encrypt解密节点中添加的AES/CBC/PKCS5P

Node.js 从ColdFusion encrypt解密节点中添加的AES/CBC/PKCS5P,node.js,encryption,coldfusion,Node.js,Encryption,Coldfusion,我正在将nodeJS应用程序与ColdFusion应用程序合并。我在ColdFusion中使用下面的方法进行加密,其中key是加密密钥字符串 key = 'nQw7y6QejwGFh/SNrul20Q==' encrypt(value, key, "AES/CBC/PKCS5Padding", "HEX"); 然后,在NodeJS中,我尝试使用密码解密它 const crypto = require('crypto'); const key = &qu

我正在将nodeJS应用程序与ColdFusion应用程序合并。我在ColdFusion中使用下面的方法进行加密,其中key是加密密钥字符串

key = 'nQw7y6QejwGFh/SNrul20Q=='
encrypt(value, key, "AES/CBC/PKCS5Padding", "HEX");
然后,在NodeJS中,我尝试使用密码解密它

const crypto = require('crypto');

const key = "nQw7y6QejwGFh/SNrul20Q=="; 
const binaryEncryptionKey = new Buffer( key, "base64" );

decrypt = (value) => {
        try {
            var decipher = crypto.createDecipheriv( "AES-128-CBC", binaryEncryptionKey );
            var value = (
                decipher.update( value, "base64", "utf8" ) +
                decipher.final( "utf8" )
            );
            return value;
        } catch (err) {
            console.log(err);
        }
}
它首先返回缓冲区的警告:

DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
然后,我得到了一个错误:

TypeError [ERR_INVALID_ARG_TYPE]: The "iv" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received undefined
我没有“iv”,因为ColdFusion端没有使用它进行加密。可以在NodeJS中解密它吗

  • 当我更改为Buffer.alloc时,会出现以下错误:
例如,我有以下加密字符串:
FB391CAAE5CD8FF47C55211ED8636D213C95F233B615D4E56CB7CD6B051DF356E1C45ED7AABAB5F9BCBB9EED6355B


谢谢

介绍了ColdFusion
加密
功能。可以明确指定AES/CBC所需的16字节IV。如果没有给出IV,它将自动生成并放置在密文前面(参见Michael Fehr的评论)。NodeJS中的解密可以按如下方式进行:

const crypto=require('crypto');
const key=Buffer.from('nQw7y6QejwGFh/SNrul20Q==','base64');
const ivCiphertext=Buffer.from('FB391CAAE5CD8FF47C55211ED8636D213C95F233B615D4E56CB7CD6B051DF356E1C45ED7AABAB5F9BCBB9EED6355B','hex');
常数iv=iv密文切片(0,16);
常量密文=ivCiphertext.slice(16);
var decrypt=(值)=>{
试一试{
var decipher=crypto.createDecipheriv('AES-128-CBC',密钥,iv);
var值=
解密.更新(值','utf8')+
最终破译('utf8');
返回值;
}捕捉(错误){
控制台日志(err);
}
}
console.log(解密(密文));//4388576099656673
结果
4388576099656673
,与相应的ColdFusion脚本一致,该脚本可以执行,例如s。示例:


键='nQw7y6QejwGFh/SNrul20Q=';
iv=二进制解码('FB391CAAE5CD8FF47C55211ED8636D21','HEX');
密文='3C95F233B615D4E56CB7CD6B051DF356E1C45ED7AABAB5F9BCBB9EED6355B';
明文=解密(密文,密钥,'AES/CBC/PKCS5P','HEX',iv);
写输出(纯文本);

请注意,这是不推荐的。可以找到
Buffer.alloc()
的描述。

不幸的是,您没有给我们一个样本数据集(明文、密文和密钥),因此我无法检查任何实现,但由于您使用“CBC”作为模式,因此必须有一个iv。根据文档“当ColdFusion自动创建一个IV时,它会生成一个安全、随机的IV,并将其添加到加密数据之前。“密文的前16个字节是iv-使用这个值作为iv的输入,然后解密其余的。@MichaelFehr,对此很抱歉。”。我刚刚更新了帖子,添加了要解密的密钥和样本数据。我不知道什么是密文,什么应该是密文。你能给我举个例子吗?谢谢!谢谢你的解释
TypeError [ERR_INVALID_ARG_TYPE]: The "size" argument must be of type number. Received type string ('nQw7y6QejwGFh/SNrul20Q==..)
<cfscript>
key = 'nQw7y6QejwGFh/SNrul20Q==';
iv = BinaryDecode('FB391CAAE5CD8FF47C55211ED8636D21', 'HEX');
ciphertext = '3C95F233B615D4E56CB7CD6B051D01DF356E1C45ED7AABAB5F9BCBB9EED6355B';
plaintext = decrypt(ciphertext, key, 'AES/CBC/PKCS5Padding', 'HEX', iv);
writeOutput(plaintext);
</cfscript>