Как получить тот же результат с Node.js и PHP-mcrypt с использованием шифрования TripleDES?

Это 3DES с использованием crypto (на основе OpenSSL) в собственном Node.js.

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 (ссылка здесь).

Ключ efd77bed61e8fdd0437df1ac

Алгоритм Tripledes, режим CBC и вывод с использованием Hexa.

вывод: d4b374b7ac8df7883ab1d58c7db0b0cc


Почему оба эти разных результата?

И как я могу получить тот же результат, используя crypto в Node.js?


person Husky    schedule 02.05.2015    source источник


Ответы (1)


В вашем коде есть несколько проблем.

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, и проверьте пароль, снова его хешируя.

person Artjom B.    schedule 02.05.2015
comment
Как мне сказать node.js использовать PKCS#5? - person majidarif; 04.05.2016
comment
@majidarif отступы PKCS # 5 и PKCS # 7 эквивалентны (на самом деле, PKCS # 5 не существует заполнение для AES). node.js по умолчанию использует PKCS # 7 - person Artjom B.; 04.05.2016