我有一个在AES-128中加密ip地址的PHP代码:
$ip = "MY_IP";
$secret = "MY_KEY";
$ip = @mcrypt_ecb(MCRYPT_RIJNDAEL_128, $secret, $ip, MCRYPT_ENCRYPT);
$encrypted = bin2hex($ip); // encrypted: 2854edb405cb7230ba1f4b87acddba8a我需要做的是拥有相同的代码,但使用javascript/node.js。我在加密node.js本机模块中搜索过,但无法复制相同的结果:
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有人有主意吗?
发布于 2015-07-17 14:58:16
我贴得太快了,找到了解决办法:
$> 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: 2854edb405cb7230ba1f4b87acddba8aMCrypt github获取更多加密工具:https://github.com/tugrul/node-mcrypt
发布于 2015-07-17 15:27:41
这里的问题是,PHP的mcrypt扩展(和节点的createCipher())在幕后做了一些您可能不知道的事情。
首先,createCipher()接受一个使用MD5进行散列的“密码”来派生实际的密钥。因此,您应该使用的是createCipheriv(),它允许直接传递密钥(和IV),就像PHP所接受的那样。在欧洲央行模式下,IVs被忽略,因此您只需为IV参数传入一个空字符串。
其次,如果输入和密钥小于密码的块大小和密钥大小,PHP的mcrypt将神奇地将输入和密钥同时填充为空字节。
所以对于AES-128-ECB,我们需要确保输入和密钥长度是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位加密。因此,在PHP中,如果使用0 < keylen <= 16,则使用128位加密;如果使用16 < keylen <= 24,则使用192位加密;如果使用24 < keylen <= 32,则使用256位加密。但是,在节点中,您需要适当地调整密码名,因为节点不像PHP那样进行“自动调整”。
发布于 2015-07-17 14:51:26
在nodejs中,密码必须是“二进制”编码的字符串或缓冲区。在PHP中,不推荐的@mcrypt_ecb期望一个键是一个字符串。
https://stackoverflow.com/questions/31478341
复制相似问题