Encryption 如何在PHP AES-GCM模式下捕获Openssl_encrypt中的标记和IV

Encryption 如何在PHP AES-GCM模式下捕获Openssl_encrypt中的标记和IV,encryption,php-openssl,Encryption,Php Openssl,我知道这个问题可能会被问多次,但当我使用它时,它不起作用 我尝试在单独的文件中使用“decrypt”函数,当我尝试使用这个函数时,我没有看到任何输出。下面的凌乱代码是我尝试用于加密/解密的方法,但是为什么我没有看到用于解密的输出? 如果有人知道答案,请帮助我。多谢各位 <?php class encryption{ private $KEY; private $cipher = "aes-256-gcm"; private $ivle

我知道这个问题可能会被问多次,但当我使用它时,它不起作用

我尝试在单独的文件中使用“decrypt”函数,当我尝试使用这个函数时,我没有看到任何输出。下面的凌乱代码是我尝试用于加密/解密的方法,但是为什么我没有看到用于解密的输出?

如果有人知道答案,请帮助我。多谢各位

<?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;
        }
    }
?>

您的方法
Iv()
覆盖为加密设置的Iv。当然,如果您使用IV as字段,那么您必须检查IV是否已经生成

但是,IV不应该是任何类中的字段,因为它对于每个加密都应该不同。通常IV是用密文发送的。在这种情况下,通常在密文前加前缀(并以标记结尾)。之后,如果需要字符串,则可以将完整的连接集编码为base 64


在解密过程中,可以将集合划分为单独的组件,因为IV大小和标记大小是应事先确定的配置选项。对于GCM,强烈建议将IV设置为96位/12字节,认证标签设置为128位/16字节。

谢谢您回答我的问题。正如你所写的,TAG没有什么特别的问题,事实上,我必须正确地使用和捕获IV?我并没有真正地看它,因为这个问题似乎已经得到了回答。IV是标签计算的一部分,因此如果不正确,标签验证将失败。这部分我是100%了解的,因为你的IV被替换了…很抱歉,在复制/粘贴代码的过程中,IV inside encrypt函数是一个错误,事实上我忘记了更新代码,所以它现在被编辑了。再次抱歉!无需抱歉,因为错误代码在解密功能中,而不是在加密功能中:
$dec_iv=base64_decode($this->iv())我试图改进我的代码,所以我改进了它,至少可以在同一个文件中看到加密和解密!在这两个函数中,我为每个函数$string、$cipher、$key和$iv使用了4个参数。我在加密或解密字符串的同一页中生成$key、$ivlen和$iv。当我在同一个文件中使用该函数时,效果非常好!但当我在单独的文件中使用解密函数时,我收到了这个错误:*base64_decode()希望参数1是字符串,如果为空**我也像在上面的代码中使用的那样对$tag进行编码和解码!先生,原因是什么?为什么抓取标签效果不好?!