![](/img/trans.png)
[英]Node.js `crypto.final` make the encrypted result is different to PHP `mcrypt_encrypt`
[英]Matching PHP's mcrypt_encrypt() with node.js crypto.createCipher()
我有一个接收应用程序,期望从PHP生产者获得一个如下所示的字符串:
<?php
$shared_secret = 'secret';
$data = 'whatever';
# Newline added for viewing convenience only
echo bin2hex(mcrypt_encrypt(MCRYPT_BLOWFISH, $shared_secret, $data,
MCRYPT_MODE_ECB)) . "\n";
# -> 05c3febb9970204a
?>
接收器更换起来很昂贵。
我正在使用node.js构建另一个生产者,但我无法获取JavaScript代码来产生相同的输出:
var data, encrypt, sharedSecret;
sharedSecret = 'secret';
data = 'whatever';
encrypt = function(d) {
var cipher, crypto;
crypto = require('crypto');
cipher = crypto.createCipher('bf-ecb', sharedSecret, '\0\0\0\0\0\0\0\0');
cipher.update(d);
return cipher.final('hex');
};
console.log(encrypt(data));
// -> 35c9801f2afca332
我选择了'bf-ecb'
密码,因为我认为这是ECB模式下的河豚。 我提供了8个空字节作为IV,因为mcrypt_encrypt的PHP文档说如果忽略IV,它将使用所有空字节,并且mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)
回答8。我选择了'hex'
因为我认为它提供了与PHP'2 bin2hex()
相同的表示形式。
我应该如何处理我的JavaScript代码以匹配PHP代码的输出?
我的代码只有四个问题:
mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)
,它报告8而不是说“你是个傻瓜”。 crypto.createCipheriv()
,它使用给定的密钥。 crypto.createCipher()
使用给定密钥的派生(我认为是md5)。 update()
的返回值。 因此,有效的解决方案是:
var data, encrypt, sharedSecret;
sharedSecret = 'secret';
data = 'whatever';
encrypt = function(d) {
var cipher, crypto;
crypto = require('crypto');
cipher = crypto.createCipheriv('bf-ecb', sharedSecret, '');
return cipher.update(d, 'utf8', 'hex') + cipher.final('hex');
};
console.log(encrypt(data));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.