为什么AES无法解密PHP。 Openssl

时间:2019-02-27 22:21:59

标签: php encryption openssl aes

我在解密时遇到问题 我有

 $key="Gwu078980";
 $cipher="aes-128-gcm";
 $iv=md5($cipher);
 $text="yaw0";
 $tag="";
 echo $encrypted=openssl_encrypt($text, $cipher, $key, 0, $iv, $tag);

 echo $de_ciphertext=openssl_decrypt($encrypted, $cipher, $key, 0, $iv, $tag);

输出

ELRmWQ==
yaw0

因此,原始文本yaw0,而加密的ELRmWQ==,而解密的是{{1 }}非常完美。

但是当我手动复制加密的文本并将其用作

yaw0

然后我运行解密 解密返回空值。 预先感谢任何人帮助我。

1 个答案:

答案 0 :(得分:1)

由于您使用的是openssl_encrypt,因此您的$tag消息通过引用修改了aes-128-gcm

openssl_decrypt也是该参数(使用AEAD-身份验证的加密和解密时),在您省略openssl_encrypt调用的情况下,它可能是空字符串。

请参阅文档中的Example 1

关于存储$cipher, $iv, and $tag的评论很重要:

<?php
//$key should have been previously generated in a cryptographically safe way, like openssl_random_pseudo_bytes
$plaintext = "message to be encrypted";
$cipher = "aes-128-gcm";
if (in_array($cipher, openssl_get_cipher_methods()))
{
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    $ciphertext = openssl_encrypt($plaintext, $cipher, $key, $options=0, $iv, $tag);
    //store $cipher, $iv, and $tag for decryption later
    $original_plaintext = openssl_decrypt($ciphertext, $cipher, $key, $options=0, $iv, $tag);
    echo $original_plaintext."\n";
}
?>