【问题标题】:Impossible decrypt json encrypted with php mcrypt : RIJNDAEL 128不可能解密用 php mcrypt 加密的 json:RIJNDAEL 128
【发布时间】:2014-10-04 17:20:58
【问题描述】:

我正在尝试将加密的 json 文件发送到移动应用程序。

我正在使用带有 MODE_CBC 的 RIJNDAEL_128 和 PHP Mcrypt 模块;在服务器 A(Hostmetro 提供商)上一切正常,但是当我尝试对服务器 B(Hostgator 提供商)使用相同的脚本时,加密的数据无法从移动应用程序中解密。

我使用相同的密钥和相同的 IV(IV 设置为“零”:\0)。

我检查了mcrypt版本,在服务器A和B上是一样的,只是PHP版本不同。

我在我的本地主机上测试脚本,json 加密再次更改。

我所有的测试都表明,如果我尝试加密像“文本”这样的字符串,结果在任何地方都是相同的,但如果我尝试使用 json,结果却大不相同:问题出在哪里?

谢谢。

更新: 加密函数的代码是:

    $str = $decrypted;
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    if (($pad = $block - (strlen($str) % $block)) < $block) 
    {
        $str .= str_repeat(chr($pad), $pad);
    }

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";}
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->the_key, $str, MCRYPT_MODE_CBC, $iv));

这是解密函数的代码:

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = ''; for($i=0;$i<$iv_size;$i++){ $iv .= "\0";}
    $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->the_key, base64_decode($encrypted), MCRYPT_MODE_CBC, $iv);

    # Strip PKCS7 padding.
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $pad = ord($str[($len = strlen($str)) - 1]);
    if ($pad && $pad < $block && preg_match(
        '/' . chr($pad) . '{' . $pad . '}$/', $str))
    {
        return substr($str, 0, strlen($str) - $pad);
    }

    return $str;

2014 年 8 月 12 日更新

我已经测试了加密文件的生成,我的 localhost 和我的第一台服务器 ( Hostmetro ) 给了我一个有效的文件;只有 Hostgator 会创建一个无法解密的“损坏”文件。

【问题讨论】:

    标签: php json encryption mcrypt


    【解决方案1】:

    在加密/解密之前尝试base64_encode/decode ..

    【讨论】:

    • 我有,我在保存之前对加密数据进行编码,在解密数据之前进行解码。
    • 由于问题出在处理 JSON 数据时,在实际编码之前通过 base64_encode 将其转换为字符串。我的意思是,如果你使用例如 encrypt($JSON) - do encrypt(base64_encode($JSON));
    • 我发布了我的加密和解密函数的代码......你认为我需要制作两个 base64_encode 和 base64_decode 吗?为什么这适用于每个地方的简单文本?
    【解决方案2】:

    好的,我发现了问题:问题是当 json_encode() 尝试对多维数组进行编码时,当您加密此 json 对象时,并非所有内容都转换为字符串,它可以被其他服务器中的 PHP 解密或相同,但不是通过移动应用程序。

    解决方案

    解决方案将数据转换为字符串,使用 json_encode() 转换数组,使用 mcrypt 加密 json:现在一切正常。

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 2015-11-10
      • 1970-01-01
      • 2011-01-24
      • 2013-12-07
      • 2014-06-28
      • 2014-02-24
      • 2013-04-14
      • 2011-10-13
      相关资源
      最近更新 更多