Как захватить TAG и IV в Openssl_encrypt в режиме PHP AES-GCM - PullRequest
0 голосов
/ 03 февраля 2020

Я знаю, что этот вопрос можно задать несколько раз и , есть также пример для захвата 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;
        }
    }
?>

1 Ответ

0 голосов
/ 03 февраля 2020

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

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

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

...