@dzmitryIhnatau
Backend php developer

Почему openssl_decrypt выводит кракозябры?

Есть класс:
class Crypt
{
    private const PASSPHRASE = 'mu8VibzkUq58Z+hdqD6U/7gZhegGVZDY+1L7B+UmraA=';
    private const CIPHER = "aes-256-cbc-hmac-sha256";

    public static function encryptText($text)
    {
        if (in_array(self::CIPHER, openssl_get_cipher_methods())) {
            $encryption_key = base64_decode(self::PASSPHRASE);
            $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc-hmac-sha256'));
            $encrypted = openssl_encrypt($text, self::CIPHER, $encryption_key, 0, $iv);

            return base64_encode($encrypted . '::' . $iv);
        }
        else
            throw new Exception('Cipher ' . self::CIPHER . 'not found');
    }

    public static function decryptText($text)
    {
        if (in_array(self::CIPHER, openssl_get_cipher_methods())){
            $encryption_key = base64_decode(self::PASSPHRASE);
            list($encrypted_data, $iv) = explode('::', base64_decode($text), 2);

            return openssl_decrypt($encrypted_data, self::CIPHER, $encryption_key, 0, $iv);
        }
        else
            throw new Exception('Cipher ' . self::CIPHER . 'not found');
    }
}


Когда выполняю код Crypt::encryptText('videorecord/2023/05/14/Б6-4')
Шифр строки получается следующий: MnNWQUJGM0REc3J5cXZQa3RCWlh1OVUxSENwUnNoNC9aeHhtc2xmNkpJOD06Olxb6+rwFT+nsYRF49CAYOM=

А при дешифровке:
Crypt::decryptText('MnNWQUJGM0REc3J5cXZQa3RCWlh1OVUxSENwUnNoNC9aeHhtc2xmNkpJOD06Olxb6+rwFT+nsYRF49CAYOM=')


Выдает: vie3�)!ܚ���R�/05/14/Б6-4
Почему так происходит?
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
smilingcheater
@smilingcheater
Взял ваш класс. Выполнил код.
$original = 'videorecord/2023/05/14/Б6-4';
echo($original . '<br>');
$encrypted = Crypt::encryptText($original);
echo($encrypted . '<br>');
$decrypted = Crypt::decryptText($encrypted);
echo($decrypted . '<br>');

Увидел оригинальный текст. ЧЯДНТ?
Ищите проблему в другом месте. Например если вы передаёте зашифрованную строку в ссылке GET-параметром, то символы плюса при получении на сервере будут заменяться пробелом, что, естественно, сломает данные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы