mcrypt_crypt 和解密结果不匹配

Posted

技术标签:

【中文标题】mcrypt_crypt 和解密结果不匹配【英文标题】:mcrypt_crypt and decrypt does result does not match 【发布时间】:2013-02-27 23:43:54 【问题描述】:

我有这2种加解密方法,但是输入的值和解密函数的输出值不匹配,能帮我找出问题吗?

private function encryptMd($md)

    $md = serialize($md);
    //encryption should happen here
    $md = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->secret, $md, MCRYPT_MODE_ECB);
    $md = gzcompress($md);
    $md = base64_encode($md);
    return $md;


private function decryptMd($md)

    $md = base64_decode($md);
    $md = gzuncompress($md);
    // decryption happen here
    $md = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->secret, $md, MCRYPT_MODE_ECB));
    $md = unserialize($md);
    return $md;

结果如下:

第一个字符串: orderid=1111264&cardnumber=4012001037141112&cardname=Test&cardtype=VISA&amount=100&expdate=0214

加密字符串: eJwBgAB // 4LFthFrKDuzX7v + 90h2j24xrEnKHHxefzvh5si5yKxEJxtOAo8XG923Ako0eYP7JVH03yN9LPdb / V8JghJVi8tPvloqlEOFwDHUbwBoFGHBNvTRq0vgMRN / Wlpfk8e + UYQWV4TRYYNWNWxVLiwMFWWOk6bsESDgRBkMDQcp // OOFkg5cg == P>

收到的字符串: eJwBgAB // 4LFthFrKDuzX7v + 90h2j24xrEnKHHxefzvh5si5yKxEJxtOAo8XG923Ako0eYP7JVH03yN9LPdb / V8JghJVi8tPvloqlEOFwDHUbwBoFGHBNvTRq0vgMRN / Wlpfk8e + UYQWV4TRYYNWNWxVLiwMFWWOk6bsESDgRBkMDQcp // OOFkg5cg == P>

解密结果: 错误

【问题讨论】:

您应该能够删除所有与 IV 相关的代码。您正在使用不需要 IV 的 ECB 模式。为了将来参考,如果您切换到 CBC 模式(或其他需要 IV 的模式),您需要使用 same IV 进行加密和解密。在您当前的代码中,您每次都在创建一个随机值。 我删除了 iv 代码,但它仍然无法工作,还有其他想法吗? 抱歉,我并不是说 IV 是问题所在——只是它是多余的。请使用您的最新代码更新您的问题。 另外,向我们展示您向encryptMd 提供的内容、向您提供的内容以及将其输出提供给decryptMd 时获得的内容 我试过注释掉gzip和反序列化和base64,现在解密不返回false,但是解密后的字符串和输入的不一样。 【参考方案1】:

问题在于 $this->secret 在解密时为空。无论如何,谢谢。

【讨论】:

以上是关于mcrypt_crypt 和解密结果不匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 的 AES-256-GCM 解密中的标签不匹配错误

使用 MCRYPT 在 PHP 中加密/解密...结果不一致

php openssl aes-256-cbc key长度自动匹配了128的长度,为啥

Shiro学习——密码的加密解密

Shiro学习——密码的加密解密

Python - RSA解密不返回原始消息(非常简单,短程序)