2015-05-02 12 views
2

Это 3DES, используя crypto (база на OpenSSL) в native Node.js.Как получить тот же результат с помощью Node.js и PHP-mcrypt с использованием шифрования TripleDES?

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


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

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

ответ

3

С кодом возникает несколько проблем.

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

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

  • Вы должны использовать тот же IV в обоих node.js и 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 

РНР

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

+0

Как сказать 'node.js' использовать 'PKCS # 5'? – majidarif

+1

@majidarif [PKCS # 5 и PKCS # 7 paddings эквивалентны] (http://crypto.stackexchange.com/a/9044/13022) (на самом деле, нет такой вещи, как PKCS # 5 padding для AES). node.js использует PKCS # 7 по умолчанию –

 Смежные вопросы

  • Нет связанных вопросов^_^