使用blowfish cbc模式,我想创建一个加密的令牌。当我创建令牌并立即解密时,它可以正常工作。但是,如果我将加密的令牌放在SESSION
中并尝试在后续请求期间解密它,则解密会产生垃圾。
这是我的代码。我正在使用SESSION
进行测试;最终,我将把这些字符串存储在数据库中。
session_start();
define("key","v8nga4r76qlipm111jnioool");
define("iv",substr(md5(uniqid(rand(),1)),0,8));
require_once("Crypt/Blowfish.php");
$str = "Blowfish_test";
// encode start!!
$blowfish = Crypt_Blowfish::factory("cbc", key, iv);
$encrypt = $blowfish->encrypt($str);
$encrypt64 = base64_encode($encrypt);
$_SESSION["test"] = $encrypt64;
到目前为止,一切都是正确的。如果,在同一请求中,我立即对其进行解码(来自SESSION
),结果如预期:
// decode start!!
$blowfish = Crypt_Blowfish::factory("cbc", key, iv);
$decrypt64 = base64_decode($_SESSION["test"]);
$decrypt = $blowfish->decrypt($decrypt64);
$trim_decrypt = rtrim($decrypt, "\0");
echo "Before encryption : " . $str ."<br>";
echo "Encrypted string   : " .$encrypt64. "<br>";
echo "decrypted string   : " .$trim_decrypt. "<br>";
如果我只将第二个代码块放在另一个页面上(所以先前生成的字符串正在被解密),解密后的字符串就是垃圾。
加密 - &gt; session [“test”] - &gt;解密---没问题
会话[“测试”] - &gt;解密---问题
这里发生了什么?
答案 0 :(得分:0)
对不起,我很抱歉。 当时我通过评论解决了这个问题,所以我使用社区Wiki解决了这个问题。
---添加---
问题解决了
// encode
// At the same time save the initialization vector
$_SESSION["test"] = $encrypt64;
$_SESSION["iv"] = iv;
--- other file ---
// decode
$blowfish = Crypt_Blowfish::factory("cbc", key, $_SESSION["iv"]);