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

Это 3DES, использующий crypto (база на OpenSSL) в native 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?

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

  • crypto.createCipher(algorithm, password) использует пароль, а не ключ. Фактический ключ будет получен из этого пароля. Кажется, что вы хотите использовать ключ вместо пароля, поэтому вам нужно использовать crypto.createCipheriv(algorithm, key, iv) .

  • Модуль mcrypt PHP применяет только нулевое заполнение, но криптографический модуль node.js применяет только дополнение PKCS # 5 / PKCS # 7. Вы должны использовать дополнение PKCS # 7 на PHP, как показано здесь . (используется в примере кода)

  • Вы должны использовать тот же IV как в узлах, так и в PHP. Обычно случайный 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, и проверьте пароль, снова нажав его.