从数据库(MySQL)检索后,我在用PHP解密密文时遇到问题。我也存储IV和密钥。 但是,当我立即加密和解密时,它可以正常工作,但是当我在存储并从数据库检索后尝试解密时,就会出现问题。 键和纯文本是从帖子数据中获取的
$cipher="aes-128-gcm";
//Encrypt
$tag="";
$ivlen=openssl_cipher_iv_length($cipher);
$iv= openssl_random_pseudo_bites($ivlen);
$ciphertext=openssl_encrypt($plaintext, $cipher, $key, $options=0, $tag);
//Decrypt
$ciphertext=openssl_encrypt($ciphertext, $cipher, $key, $options=0, $tag);
//Decrypt after Database retrieval
$cyphertext=$row['pass'];
$iv=$row['iv'];
$key=$row['c_no'];
$ciphertext=openssl_encrypt($ciphertext,
$cipher, $key, $options=0, $tag);
答案 0 :(得分:0)
现在,我尝试运行它,您的代码充满了错误。
openssl_random_pseudo_bites()
不是函数。openssl_encrypt($plaintext, $cipher, $key, $options=0, $tag)
完全缺少IV,而$options=0
完全没有意义。只需使用0
。openssl_encrypt()
。这里是有效加密:
$cipher="aes-128-gcm";
//Encrypt
$tag="";
$key = 'asdasdasda';
$plaintext = 'asdasdsdasdasdasda';
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext=openssl_encrypt($plaintext, $cipher, $key, 0, $iv, $tag);
var_dump($ivlen, $iv, $ciphertext, $tag);
请记住,虽然密文似乎是以base64编码返回的,但IV和标记却不是。您要么需要自己使用base64,要么使用二进制列类型。
另外,打开/打开error_reporting
,以便您实际上看到这些错误并可以解决它们。