编程语言
首页 > 编程语言> > javascript-在node.js中重新创建MCRYPT_RIJNDAEL_128

javascript-在node.js中重新创建MCRYPT_RIJNDAEL_128

作者:互联网

尝试在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的结果不同.任何想法如何使它的行为完全类似于php版本?

解决方法:

互相玩两个构造较差的库可能很有趣.除了完成所有工作之外,我将根据您的要求为您提供帮助:

> PHP不会删除密钥字节,而是使用零填充将其扩展为下一个可用的密钥大小-在您的情况下为192位或24个字节;为此,您需要指定aes-192-ecb作为算法(您需要继续使用MCRYPT_RIJNDAEL_128,但要替换为PHP中的128是块大小而不是密钥大小)
>填充不正确,PHP填充0..15零字节而不是1..16字节
>您不能使用第2个参数createCipher,因为第二个参数是密码.如果您使用node.js进行密钥派生,则需要使用三个参数createCipher并提供任何16字节IV

PHP中的IV代码只对不必要的随机数生成器征税,不使用IV.

代码做填充

var padSize = 16 - ((len + 16 - 1) % 16 + 1);
for (var i = 0; i < padSize; i++) {  // pad 0 .. 15 until to multiple of block size 
    text += '\0';
}

或者您可以使用自己的填充方法,除非len%16 == 0.

标签:mcrypt,node-js,aes,javascript,php
来源: https://codeday.me/bug/20191028/1955286.html