2009-12-28 77 views
1

我有一个类,它以这种格式的字符串:问题加密/编码URL变量

000067000000000012620060324b38e2cab3353

,加密字符串,然后追加它在URL中获取变量。

,做加密的类有类似如下的功能:

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看起来像“https://secure.mysite.com/index.php?action=someaction&transfer_code=XXXXX其中XXXX是添加到URL urlencoded加密的字符串

现在,当解析并处理url时,$ _GET ['transfer_code']的值传入上述_code_encryption函数,但未返回正确解密的值,而是返回乱码字符浏览器不渲染。是否需要长度我用来加密/解密的密钥?我想是这样

$key = hash('sha256',self::AUTH_ENCRYPTION_KEY,true); 

但没有任何工作...

而且,我不urldecoding的$ _GET [“transfer_code”]变量,因为这让瓦尔是PHP手册页状态已经urlencoded ...

我应该是UTF-8编码加密/ base64_encoding之前的字母数字字符串,或者甚至会有什么区别?

回答

3

你用一个随机四加密,和一个不同随机四解密。解密后的字符串永远不会匹配原始字符串。要正确解密原始字符串,您必须使用与加密过程中使用的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); 
} 
} 
+0

你intentially跳过IV的第一个字符(SUBSTR($解码,1,$ iv_size))? 我以为一切工作正常(从char 0提取IV,而不是1),但我得到了混合结果。例如,对此字符串“67:1262031751:4b38e2cab2353”进行加密/编码效果很好,但这个“24:1262031777:4b38e2cab2353”根本不起作用,并返回一个64个字符串的伪造字符。 – eCaroth 2009-12-28 20:26:24

+0

不,id没有故意跳过第一个字符。我只是没有rember,如果是基于0或1基于。 – 2009-12-28 20:35:12

+0

如果某些字符串有效,则不确定您的base64编码/解码是否正确。 base64用'='填充输出,并且如果urlencode/decode去掉'=',那么base64编码/解码被破坏,结果是密码被破坏。您将逐一采取这一步骤,并在每一步验证反向操作是否正常(加密和验证后解密输出,编码后解码并验证等)。 – 2009-12-28 20:37:54