在node.js中重新创建MCRYPT
试图在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
。
在node.js中重新创建MCRYPT
试图在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
。