PHP:使用urldecode和mcrypt时JSON无法正常工作

时间:2011-12-08 11:00:30

标签: 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_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文档中,您将看到我的意思。

截图:

enter image description here

2 个答案:

答案 0 :(得分:10)

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

rtrim($decrypted, "\0");

答案 1 :(得分:3)

做了一些故障排除,这就是我得到的:

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不是很熟悉,所以希望有人可以帮助你找出你最后获得额外角色的原因。