Node.js / javascript在PHP中像mcrypt_ecb一样encryptionAES-128

我有一个PHP代码,在AES-128中encryption一个IP地址:

$ip = "MY_IP"; $secret = "MY_KEY"; $ip = @mcrypt_ecb(MCRYPT_RIJNDAEL_128, $secret, $ip, MCRYPT_ENCRYPT); $encrypted = bin2hex($ip); // encrypted: 2854edb405cb7230ba1f4b87acddba8a 

我需要做的是有相同的一段代码,但使用javascript / node.js。 我已经在crypto node.js本地模块中search,但是我无法重现相同的结果:

 var crypto = require('crypto'); var ip = "MY_IP"; var secret = "MY_KEY"; var cipher = crypto.createCipher("AES-128-ECB", secret); var encrypted = cipher.update(ip, 'utf8', 'hex'); encrypted += cipher.final('hex'); // encrypted: e84c06888696edda0139e98fc2c0a8cc 

有人有一个想法吗?

我发布得太快了,find了解决办法:

 $> npm install mcrypt 

然后代码:

 var MCrypt = require('mcrypt').MCrypt; var ip = "MY_IP"; var secret = "MY_KEY" var desEcb = new MCrypt('rijndael-128', 'ecb'); desEcb.open(secret); var cipherText = desEcb.encrypt(ip); // cipherText: 2854edb405cb7230ba1f4b87acddba8a 

MCrypt的github更多的encryption工具: https : //github.com/tugrul/node-mcrypt

这里的问题是PHP的mcrypt扩展(和节点的createCipher() )在你可能不知道的背后有一些事情。

首先, createCipher()接受一个用MD5散列的密码来派生实际的密钥。 所以相反,你应该使用的是createCipheriv() ,它允许你直接传递key(和IV),就像PHP的mcrypt接受一样。 在ECB模式下,IV被忽略,所以你可以传入一个空的string作为IV参数。

其次,如果PHP的mcrypt分别小于密码的块大小和密钥大小,那么它会奇迹般地填充你的input你的密钥。

所以对于AES-128-ECB,我们需要确保input和密钥长度是16字节的倍数。 有了这些知识,我们就会发现内置crypto模块的适当代码可能如下所示:

 var crypto = require('crypto'); function makePadded(str) { var buf; var len = str.length; if (str.length % 16) len = str.length + (16 - str.length % 16); buf = new Buffer(len); buf.fill(0); buf.write(str, 0, str.length); return buf; } var ip = makePadded('MY_IP'); var secret = makePadded('MY_KEY'); var cipher = crypto.createCipheriv("AES-128-ECB", secret, ''); var encrypted = cipher.update(ip, 'binary', 'hex'); encrypted += cipher.final('hex'); // Slice off at 16 bytes to match the input length encrypted = encrypted.slice(0, 32); console.log(encrypted); 

最后值得一提的是,PHP中的MCRYPT_RIJNDAEL_128可用于执行128,192或256位encryption。 因此,在PHP中,如果0 < keylen <= 16则将使用128位encryption,如果16 < keylen <= 24 ,则使用192位encryption,如果24 < keylen <= 32则使用256位encryption。 但是在节点中,您将需要适当调整密码名称,因为节点不会执行PHP所做的那种“自动调整”。

在nodejs中 – 密码必须是“二进制”编码的string或缓冲区。 在PHP中,弃用的@mcrypt_ecb需要一个键是一个string