Задать вопрос
@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
Почему так происходит?
  • Вопрос задан
  • 82 просмотра
Подписаться 1 Средний 4 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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-параметром, то символы плюса при получении на сервере будут заменяться пробелом, что, естественно, сломает данные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽