首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冷加密,Node.js解密

冷加密,Node.js解密
EN

Stack Overflow用户
提问于 2016-04-07 10:38:30
回答 2查看 1.5K关注 0票数 2

我在ColdFusion中加密一个字符串

代码语言:javascript
复制
enc_string = '7001010000006aaaaaabbbbbb';
uid = encrypt(enc_string,'WTq8zYcZfaWVvMncigHqwQ==','AES','Hex'); 
// secret key for tests only

结果:

DAEB003D7C9DBDB042C63ED214E85854EAB92A5C1EC555765B565CD8723F9655

稍后,我想解密Node中的字符串(只是一个例子)。

代码语言:javascript
复制
uid='DAEB003D7C9DBDB042C63ED214E85854EAB92A5C1EC555765B565CD8723F9655'
decipher = crypto.createDecipher('aes-192-ecb', 'WTq8zYcZfaWVvMncigHqwQ==')
decipher.setAutoPadding(false);
dec = decipher.update(uid, 'hex', 'utf8')
dec += decipher.final('utf8')

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

编辑:-我尝试了所有的AES,DES,与IV,不IV,与和没有填充。也试过base64。也没有运气。

EN

回答 2

Stack Overflow用户

发布于 2016-04-13 20:00:19

接受答案的几点澄清和修正

简短回答:

  • 使用GenerateSecretKey()生成的“超低温随机”密钥,而不是用Tobase64(secret)创建密钥。
  • 虽然欧洲央行模式在技术上是可行的(见下文),但CBC模式是更安全的方法。有关CBC,请参阅我的完整示例:ColdFusion加密,Node.js解密

更长的答案:

  • 如果您想用其他语言解密,请不要使用GenerateSecretKey

不,在其他语言中使用加密函数生成的值是非常好的--只要它们遵循规范。这并不意味着在任何语言中都可以使用“原样”的值。它可能需要调整以符合X或Y语言的实现。(例如,X语言中的函数可能期望键是十六进制字符串,而不是base64。因此,您可能需要首先转换键值)。这在原始代码中没有完全发生,这就是解密不起作用的原因。

GenerateSecretKey()为指定的算法生成密码随机密钥。(虽然CF生成base64编码的密钥字符串,但它也可以很容易地被十六进制编码。键的二进制值才是最重要的。生成的密钥适用于实现相同加密算法和密钥大小的任何语言。但是,正如我在早些时候的评论中提到的,对称加密只有在所有内容匹配时才能工作。对于加密和解密,您必须使用相同的密钥、相同的算法、相同的iv等等。在原始代码中,“键”和“算法”值都是不同的。这就是解密失败的原因。

原始代码使用crypto.createCipher(algorithm, password)根据API,"password“用于派生密码密钥。换句话说,Node.js代码使用的密钥与CF代码完全不同。另外,Node.js被配置为使用一个192位键,而CF代码则使用一个128位键。

要回答你最初的问题,是的--你可以使用欧洲央行模式(尽管这是强烈反对的)。但是,它需要修改CF代码以派生出Node.js将使用的相同密码。(另一个方向是不可能的,因为它涉及单向散列。)

若要在CF中派生“密码”,请将密钥字符串解码为二进制,并生成md5哈希。然后将哈希解码为二进制,并将其重新编码为base64,以使encrypt()函数高兴。

CF:

代码语言:javascript
复制
plainText = "7001010000006aaaaaabbbbbb";
secretKey = "WTq8zYcZfaWVvMncigHqwQ==";
keyHash = hash(binaryDecode(secretKey, "base64"), "md5");
nodeJSPassword = binaryEncode(binaryDecode(keyHash, "hex"), "base64");
encryptedText = encrypt(plainText, nodeJSPassword, "AES/ECB/PKCS5Padding", "Hex"); 
writeOutput(encryptedText);

结果:

代码语言:javascript
复制
C43E1179C15CD962373A6E28486D6F4ADB12FBB6731EF99C9212474E18D51C70

在Node.js方面,修改代码以使用128位键,而不是192位键。此外,密码字符串首先被解码为二进制。在创建密码对象时,需要指示输入字符串是base64编码的,以确保正确解释它。

Node.js

代码语言:javascript
复制
var password = 'WTq8zYcZfaWVvMncigHqwQ==';
var passwordBinary = new Buffer(password, "base64");
var encrypted = 'C43E1179C15CD962373A6E28486D6F4ADB12FBB6731EF99C9212474E18D51C70'
var crypto = require('crypto');
var decipher = crypto.createDecipher('aes-128-ecb', passwordBinary );
var decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);

结果:

7001010000006aaaaabbbb

话虽如此,不建议使用欧洲央行模式。首选的方法是CBC模式(带有随机iv),这会产生较少的可预测输出,因此更安全。

  • 使用Tobase64(秘密)生成密钥

按照同样的思路,在技术上可以使用任意字符串(即"abcdefghijkl1234“)来生成密钥--不要。强加密的一个非常重要的部分是使用“真正随机且包含足够的熵”的秘密密钥。所以不要光靠自己做。使用经过验证的函数或库,比如专门为任务设计的GenerateSecretKey()。

票数 3
EN

Stack Overflow用户

发布于 2016-04-07 11:21:27

用于加密和解密的密码是不平等的。

要让Node将结果解密为预期的字符串,首先应该确保对Node中的初始字符串进行加密会给出相同的加密结果。

考虑以下内容,它会在Node中遍历所有已知的AES密码,并试图获得与Cold聚变相同的加密结果:

代码语言:javascript
复制
var crypto = require('crypto');
var key = 'WTq8zYcZfaWVvMncigHqwQ==';
var algorithm;

var ciphers = [
  'aes-128-cbc',
  'aes-128-cbc-hmac-sha1',
  'aes-128-cfb',
  'aes-128-cfb1',
  'aes-128-cfb8',
  'aes-128-ctr',
  'aes-128-ecb',
  'aes-128-gcm',
  'aes-128-ofb',
  'aes-128-xts',
  'aes-192-cbc',
  'aes-192-cfb',
  'aes-192-cfb1',
  'aes-192-cfb8',
  'aes-192-ctr',
  'aes-192-ecb',
  'aes-192-gcm',
  'aes-192-ofb',
  'aes-256-cbc',
  'aes-256-cbc-hmac-sha1',
  'aes-256-cfb',
  'aes-256-cfb1',
  'aes-256-cfb8',
  'aes-256-ctr',
  'aes-256-ecb',
  'aes-256-gcm',
  'aes-256-ofb',
  'aes-256-xts',
  'aes128',
  'aes192',
  'aes256'
]

function encrypt(text){
  var cipher = crypto.createCipher(algorithm, key);
  var crypted = cipher.update(text,'utf8','hex');
  crypted += cipher.final('hex');
  return crypted;
}

for (var i = 0; i < ciphers.length; i++) {
  algorithm = ciphers[i];
  console.log(encrypt("7001010000006aaaaaabbbbbb"));
}

如果您运行这个程序,您将得到以下输出:

代码语言:javascript
复制
ab1e8ddd6be53040fcfdf07578704ed9831c4e962eddd36899fc3819b51d6ade
ab1e8ddd6be53040fcfdf07578704ed9831c4e962eddd36899fc3819b51d6ade
ff19a0b91dad25671632581655f53139ac1f5554383951e255
e4756965c26df5b2e7e2e5291f5a2b1bc835b523ae7e39da0d
ff93cfff713798bcf94ff60fb61a6d9d4ae0a7ad6672e77a22
ff19a0b91dad25671632581655f5313940ed1d69d874cf04d7
70ef98bda47bd95e64221c144c4fdec1e5ad1422ca9f4589653214577adf9d9a
918559eaab9a983f91160dbdb2f093f55b0a2bc011fbe1b309
ff19a0b91dad25671632581655f53139cb62004d669030b400
2c4e36eb6b08107bbdf9c79c2f93160211128977181fee45ab
37fed7d50a56f42fa26805a69c38b12b519e59116702a9f0d15a437791600b3a
01f4d909c587684862ea9e27598f5d5c489028a223cc79be1a
0c482981e6aefa068b0c0429ba1e46894c39d7e7f27d114651
01c9d7545c3bfe8594ebf5aef182f5d4930db0555708057785
01f4d909c587684862ea9e27598f5d5c7aa4939a9008ea18c4
6fb304a32b676bc3ec39575e73752ad71255f7615a94ed93f78e6d367281ee41
7494a477258946d781cb53c9b37622248e0ba84a48c577c9df
01f4d909c587684862ea9e27598f5d5c889a935648f5f7061f
ea16ecf9ad13756f9bd8ad3fcff2a9e06778647d763f88e679dde519e7155cd6
ea16ecf9ad13756f9bd8ad3fcff2a9e06778647d763f88e679dde519e7155cd6
d0688b6632962acf7905ede7e4f9bd7b2d557e3b828a855208
c0119ab62e5c7a3d932042648291f7cd97c30c9b42c9fa1779
d0f72742cc0415a74e201fcc649f90cf9506eac14e24fd96a9
d0688b6632962acf7905ede7e4f9bd7b5e4921830c30ae8223
d6cd01243405e8741e4010698ab2943526f741cfdb2696b5a6d4e7c14479eccf
2592fb4b19fd100c691598c4bdb82188b6e9d6a6b308d0d627
d0688b6632962acf7905ede7e4f9bd7bf375251be38e1d1e08
d9ae0f940e7c40dcb3a620a5e2a1341819632124af5014bf2f
ab1e8ddd6be53040fcfdf07578704ed9831c4e962eddd36899fc3819b51d6ade
37fed7d50a56f42fa26805a69c38b12b519e59116702a9f0d15a437791600b3a
ea16ecf9ad13756f9bd8ad3fcff2a9e06778647d763f88e679dde519e7155cd6

您从Cold聚变中得到的加密结果是,而不是上面的输出中的

因此,使用Node中可用的AES密码器,加密结果总是与您从Coldfusion加密的结果不同。如果加密结果总是不同,则不能将其解密为相同的值。

当简单地指定"AES“时,Coldfusion加密文档并不能准确地描述使用哪种算法。我强烈建议指定要使用的精确算法,包括要使用的键大小,并在Node中选择具有相应算法的算法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36473692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档