прерывистая ошибка openssl_decrypt (IV ровно из 16 байт)

#php #encryption #openssl

#php #шифрование #openssl

Вопрос:

Я получаю следующую ошибку при расшифровке определенных данных.

openssl_decrypt(): переданный IV имеет длину всего 12 байт, cipher ожидает IV ровно из 16 байт

Я также вижу предупреждение: hash_equals(): Ожидается, что known_strin& будет строкой с заданным логическим значением.. возможно, какие-то поврежденные данные.

Недавно я расшифровал из mcrypt и повторно зашифровал с помощью openssl (этот код). Я вижу, что я должен передавать OPENSSL_RAW_DATA

вот мой класс:

     class AES{

        function __construct() {
            $this-&&t;aes_256_cbc = 'aes-256-cbc';     
        }

        function __destruct() {}    
        
        function encrypt($data,$passphrase){
            $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_len&th($this-&&t;aes_256_cbc));
            $dataEncrRaw = openssl_encrypt($data, $this-&&t;aes_256_cbc, $passphrase, 0, $iv);
            $hmac = hash_hmac('sha256', $dataEncrRaw, $passphrase, $as_binary=true);        
            return base64_encode( $iv.$hmac.$dataEncrRaw );
        }

        function decrypt($dataEncr,$passphrase){
            $data = '';
            $dataEncr = base64_decode($dataEncr);
            $ivlen = openssl_cipher_iv_len&th($cipher=$this-&&t;aes_256_cbc);

            $iv=substr($dataEncr,0,$ivlen);
            $hmac = substr($dataEncr, $ivlen, $sha2len=32);             
            $dataEncrRaw=substr($dataEncr,$ivlen $sha2len);
                                    
            $dataPlainText = openssl_decrypt($dataEncrRaw, $this-&&t;aes_256_cbc, $passphrase, 0, $iv);
            $calcmac = hash_hmac('sha256', $dataEncrRaw, $passphrase, $as_binary=true);
            if (hash_equals($hmac, $calcmac)){
                $data=$dataPlainText;
            }           
            return $data;
        }
    }
  

Спасибо,
Нарисовал

Комментарии:

1. Мне кажется, что это возможно только в том случае, если результат декодирования base 64 имеет размер всего 12 байт.

2. Кстати, возвращать зашифрованный текст вместо открытого при сбое MAC — ужасная идея.

3. Да, у вас есть хороший момент с возвратом в случае сбоя MAC. Исправлено.

4. Я запустил ваш код, и у меня все отлично сработало (шифрование и дешифрование с помощью openssl) — так в чем же ваша проблема? Если проблема иногда возникает при расшифровке, когда зашифрованный текст поступает из mcrypt, то ваши исходные данные (= iv) имеют длину всего 12 байт.