CryptoJS шифрует AES парольной фразой, но для расшифровки PHP нужен ключ

Я использую CryptoJS для шифрования строки:

  function doHash(msg){
    msg = String(msg);
    var passphrase = 'aggourakia';
    var hash = CryptoJS.AES.encrypt(msg, passphrase);
    var ciphertext=  hash.ciphertext.toString(); //return ciphertext instead of object
    return ciphertext;      
}

Насколько я понимаю, CryptoJS использует кодовую фразу для генерации ключа , который затем используется для шифрования данных.

Однако я хотел бы расшифровать шифр с помощью функции PHP или, возможно, онлайн-инструмента, такого как этот: http://aesencryption.net/

Проблема в том, что они ожидают ключ, а не кодовую фразу.

Как я могу напрямую предоставить ключ CryptoJS AES, который я могу использовать на стороне сервера или в любом онлайн-инструменте для расшифровки?

Дело в том, что мне уже очень трудно найти функции PHP для расшифровки шифров AES, и эта парольная фраза / ключ добавляет сложности


person nicholaswmin    schedule 21.10.2014    source источник
comment
Готов поспорить, что кодовая фраза используется для получения ключа через PBKDF2.   -  person Narf    schedule 21.10.2014
comment
@Narf Сколько вы готовы поставить?   -  person Maarten Bodewes    schedule 22.10.2014
comment
@owlstead Хе-хе, это всего лишь предположение.   -  person Narf    schedule 22.10.2014
comment
@Narf Похоже, кто-то не хотел ставка :)   -  person Maarten Bodewes    schedule 22.10.2014


Ответы (1)


Если вы хотите предоставить ключ напрямую, вам также следует указать IV. IV (вектор инициализации) необходим, чтобы его можно было выполнить XOR с 1-м блоком сообщения. Затем зашифрованный текст первого блока подвергается операции XOR со вторым блоком сообщения и так далее. Это называется цепочкой блоков шифров (CBC).

var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');

var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });

Это из документов CryptoJS https://code.google.com/p/crypto-js/#Custom_Key_and_IV

Вы можете генерировать ключи и IV с помощью PBKDF2, как написал @Narf. https://code.google.com/p/crypto-js/#PBKDF2

О PHP: mcrypt имеет шифр MCRYPT_RIJNDAEL_128, который является AES 128. MCRYPT_RIJNDAEL_192 и MCRYPT_RIJNDAEL_256 не являются совместим с AES 192 и AES 256, поскольку AES использует 128-битный блок со всеми размерами ключей. Rijndael's имеет настраиваемый размер блока. CryptoJS будет использовать 128-битный AES, если вы предоставите 128-битный ключ, он будет использовать 256-битный, если вы используете функцию, которая принимает парольную фразу.

person Dmitry    schedule 21.10.2014
comment
Если вы спросите меня, mcrypt устарел, но не устарел :( У меня есть письмо от разработчика, который хочет создать новую версию базовой библиотеки C, но это будет первая версия за многие годы - в настоящее время она не поддерживается (так что если есть баги или уязвимости, их никто не исправит). - person Maarten Bodewes; 22.10.2014
comment
Основная мысль о том, что вы должны предоставить IV для использования функции encrypt, использующей ключ, верна, поэтому я исправил ошибки, которые мог найти. Просмотрите изменения и примите к сведению. - person Maarten Bodewes; 22.10.2014
comment
Нужно ли мне также использовать IV в функции PHP? Я еще не создал PHP-сервер, поэтому я использую этот инструмент, чтобы посмотреть, будет ли он работать в mCrypt - tools4noobs.com/online_tools/decrypt - на самом деле это инструмент mCrypt. К сожалению, все, что я вижу, это то, что мне нужно ввести здесь зашифрованный текст и ключ для расшифровки. Я копирую ключ, который вы указали в своем примере, и выведенный зашифрованный текст из вашего примера, но, похоже, он выдыхает тарабарщину - person nicholaswmin; 22.10.2014
comment
@NicholasKyriakides, да, вам тоже нужен IV для PHP. - person Dmitry; 22.10.2014