Encryption 如何在PHP AES-GCM模式下捕获Openssl_encrypt中的标记和IV
我知道这个问题可能会被问多次,但当我使用它时,它不起作用 我尝试在单独的文件中使用“decrypt”函数,当我尝试使用这个函数时,我没有看到任何输出。下面的凌乱代码是我尝试用于加密/解密的方法,但是为什么我没有看到用于解密的输出? 如果有人知道答案,请帮助我。多谢各位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
<?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进行编码和解码!先生,原因是什么?为什么抓取标签效果不好?!