Php openssl_decrypt始终返回false

Php openssl_decrypt始终返回false,php,encryption,encryption-symmetric,php-openssl,aes-gcm,Php,Encryption,Encryption Symmetric,Php Openssl,Aes Gcm,我试图将加密从mcrypt迁移到openssl,但解密一直失败。下面的代码显示了我的加密功能。我将var_dump放在加密函数中,以验证使用相同变量的解密是否有效,但事实并非如此 我尝试对代码进行以下更改,但均无效: base64\u解码($encrypted) 出于好奇base64\u编码($encrypted) 所有这些变量的选项设置为:0(默认值)、OPENSSL_原始数据、OPENSSL_零填充 PHP版本是7.0.5-1+deb.sury.org~trusty+1 OpenSSL

我试图将加密从mcrypt迁移到openssl,但解密一直失败。下面的代码显示了我的加密功能。我将var_dump放在加密函数中,以验证使用相同变量的解密是否有效,但事实并非如此

我尝试对代码进行以下更改,但均无效:

  • base64\u解码($encrypted)
  • 出于好奇
    base64\u编码($encrypted)
  • 所有这些变量的选项设置为:0(默认值)、OPENSSL_原始数据、OPENSSL_零填充

PHP版本是7.0.5-1+deb.sury.org~trusty+1

OpenSSL版本为OpenSSL 1.0.2g,2016年3月1日


为什么让openssl_解密返回false?我成功地用上面这一行中的相同变量进行了加密。

由于不支持AEAD,它对PHP<7.1不起作用

您可以使用(PHP5.4+和7.0+)

根据您的环境,它将测试并使用以下方法:

  • PHP7.1上的OpenSSL
  • ,
  • 一个纯PHP实现

请注意,与其他方法相比,纯PHP方法的速度非常慢。

我认为这在PHP7.1之前是不起作用的,因为身份验证标签有一个bug。似乎是正确的。没有一个GCM密码工作正常。我在这个场景中使用7.1,但在所有场景中仍然返回false。
function encryptString($data){  
    $key = "1A534";

    do{
        $iv = random_bytes(100);
    }while(strpos($iv,"|Z|")!==false);

    $encrypted = openssl_encrypt($data,"aes-256-gcm",$key,false,$iv);   
    var_dump(openssl_decrypt($encrypted,"aes-256-gcm",$key,OPENSSL_RAW_DATA,$iv));
    $output = $iv . "|Z|" . $encrypted;
    $output = base64_encode($output);   
    return $output;
}