使用Node.js进行AES192加密

使用Node.js进行AES192加密,node.js,encryption,Node.js,Encryption,我有一个Node.js API。它必须对父API进行SOAP调用,该父API包含一个通过AES-192 ECB使用密钥加密的项。我正在尝试使用本机加密库,但得到的值与他们期望的值不匹配 根据规范: [string]的加密使用AES NIST FIPS-197 192位加密,使用十六进制编码。它使用带有PKCS5P的ECB反馈模式。既不使用IV,也不使用盐渍 坦白地说,我不得不查找大部分信息,但仍然没有帮助。除了偶尔md5'ing一些不需要真正安全的东西或者sha'ing一些确实安全的东西之外,我

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

根据规范:

[string]的加密使用AES NIST FIPS-197 192位加密,使用十六进制编码。它使用带有PKCS5P的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' );
有趣的是,无论我发送给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' );
我已将代码更新如下:

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' );

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

以下代码适合我:

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);

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

只是想在这个问题上添加一个包装,这样它就不会永远打开。

令人困惑,因为它从提供的密码派生出密钥:

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

它现在已被弃用

你应该试一试。在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]);

这似乎包括不属于规范一部分的IV。我读错了吗?我确实尝试了aes-192-ebc作为算法,但它吐出了一个未知的算法错误。是的,我刚刚发布了一段我在生产中使用的代码-它使用了带IV的ads-256。除了算法之外,我看到的唯一区别是加密结果没有保存在任何地方,是吗?不,我没有保存结果。我只是在那一刻把它吃掉。我的部分问题是我输入了算法-ebc而不是-ecb。我已经修好了,现在继续当兵。我还没有尝试过你的in/output编码。我已经更新了我的问题,使我的代码看起来更像你的代码,并提供了一些关于我在尝试对update方法进行in/output编码的每个置换后看到的内容的附加细节。我很欣赏这组额外的眼球。如果运行以下命令echo-n DSS9676155 | openssl enc-aes-192-ecb-pass:mykey-nosalt,它将返回与使用“binary”参数生成cipher.final非常相同的结果。但是,如果将“binary”替换为“hex”,结果将与在openssl命令之后执行十六进制摘要不同。。。