为什么解密将加密的文本,iv和密钥存储在数据库中后返回空值

时间:2019-02-27 16:13:00

标签: php

从数据库(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); 

1 个答案:

答案 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,以便您实际上看到这些错误并可以解决它们。