mcrypt_decrypt解密错误


Wrong decryption with mcrypt_decrypt

我正在用PHP的mcrypt_encrypt函数加密一个字符串。这是我的代码:

$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个字符。现在它可以工作了。

您不会重新调用rawurlencode步骤:

$cipherTextURLEncoded = rawurlencode($ciphertextBase64);

尝试添加此:

$stringToDecrypt = rawurldecode($stringToDecrypt);