加密/编码URL变量的问题

时间:2009-12-28 19:24:35

标签: php url encryption encoding

我有一个以这种格式接受字符串的类:

  

000067000000000012620060324b38e2cab3353

,加密字符串,然后将其作为URL中的get变量附加。

执行加密的类具有如下所示的功能:

private function _code_encryption($enc_type,$a_string){
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);                          

    if($enc_type == self::ENCRYPT_STRING){
       //encrypt then return base64 encoded
       $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $a_string, MCRYPT_MODE_CBC, $iv);
       return base64_encode($encrypted);
    }elseif($enc_type == self::DECRYPT_STRING){
       $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, base64_decode($a_string), MCRYPT_MODE_CBC, $iv);
        return trim($decrypted);
    }
}

当字符串被加密时,我会对该值进行urlencode并将其添加到url,就像url看起来像“https://secure.mysite.com/index.php?action=someaction&transfer_code=XXXXX”,其中XXXX是urlencoded加密字符串。

现在,当解析和处理url时,$ _GET ['transfer_code']的值被传递到上面的_code_encryption函数,但是没有返回正确解密的值,而是返回我的浏览器不呈现的乱码。是否需要用于加密/解密的密钥长度?我试过像

这样的东西
$key = hash('sha256',self::AUTH_ENCRYPTION_KEY,true);

但这也不起作用......

另外,我不是urldecoding $ _GET ['transfer_code']变量,因为php手册页说明了vars已经是urlencoded ......

我应该在加密/ base64_encoding之前对字母数字字符串进行UTF-8编码,还是会产生任何差异?

1 个答案:

答案 0 :(得分:3)

您使用随机IV加密,并使用不同的随机IV进行解密。解密的字符串永远不会与原始字符串匹配。要正确解密原始字符串,您必须使用加密期间使用的相同IV。通常这是通过将用于加密字符串的IV预先添加来实现的。在解密时,您必须首先从值中提取IV,使用此值初始化密钥,然后解密其余部分以使用正确初始化的密钥。

我没有解析器来验证这个,但它应该是这样的:

private function _code_encryption($enc_type,$a_string){
 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
 if($enc_type == self::ENCRYPT_STRING){
  //encrypt then return base64 encoded
  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
  $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $a_string, MCRYPT_MODE_CBC, $iv);
  return base64_encode($iv.$encrypted);
 } elseif ($enc_type == self::DECRYPT_STRING){
  $decoded = base64_decode($a_string);
  $iv = substr($decoded,0,$iv_size);
  $cipher = substr($decoded,$iv_size);
  $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, self::AUTH_ENCRYPTION_KEY, $cipher, MCRYPT_MODE_CBC, $iv);
  return trim($decrypted);
 }
}