我有一个类,它以这种格式的字符串:问题加密/编码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之前的字母数字字符串,或者甚至会有什么区别?
你intentially跳过IV的第一个字符(SUBSTR($解码,1,$ iv_size))? 我以为一切工作正常(从char 0提取IV,而不是1),但我得到了混合结果。例如,对此字符串“67:1262031751:4b38e2cab2353”进行加密/编码效果很好,但这个“24:1262031777:4b38e2cab2353”根本不起作用,并返回一个64个字符串的伪造字符。 – eCaroth 2009-12-28 20:26:24
不,id没有故意跳过第一个字符。我只是没有rember,如果是基于0或1基于。 – 2009-12-28 20:35:12
如果某些字符串有效,则不确定您的base64编码/解码是否正确。 base64用'='填充输出,并且如果urlencode/decode去掉'=',那么base64编码/解码被破坏,结果是密码被破坏。您将逐一采取这一步骤,并在每一步验证反向操作是否正常(加密和验证后解密输出,编码后解码并验证等)。 – 2009-12-28 20:37:54