Это 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, и проверьте пароль, снова нажав его.