在NodeJS中从ColdFusion加密中解密AES/CBC/PKCS5Padding

4

我正在将一个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时,出现错误:
TypeError [ERR_INVALID_ARG_TYPE]: The "size" argument must be of type number. Received type string ('nQw7y6QejwGFh/SNrul20Q==..)

例如,我有以下加密字符串:FB391CAAE5CD8FF47C55211ED8636D213C95F233B615D4E56CB7CD6B051D01DF356E1C45ED7AABAB5F9BCBB9EED6355B 谢谢。

1
很遗憾,您没有提供样本数据集(明文、密文和密钥),因此我无法检查任何实现。但是,由于您使用的是“CBC”模式,必须有一个iv。根据文档,“当ColdFusion自动创建IV时,它会生成一个安全的随机IV,并将其前置到加密数据中。” 您的密文的前16个字节是iv - 将此值用作iv的输入并解密其余部分。 - Michael Fehr
@MichaelFehr,非常抱歉。我刚刚更新了帖子,添加了要解密的密钥和样本数据。我不知道什么是密文或应该是什么。你能给我一个例子吗?谢谢。 - myTest532 myTest532
1个回答

3

ColdFusion的encrypt函数介绍在这里。AES/CBC需要16个字节的IV可以被显式地指定。如果没有提供IV,它将自动生成并放置在密文前面(请参阅Michael Fehr的评论)。在NodeJS中进行解密的方法如下:

const crypto = require('crypto');

const key = Buffer.from('nQw7y6QejwGFh/SNrul20Q==', 'base64');  
const ivCiphertext = Buffer.from('FB391CAAE5CD8FF47C55211ED8636D213C95F233B615D4E56CB7CD6B051D01DF356E1C45ED7AABAB5F9BCBB9EED6355B', 'hex');
const iv = ivCiphertext.slice(0, 16);
const ciphertext = ivCiphertext.slice(16);

var decrypt = (value) => {
    try {
        var decipher = crypto.createDecipheriv('AES-128-CBC', key, iv);
        var value = 
            decipher.update(value, '', 'utf8') +
            decipher.final('utf8');
        return value;
    } catch (err) {
        console.log(err);
    }
}

console.log(decrypt(ciphertext)); // 4388576099656673

结果为4388576099656673,与相应的 ColdFusion 脚本一致。可以在此处执行,例如:这里,参见示例

<cfscript>
key = 'nQw7y6QejwGFh/SNrul20Q==';
iv = BinaryDecode('FB391CAAE5CD8FF47C55211ED8636D21', 'HEX');
ciphertext = '3C95F233B615D4E56CB7CD6B051D01DF356E1C45ED7AABAB5F9BCBB9EED6355B';
plaintext = decrypt(ciphertext, key, 'AES/CBC/PKCS5Padding', 'HEX', iv);
writeOutput(plaintext);
</cfscript>

请注意,new Buffer()已被弃用。这里可以找到有关Buffer.alloc()的描述:here

太棒了!感谢您的解释。 - myTest532 myTest532

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接