【发布时间】:2015-02-27 03:55:47
【问题描述】:
尝试在 node.js 中重新创建以下 php 加密代码:
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($size, MCRYPT_RAND);
$msg = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 'MY_KEY_LONG_STRING', 'PLAINTEXT', MCRYPT_MODE_ECB, $iv));
试过这个:
var text = 'PLAINTEXT';
var len = text.length;
for (var i = 0; i < 16 - len % 16; i++) { // pad to multiple of block size
text += '\0';
}
var key = 'MY_KEY_LONG_STRING';
key = key.substr(0, 16); // trim to expected key size for aes128
var cipher = crypto.createCipher('aes-128-ecb', key);
cipher.setAutoPadding(false); // did our own padding, to match mcrypt_encrypt
var encrypted = cipher.update(text, 'utf8', 'base64');
encrypted += cipher.final('base64');
从 php 中得到不同的结果...
还尝试使用 IV 创建密码(甚至不应该在 aes-128-ecb 中使用):
var cipher = crypto.createCipheriv('aes-128-ecb', key, '');
另外,与 php.ini 的结果不同。任何想法如何使它的行为与 php 版本完全一样?
【问题讨论】:
-
ECB 不能使用 IV,所以可以压缩你的 php 代码:
$msg = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 'MY_KEY_LONG_STRING', 'PLAINTEXT', MCRYPT_MODE_ECB));
标签: javascript php node.js aes mcrypt