当我通过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文档中,您将看到我的意思。
截图:
答案 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
不是很熟悉,所以希望有人可以帮助你找出你最后获得额外角色的原因。