我有一个 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' );
我仍然与预期的结果不同。同样,我尝试了几种输入/输出编码变体。