PHP:JSON在使用urldecode和mcrypt时不起作用
当我通过json_decode运行json代码时,它工作得很好,但当我用mcrypt加密并用urlencode编码,然后解码和解密时,它就不工作了 有人知道怎么了吗 解密后的json看起来与加密前的json完全相同 我的代码: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 = '{"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填充策略,然后再将其剥离。