最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

在node.js中重新创建MCRYPT

IT培训 admin 9浏览 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

在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

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论