AES Cookie数据随机无法解密

时间:2013-06-08 14:59:16

标签: php cookies aes rijndael

在使用存储的Cookie编写和解析某些DATA时,我遇到了问题。

这是我的crypt和decrypt函数(我在这里的另一个主题中找到了它)。

function decrypt($crypttext){   
        $crypttext = base64_decode($crypttext);
        $plaintext = '';
        $td        = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
        $ivsize    = mcrypt_enc_get_iv_size($td);
        $iv        = substr($crypttext, 0, $ivsize);
        $crypttext = substr($crypttext, $ivsize);
        if ($iv)
        {
            mcrypt_generic_init($td, CRYPTKEY, $iv);
            $plaintext = mdecrypt_generic($td, $crypttext);
        }
        return trim($plaintext);
}

function encrypt($plaintext){
        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, CRYPTKEY, $iv);
        $crypttext = mcrypt_generic($td, $plaintext);
        mcrypt_generic_deinit($td);
        return base64_encode($iv.$crypttext);
} 

我的用法很简单:

//read, split if neccesarry, check if already in it, if not-> add, crypt, write
if(isset($_COOKIE['DATA'])){

    $data = decrypt($_COOKIE['DATA']);

    $search = explode('#',$data);
    if(!in_array($lnk, $search)){
        $data.= "#".$lnk; // $lnk = additional data
        $err = setrawcookie("DATA", encrypt($data));
    }
    $err = true;
}

在大多数尝试中,添加$lnk无效。在我写完之后解密cookie是错误的。未定义的垃圾。 (所以有些东西不能正常工作)。

我根本无法在代码中找到任何错误。我最好的猜测是问题是由以下原因造成的:

  $ivsize    = mcrypt_enc_get_iv_size($td);
  $iv        = substr($crypttext, 0, $ivsize);

具体而言,$ciphertext是否小于$ivsize

还有其他想法吗?

//以防止有关它的问题: 我存储的数据只是php uniqueID()由'#'分隔。所以将来可能会在cookie中存储(加密)10个ID ...我不知道cookie的最大大小和因素AES打击它,但我认为cookie应该得到它。

(如果有一种更简单的同步加密方式(这不应该是高安全性,但大多数是安全的),请随时告诉我。

1 个答案:

答案 0 :(得分:0)

尝试使用bin2hex代替base64_encode()。我previously answered就SO问题提出了类似的问题。