Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:JSON在使用urldecode和mcrypt时不起作用_Php_Json - Fatal编程技术网

PHP:JSON在使用urldecode和mcrypt时不起作用

PHP:JSON在使用urldecode和mcrypt时不起作用,php,json,Php,Json,当我通过json_decode运行json代码时,它工作得很好,但当我用mcrypt加密并用urlencode编码,然后解码和解密时,它就不工作了 有人知道怎么了吗 解密后的json看起来与加密前的json完全相同 我的代码: <? $json = '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}'; $iv_size = mcrypt_get_iv_size(MCRYPT_

当我通过json_decode运行json代码时,它工作得很好,但当我用mcrypt加密并用urlencode编码,然后解码和解密时,它就不工作了

有人知道怎么了吗

解密后的json看起来与加密前的json完全相同

我的代码:

<?
    $json = '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}';

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $key = "abcdefghijkl";
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $json, MCRYPT_MODE_ECB, $iv);
    $urlencoded = urlencode($encrypted);
    $urldecoded = urldecode($urlencoded);
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $urldecoded, MCRYPT_MODE_ECB, $iv);

    // json and decrypted json comparison
    echo "<h3>JSON & Decrypted JSON look the same:</h3>";
    echo $json . " // json<br>";
    echo $decrypted . " // decrypted json<br>"; 

    // json - works!
    echo "<h3>JSON works:</h3>";
    $data = json_decode($json); 
    $i = 1;

    while ($i <= 2) {
        $entrynumber = "entry" . $i;
        echo "name ----- " . $data->$entrynumber->name . "<br>";
        echo "age ------- " . $data->$entrynumber->age . "<br>";
        $i++;
    }

    // decrypted json - doesnt work!
    echo "<h3>Decrypted JSON doesnt work:</h3>";
    $data = json_decode($decrypted);
    $i = 1;

    while ($i <= 2) {
        $entrynumber = "entry" . $i;
        echo "name ----- " . $data->$entrynumber->name . "<br>";
        echo "age ------- " . $data->$entrynumber->age . "<br>";
        $i++;
    }
?>

如果你把代码粘贴到php文档中,你就会明白我的意思

屏幕截图:

<?
    $json = '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}';

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $key = "abcdefghijkl";
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $json, MCRYPT_MODE_ECB, $iv);
    $urlencoded = urlencode($encrypted);
    $urldecoded = urldecode($urlencoded);
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $urldecoded, MCRYPT_MODE_ECB, $iv);

    // json and decrypted json comparison
    echo "<h3>JSON & Decrypted JSON look the same:</h3>";
    echo $json . " // json<br>";
    echo $decrypted . " // decrypted json<br>"; 

    // json - works!
    echo "<h3>JSON works:</h3>";
    $data = json_decode($json); 
    $i = 1;

    while ($i <= 2) {
        $entrynumber = "entry" . $i;
        echo "name ----- " . $data->$entrynumber->name . "<br>";
        echo "age ------- " . $data->$entrynumber->age . "<br>";
        $i++;
    }

    // decrypted json - doesnt work!
    echo "<h3>Decrypted JSON doesnt work:</h3>";
    $data = json_decode($decrypted);
    $i = 1;

    while ($i <= 2) {
        $entrynumber = "entry" . $i;
        echo "name ----- " . $data->$entrynumber->name . "<br>";
        echo "age ------- " . $data->$entrynumber->age . "<br>";
        $i++;
    }
?>

进行了一些故障排除,我得到的结果如下:

URL编码/解码不是问题所在。编码前和解码后的字符串相同:

编码前:

string 'è?¡OùpU4ˆß•ý£ÉGÒô½åLqe 2w¨”—Ô¢§|MþWþxÎZ±8“єЩɓ ŽšÁkèíSòøÓ€¥ðÒ(³!§¬žIê\&' (length=96)
解码后:

string 'è?¡OùpU4ˆß•ý£ÉGÒô½åLqe 2w¨”—Ô¢§|MþWþxÎZ±8“єЩɓ ŽšÁkèíSòøÓ€¥ðÒ(³!§¬žIê\&' (length=96)
问题出在加密/解密过程中

加密前的Json字符串:

string '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}' (length=72)
解密后的Json字符串:

string '{"entry1":{"name":"bob","age":"15"},"entry2":{"name":"bill","age":"50"}}������������������������' (length=96)
请参阅添加到末尾的额外垃圾字符

解密后,如果您这样做是为了删除垃圾字符,那么您的json解码很好:

json_decode(substr($decrypted,0,72));

我不太熟悉
mcrypt
,所以希望有人能帮你弄清楚为什么会在末尾增加字符。

你的加密/解密算法正在添加填充以符合块大小。您应该从末尾删除空字符,例如:


rtrim($decrypted,“\0”)

“它不工作”永远不是一个好的错误描述。请描述出现了什么问题,您收到了什么错误消息,等等。我做了解释,请参阅php注释。您能复制粘贴HTML而不是浏览器屏幕截图吗?也许解密后的json字符串中有一些HTML实体,比如“,”或其他类似的东西,谢谢!我整个上午都在试图弄清楚这一点。只是提醒一下,这会让你的应用程序受到填充oracle攻击。你最好在加密前对明文使用PKCS7填充策略,然后再将其剥离。