1

我有一个 Node.js API。它必须对“父”API 进行 SOAP 调用,该 API 包括通过 AES-192 (ECB) 使用密钥加密的一项。我正在尝试使用本机加密库,但我得到的值与他们期望的值不匹配。

从规范:

[字符串] 的加密是使用 AES (NIST FIPS-197) 192 位加密使用十六进制编码完成的。它使用带有 PKCS5Padding 的 ECB 反馈模式。既不使用 IV 也不使用盐腌。

坦率地说,我不得不查找大部分内容,但仍然没有帮助。除了偶尔 md5'ing 一些不需要真正安全的东西或者可能 sha'ing 一些确实安全的东西,我从来没有做过太多的加密,所以我有点卡住了。这是我目前所拥有的:

var cipher = require( 'crypto' ).createCipher( 'aes192', datasources.api.auth.encryptionKey )
cipher.update( data.encryptable )
cipher.final( 'hex' )

我已经尝试了许多输入和输出编码的变体cipher.update(),但我无法匹配他们期望的值。

任何更熟悉这些东西的人都可以为我指明正确的方向吗?在这一点上,我已经用尽了自己的知识,并离题了试错。

更新

到目前为止,我所拥有的更多信息:

var crypto  = require( 'crypto' );
var cipher  = crypto.createCipher( 'aes-192-ecb', datasources.api.auth.encryptionKey );
var crypted = cipher.update( 'DSS9676155', 'binary', 'hex' );
crypted     += cipher.final( 'hex' );

console.log( 'CRYPTED:  ' + crypted );
console.log( 'EXPECTED: 72989ABBE3D58AE582EF0EA669EDE521' );

有趣的是(?),crypted无论我发送给update()方法的输入和输出编码值的组合是什么,我都会得到相同的值(164fb25126c444031780c78d098fa877)。这似乎清楚地表明我做错了什么,但我看不到。

更新

刚刚从 API 提供者那里收到了这个。他们使用 Python 加密文本,如下所示:

import sys
import chilkat

crypt = chilkat.CkCrypt2()

password = "thisIsWhereTheKeyGoes"

crypt.put_CryptAlgorithm("aes")
crypt.put_CipherMode("ECB")
crypt.put_KeyLength(192)
crypt.SetEncodedKey(password,"base64")

crypt.put_EncodingMode("hex")
text = "The string to be encrypted"

encText = crypt.encryptStringENC(text)

print encText

我更新了我的代码如下:

var crypto    = require( 'crypto' );
var base64pwd = new Buffer( datasources.api.auth.encryptionKey ).toString( 'base64' );
var cipher    = crypto.createCipher( 'aes-192-ecb', base64pwd );
var crypted   = cipher.update( 'DSS9676155', 'utf8' );
crypted       += cipher.final( 'hex' );

console.log( 'CRYPTED:  ' + crypted );
console.log( 'EXPECTED: 72989ABBE3D58AE582EF0EA669EDE521' );

我仍然与预期的结果不同。同样,我尝试了几种输入/输出编码变体。

4

3 回答 3

0

以下代码适用于我:

var crypto  = require( 'crypto' );
var cipher  = crypto.createCipheriv('aes-256-cbc', DATA_CRYPT_KEY, DATA_CRYPT_IV);
var crypted = cipher.update(JSON.stringify(result),'utf8','hex');
crypted    += cipher.final('hex');

res.send(crypted);
于 2013-02-01T13:46:19.463 回答
0

不管它值多少钱,我从来没有让 Node.js 回扣提供者所期望的相同价值。我最终使用他们使用的相同过程编写了一个 Python 脚本,并让我的 Node 应用程序调用它。这是一个彻底的黑客,但至少它有效。

只是想对这个问题做一个包装,所以它不会永远打开。

于 2013-02-07T01:52:32.963 回答
0

crypto.createCipher()令人困惑,因为它从提供的密码中派生了密钥:

的实现使用 OpenSSL 函数crypto.createCipher() 派生密钥EVP_BytesToKey,摘要算法设置为MD5,一次迭代,没有 salt。缺少盐允许字典攻击,因为相同的密码总是创建相同的密钥。低迭代次数和非加密安全哈希算法允许非常快速地测试密码。

现在已弃用。

你应该尝试一下crypto.createCipheriv()。在 ECB 模式下,只需提供一个空缓冲区作为 IV。

var crypto  = require( 'crypto' );
var cipher  = crypto.createCipheriv( 'aes-192-ecb', encryptionKey, Buffer.alloc(0) );
var buf1 = cipher.update( Buffer.from(data) );
var buf2 = cipher.final();
var crypted = Buffer.concat([buf1, buf2]);
于 2018-09-27T20:34:45.283 回答