Как захватить TAG и IV в Openssl_encrypt в режиме PHP AES-GCM

Я знаю, что этот вопрос может быть задан несколько раз и также есть пример для захвата IV и TAG перед расшифровкой, но когда я его использую, он не работает!

Я пытаюсь использовать функцию «расшифровать» в отдельном файле, и когда я пытаюсь использовать эту функцию, я не вижу результата. Ниже беспорядочный код представляет собой метод, который я пытаюсь использовать для шифрования/дешифрования, но почему я не вижу выходных данных для дешифрования?

Если кто-нибудь знает ответ, пожалуйста, помогите мне. Большое спасибо.

<?php
    class encryption{
        private $KEY;
        private $cipher = "aes-256-gcm";
        private $ivlen;
        private $IV;
        private $options;
        private $tag;
        private $output = "";

        private function Key(){
            $this->KEY = openssl_random_pseudo_bytes (16);
            return $this->KEY;
        }

        private function Iv(){
            $this->IV = openssl_random_pseudo_bytes (16);
            $this->IV = base64_encode($this->IV);
            return $this->IV;
        }

        public function encrypt($string){
            $ivlen = openssl_cipher_iv_length($this->cipher);
            if (in_array($this->cipher, openssl_get_cipher_methods())){
                $this->output = openssl_encrypt($string, $this->cipher, $this->Key(), $options=0, $this->Iv(), $this->tag);
                $this->tag = base64_encode($this->tag);
            }
            return $this->output;
        }

        public function decrypt($string){
            $this->tag = base64_decode($this->tag);
            $dec_iv = base64_decode($this->Iv());
            if (in_array($this->cipher, openssl_get_cipher_methods())){
                $this->output = openssl_decrypt($string, $this->cipher, $this->Key(), $options=0, $dec_iv, $this->tag);
            }
            return $this->output;
        }
    }
?>

person Johnny Deep    schedule 03.02.2020    source источник


Ответы (1)


Ваш метод Iv() перезаписывает IV, который вы установили для шифрования. Если вы используете поле IV как, вам, конечно, придется проверить, был ли уже сгенерирован IV.

Однако IV никогда не должен быть полем ни в одном классе, так как он должен различаться для каждого шифрования. Обычно IV отправляется с зашифрованным текстом. В этом случае его обычно добавляют к зашифрованному тексту (и заканчивают тегом). После этого можно закодировать полный конкатенированный набор с основанием 64, если требуется строка.

Во время расшифровки набор может быть разделен на отдельные компоненты, поскольку размер IV и размер тега являются параметрами конфигурации, которые должны быть установлены заранее. Для GCM настоятельно рекомендуется оставить их на уровне 96 бит/12 байт для IV и 128 бит/16 байт для тега аутентификации.

person Maarten Bodewes    schedule 03.02.2020
comment
Спасибо, что ответили на мой вопрос. Итак, как вы написали, нет особой проблемы с TAG, на самом деле я должен использовать и захватывать IV соответствующим образом? - person Johnny Deep; 04.02.2020
comment
Я действительно не смотрел на это, так как вопрос, кажется, был дан ответ. IV является частью расчета тега, поэтому, если он неверен, проверка тега завершается ошибкой. В этой части я на 100% уверен, и так как тебе заменили капельницу... - person Maarten Bodewes; 04.02.2020
comment
Извините, что IV внутри функции шифрования была ошибкой во время копирования/вставки кодов, на самом деле я забыл обновить код, поэтому он сейчас редактируется. Снова простите! - person Johnny Deep; 04.02.2020
comment
Не нужно сожалеть, так как ошибочный код находится в функции расшифровки, а не в функции шифрования: $dec_iv = base64_decode($this->Iv()); - person Maarten Bodewes; 04.02.2020
comment
Я пытался улучшить свои коды, поэтому я улучшил их, чтобы хотя бы видеть шифрование и дешифрование в одном файле! в обеих функциях я использовал 4 параметра для каждой функции $string, $cipher, $key и $iv. Я генерирую $key, $ivlen и $iv на той же странице, на которой шифрую или расшифровываю строки. когда я использую функцию в том же файле, она отлично работает! но когда я использую функцию расшифровки в отдельном файле, я получаю эту ошибку: ** base64_decode() ожидает, что параметр 1 будет строкой, заданной null ** Я также кодирую и декодирую $tag, как я использовал в приведенном выше коде! Что такое разум, сэр? почему захват тега не работает?! - person Johnny Deep; 04.02.2020