在 Coldfusion 中加密,在 Node.js 中解密

Bon*_*nza 2 encryption coldfusion aes node.js

我在 ColdFusion 中加密一个字符串

enc_string = '7001010000006aaaaaabbbbbb';
uid = encrypt(enc_string,'WTq8zYcZfaWVvMncigHqwQ==','AES','Hex'); 
// secret key for tests only
Run Code Online (Sandbox Code Playgroud)

结果:

DAEB003D7C9DBDB042C63ED214E85854EAB92A5C1EC555765B565CD8723F9655

后来我想在节点中解密那个字符串(只是一个例子)

uid='DAEB003D7C9DBDB042C63ED214E85854EAB92A5C1EC555765B565CD8723F9655'
decipher = crypto.createDecipher('aes-192-ecb', 'WTq8zYcZfaWVvMncigHqwQ==')
decipher.setAutoPadding(false);
dec = decipher.update(uid, 'hex', 'utf8')
dec += decipher.final('utf8')
Run Code Online (Sandbox Code Playgroud)

我尝试了一些密码,但没有运气。我不想修改 ColdFusion 代码以使其工作,但如果没有其他机会,我会这样做。我想通过 GET 将一些加密数据从一个站点发送到另一个站点。有什么建议吗?

编辑:我尝试了所有 AES、DES、带 IV、不带 IV、带 & 不带填充。也尝试过base64。也没有运气。

Bon*_*nza 5

使用 IV 的 ColdFusion 加密

enc_string = '7001010000006aaaaaabbbbbb';
myKey = Tobase64("abcdefghijkl1234");
myIV = charsetDecode("abcdefghijkl9876", "utf-8");
uid=encrypt(enc_string,myKey,'AES/CBC/PKCS5Padding','hex',myIV);
Run Code Online (Sandbox Code Playgroud)

加密后的 uid 值为:

614981D0BC6F19A3022FD92CD6EDD3B289214E80D74823C3279E90EBCEF75D90

现在我们把它带到节点:

var Crypto = require('crypto');

var key = new Buffer('abcdefghijkl1234');
var iv = new Buffer('abcdefghijkl9876');
var encrypted = new Buffer('614981D0BC6F19A3022FD92CD6EDD3B289214E80D74823C3279E90EBCEF75D90', 'hex');
var decipher = Crypto.createDecipheriv('aes-128-cbc', key, iv);
var decrypted = decipher.update(encrypted);
var clearText = Buffer.concat([decrypted, decipher.final()]).toString();

console.log(clearText);
Run Code Online (Sandbox Code Playgroud)

结果是:

7001010000006aaaaaabbbbbb

什么是预期的。


问题的根源

最初在 Coldfusion 我使用的是由以下生成的密钥:

GenerateSecretKey(algorithm [,keysize]);
Run Code Online (Sandbox Code Playgroud)

它生成了加密方法所需的 base64 密钥。并且没有从中产生的“秘密”。

在 Node Crypto 方法中 createDecipheriv 获取 Buffer 作为参数。缓冲区需要秘密,而不是密钥。我不确定为什么没有 IV 就不能工作。

Coldfusion需要改变什么

  1. 如果您想用 CF 以外的其他语言解密,请不要使用 GenerateSecretKey
  2. 使用 Tobase64(secret) 生成密钥
  3. 使用 IV 并使用 charsetDecode(ivSecret, "utf-8") 生成它
  4. 算法:AES/CBC/PKCS5Padding
  5. 对于 AES/ECB,请查看@Leigh 答案

在节点中,每个输入都是缓冲区。

我认为这个简短的教程也可以帮助那些在其他语言中遇到同样问题的人,比如 cf->php 或 cf->python。

  • @Bonanza - 感谢您发布更多详细信息,但第 1 项和第 2 项不太正确。请参阅[我的详细回答](http://stackoverflow.com/a/36608403/104223)。 (2认同)