用不同的IV解密

  • 本文关键字:IV 解密 php encryption
  • 更新时间 :
  • 英文 :


我发现了一对加密和解密函数,看起来它们遵守数据安全的所有规则,我迫切希望完全理解这些规则,但如果没有这方面的博士学位,可能无法理解。

当我用相同的IV加密和解密同一页上的东西时,它们工作得很好。

但是当我尝试将结果保存到SQL数据库,然后再次将它们拉出来并解密时,它不起作用。

$key = "secretsecret";
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);
function encrypt($key, $text, $iv) {
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv)));
}
function decrypt($key, $text, $iv) {
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_CBC,$iv));
}
$text = "the text to encrypt";
echo "Plain Text: " . $text . "<br><br>";
$encrypted = encrypt($key, $text, $iv);
echo "Encrypted Text: " . $encrypted . "<br><br>";
echo "Decrypted Text: ". decrypt($key, $encrypted, $iv) . "<br><br>"; //this works fine
//save encrypted text to SQL
mysql_query("UPDATE table SET test='".addslashes($encrypted)."' WHERE id='1'");

然后如果在另一个页面视图中,我将文本拉出来并尝试:

echo "Decrypted Text: ". decrypt($key, $textFromSQL, $iv) . "<br><br>";

我得到胡言乱语。我需要做些什么才能让文本正确解密不同的静脉注射?

您需要在解密中使用与加密中相同的初始化向量(IV)。这意味着您需要将IV存储在数据库中。

静脉不需要保密,不像钥匙。

像这样:

mysql_query("UPDATE table SET test='".addslashes($encrypted)."', IV='".addslashes($IV)."' WHERE id='1'");

然后当你解密数据时使用存储的IV.

最新更新