【问题标题】:Wrong decryption with mcrypt_decrypt使用 mcrypt_decrypt 解密错误
【发布时间】:2013-07-17 01:39:43
【问题描述】:

我正在使用 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 在这两种情况下具有相同的值。怎么了?

【问题讨论】:

  • 请打印出加解密前后的密钥、IV、密文和明文的准确值,十六进制。这基本上是调试。

标签: php cryptography mcrypt


【解决方案1】:

我不得不修剪解密的字符串以删除它末尾的 \0 字符。现在可以了。

【讨论】:

    【解决方案2】:

    您不会反转 rawurlencode 步骤:

    $cipherTextURLEncoded = rawurlencode($ciphertextBase64);
    

    尝试添加这个:

    $stringToDecrypt = rawurldecode($stringToDecrypt);
    

    【讨论】:

    • 检查IV在加密/解密中是否相同。
    猜你喜欢
    • 2012-01-03
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多