2013-07-18 46 views
1

我使用PHP的mcrypt_encrypt函数加密字符串。这是我的代码:错误的解密与mcrypt_decrypt

$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
$this->iv = mcrypt_create_iv($ivSize, MCRYPT_RAND); 

$encryptionKey = pack('H*', $key); 

$stringToEncryptUTF8 = utf8_encode($stringToEncrypt); 

$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, $stringToEncryptUTF8, MCRYPT_MODE_CBC, $this->iv); 
$ciphertext = $this->iv . $ciphertext; 
$ciphertextBase64 = base64_encode($ciphertext); 
$cipherTextURLEncoded = rawurlencode($ciphertextBase64); 

return $cipherTextURLEncoded; 

现在我将加密的字符串发送给客户端,然后通过URL发送回客户端。然后我想解密它使用:

$stringToDecrypt = base64_decode($stringToDecrypt); 

$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
$iv = substr($stringToDecrypt, 0, $ivSize); 

$stringToDecrypt = substr($stringToDecrypt, $ivSize); 

$encryptionKey = pack('H*', $key); 
$decodedText = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, $stringToDecrypt, MCRYPT_MODE_CBC, $iv); 

return $decodedText; 

这是给我垃圾,但不是原来的字符串。变量$ key在两种情况下都具有相同的值。哪里不对?

+0

请在加密/解密之前和之后用十六进制打印出密钥,密文,密文和明文的准确值。这基本上是调试。 –

回答

1

我不得不削减解密的字符串在它的结尾处,删除\ 0字符。现在它可以工作。

0

你不reverese的rawurlencode步:

$cipherTextURLEncoded = rawurlencode($ciphertextBase64); 

尝试添加此:

$stringToDecrypt = rawurldecode($stringToDecrypt); 
+0

它仍然不起作用。 – user975561

+0

检查加密/解密中的IV是否相同。 –

+0

这是一样的。 – user975561