用不同的IV解密

时间:2014-03-14 20:27:25

标签: 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正确解密文本?

1 个答案:

答案 0 :(得分:3)

您需要在解密中使用与在enryption中相同的Initialization Vector(IV)。这意味着您需要将IV存储在数据库中。

与钥匙不同,IV不需要保密。

这样的事情:

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

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