Шифрование с помощью PHP; дешифрование с помощью CryptoJS

У меня возникли проблемы с расшифровкой данных с использованием CryptoJS, который был зашифрован в PHP. Может быть, кто-то может посоветовать мне, где я иду не так?

Я шифрую следующим образом:

  1. Получить хешированный пароль
  2. Возьмите подстроку (0,16) в качестве ключа
  3. Шифровать (MCRYPT_RIJNDAEL_128)
  4. Кодировать зашифрованный текст как base64

При расшифровке я делаю то же самое:

  1. Получить хешированный пароль
  2. Возьмите подстроку (0,16) в качестве ключа
  3. Base64 расшифровать зашифрованный текст
  4. расшифровывать

PHP:

public function encrypt($input, $key) {
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    $input = $this->_pkcs5_pad($input, $size);
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    $data = base64_encode($data);
    return $data;
}

JavaScript:

function decrypt(ciphertext, hashedPsw) {
        var key =  hashedPsw.substring(0, 16);

        var key = CryptoJS.enc.Hex.parse(key);

        var options = { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, keySize:128 / 32 };

        ciphertext = CryptoJS.enc.Base64.parse(ciphertext);
        var decrypted = CryptoJS.AES.decrypt(ciphertext, key);
        return decrypted;
    }

2 ответа

Решение

Я только что нашел ответ в предыдущей теме: оказывается, проблема была в кодировке ключей.

The CryptoJS decrypt Функция ожидает объект, который содержит WordArray, а не сам WordArray, поэтому вам нужно использовать:

var decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, key, options);

Вам также необходимо передать параметры decrypt функция. В противном случае CryptoJS не узнает, что вы хотели использовать режим ECB.


Безопасность

Не используйте режим ECB! Это не семантически безопасно. Вы должны по крайней мере использовать режим CBC со случайным IV. IV не должен быть секретным, поэтому вы можете просто добавить его к зашифрованному тексту.

Тогда вы должны аутентифицировать свои шифротексты. Это можно сделать с помощью аутентифицированных режимов, таких как GCM или EAX, но они не предоставляются mcrypt или CryptoJS. Следующая лучшая вещь - это использовать схему шифрования-затем-MAC, где вы используете хеш-функцию со строгим ключом, такую ​​как HMAC-SHA256, по зашифрованному тексту, чтобы злоумышленник не мог изменить шифротекст, не зная об этом.

Другие вопросы по тегам