不可能解密用php mcrypt加密的json:RIJNDAEL 128

时间:2014-08-11 19:19:50

标签: php json encryption mcrypt

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

我正在使用RIJNDAEL_128和MODE_CBC使用PHP Mcrypt模块;所有工作在服务器A(Hostmetro提供商)上都很完美,但是当我向服务器B(Hostgator提供商)尝试相同的脚本时,加密的数据无法从移动应用程序解密。

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

我已经检查了mcrypt版本,它在服务器A和B上是相同的,只有PHP版本不同。

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

我所有的测试都表示,如果我尝试加密像'text'这样的字符串,结果在任何地方都是一样的,但是如果我尝试使用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;

更新08/12/2014

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

解决方案

解决方案将数据转换为String ,使用json_encode()转换数组,使用mcrypt加密json:all现在正在运行。