【问题标题】:How to get the same result with Node.js and PHP-mcrypt using TripleDES encryption?如何使用 TripleDES 加密与 Node.js 和 PHP-mcrypt 获得相同的结果?
【发布时间】:2015-07-12 01:42:01
【问题描述】:

这是在原生 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);

输出为:af4ee52e0227fe40ab2e7ddd72fb1137


但是我使用了在线PHP-mcrypt加密工具(link here)。

密钥是efd77bed61e8fdd0437df1ac

算法为Tripledes,模式为CBC,输出使用Hexa

输出为:d4b374b7ac8df7883ab1d58c7db0b0cc


为什么这两个结果不同?

如何在 Node.js 中使用 crypto 获得相同的结果?

【问题讨论】:

    标签: php node.js encryption openssl mcrypt


    【解决方案1】:

    您的代码存在多个问题。

    • crypto.createCipher(algorithm, password) 使用密码而不是密钥。实际密钥将从该密码派生。看来你想使用密钥而不是密码,所以你需要使用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("\0\0\0\0\0\0\0\0");
    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 = '\0\0\0\0\0\0\0\0';
    $key = 'efd77bed61e8fdd0437df1ac';
    
    $ct = mcrypt_encrypt(MCRYPT_3DES, $key, $pt, MCRYPT_MODE_CBC, $iv);
    
    echo bin2hex($ct);
    

    输出:

    4e91635045f42185831403057ef16749
    

    您似乎想加密密码。永远不应加密密码。使用良好的哈希解决方案,如 PBKDF2、bcrypt 或 scrypt,并通过再次哈希验证密码。

    【讨论】:

    猜你喜欢
    • 2014-07-07
    • 2014-02-01
    • 2015-01-23
    • 2019-10-03
    • 2011-01-28
    • 2013-12-24
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多