如何使用 Node.js 和 PHP-mcrypt 使用 TripleDES 加密获得相同的结果?
How to get the same result with Node.js and PHP-mcrypt using TripleDES encryption?
这是在原生 Node.js.
中使用 crypto
(基于 OpenSSL)的 3DES
var secretKey = "efd77bed61e8fdd0437df1ac";
var enchding = 'hex';
var text = 'This is test.';
var cipher = modules.crypto.createCipher('des-ede3-cbc', secretKey);
var cryptedPassword = cipher.update(text, 'utf8', enchding) + cipher.final(enchding);
output is : af4ee52e0227fe40ab2e7ddd72fb1137
但是我在线使用了PHP-mcrypt加密工具(link here)。
关键是efd77bed61e8fdd0437df1ac
算法为Tripledes
,模式为CBC
,输出使用Hexa
.
output is : d4b374b7ac8df7883ab1d58c7db0b0cc
为什么这两个是不同的结果?
如何在 Node.js 中使用 crypto
获得相同的结果?
您的代码存在多个问题。
crypto.createCipher(algorithm, password)
uses a password not a key. The actual key will be derived from that password. It seems that you want to use a key instead of a password, so you need to use crypto.createCipheriv(algorithm, key, iv)
.
PHP 的 mcrypt 模块仅应用零填充,而 node.js' 的加密模块仅应用 PKCS#5/PKCS#7 填充。您应该在 PHP 中使用 PKCS#7 填充,如 here 所示。 (在示例代码中使用)
您必须在 node.js 和 PHP 中使用相同的 IV。通常会生成一个随机 IV 并将其添加到密文中。在解密过程中,它必须被切掉并使用。 (不包含在示例代码中)
node.js
var crypto = require('crypto');
var secretKey = new Buffer("efd77bed61e8fdd0437df1ac", "utf8");
var iv = new Buffer("[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
var enchding = 'hex';
var text = 'This is test.';
var cipher = crypto.createCipheriv('des-ede3-cbc', secretKey, iv);
var cryptedPassword = cipher.update(text, 'utf8', enchding) + cipher.final(enchding);
console.log(cryptedPassword);
输出:
4e91635045f42185831403057ef16749
PHP
function pkcs7pad($plaintext, $blocksize)
{
$padsize = $blocksize - (strlen($plaintext) % $blocksize);
return $plaintext . str_repeat(chr($padsize), $padsize);
}
$pt = pkcs7pad('This is test.', 8);
$iv = '[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]';
$key = 'efd77bed61e8fdd0437df1ac';
$ct = mcrypt_encrypt(MCRYPT_3DES, $key, $pt, MCRYPT_MODE_CBC, $iv);
echo bin2hex($ct);
输出:
4e91635045f42185831403057ef16749
您似乎想加密密码。永远不要加密密码。使用良好的散列解决方案,如 PBKDF2、bcrypt 或 scrypt,并通过再次散列来验证密码。
这是在原生 Node.js.
中使用crypto
(基于 OpenSSL)的 3DES
var secretKey = "efd77bed61e8fdd0437df1ac";
var enchding = 'hex';
var text = 'This is test.';
var cipher = modules.crypto.createCipher('des-ede3-cbc', secretKey);
var cryptedPassword = cipher.update(text, 'utf8', enchding) + cipher.final(enchding);
output is : af4ee52e0227fe40ab2e7ddd72fb1137
但是我在线使用了PHP-mcrypt加密工具(link here)。
关键是efd77bed61e8fdd0437df1ac
算法为Tripledes
,模式为CBC
,输出使用Hexa
.
output is : d4b374b7ac8df7883ab1d58c7db0b0cc
为什么这两个是不同的结果?
如何在 Node.js 中使用 crypto
获得相同的结果?
您的代码存在多个问题。
crypto.createCipher(algorithm, password)
uses a password not a key. The actual key will be derived from that password. It seems that you want to use a key instead of a password, so you need to usecrypto.createCipheriv(algorithm, key, iv)
.PHP 的 mcrypt 模块仅应用零填充,而 node.js' 的加密模块仅应用 PKCS#5/PKCS#7 填充。您应该在 PHP 中使用 PKCS#7 填充,如 here 所示。 (在示例代码中使用)
您必须在 node.js 和 PHP 中使用相同的 IV。通常会生成一个随机 IV 并将其添加到密文中。在解密过程中,它必须被切掉并使用。 (不包含在示例代码中)
node.js
var crypto = require('crypto');
var secretKey = new Buffer("efd77bed61e8fdd0437df1ac", "utf8");
var iv = new Buffer("[=10=][=10=][=10=][=10=][=10=][=10=][=10=][=10=]");
var enchding = 'hex';
var text = 'This is test.';
var cipher = crypto.createCipheriv('des-ede3-cbc', secretKey, iv);
var cryptedPassword = cipher.update(text, 'utf8', enchding) + cipher.final(enchding);
console.log(cryptedPassword);
输出:
4e91635045f42185831403057ef16749
PHP
function pkcs7pad($plaintext, $blocksize)
{
$padsize = $blocksize - (strlen($plaintext) % $blocksize);
return $plaintext . str_repeat(chr($padsize), $padsize);
}
$pt = pkcs7pad('This is test.', 8);
$iv = '[=12=][=12=][=12=][=12=][=12=][=12=][=12=][=12=]';
$key = 'efd77bed61e8fdd0437df1ac';
$ct = mcrypt_encrypt(MCRYPT_3DES, $key, $pt, MCRYPT_MODE_CBC, $iv);
echo bin2hex($ct);
输出:
4e91635045f42185831403057ef16749
您似乎想加密密码。永远不要加密密码。使用良好的散列解决方案,如 PBKDF2、bcrypt 或 scrypt,并通过再次散列来验证密码。