@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
Почему так происходит?
  • Вопрос задан
  • 57 просмотров
Решения вопроса 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-параметром, то символы плюса при получении на сервере будут заменяться пробелом, что, естественно, сломает данные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы