使用有效 JSON 的 PHP JSON 解码错误

标签 php json

我正在尝试解码一个简单的 JSON 字符串和格式以使其看起来正确。我实际上复制了字符串并使用相同的算法进行解码,但没有所有额外的代码并且工作正常。

print_r(json_decode('{"user_id":1,"issused":"2016-02-24 04:40:17","expire":"2016-03-02 04:40:17"}'));

成功了。但是当我这样做的时候

$hash = Hash::salt(32);
$issused = date('Y-m-d H:i:s');
$expire = date('Y-m-d H:i:s', strtotime('+1 week'));
$data = array('user_id' => 1, 'issused' => $issused, 'expire' =>     $expire);
$encrypt = Cipher::encrypt(json_encode($data), $hash);
$decrypt = Cipher::decrypt($encrypt, $hash);
echo $encrypt;
echo "<br><br>";
echo $decrypt;
echo "<br><br>";
print_r(json_decode($decrypt));

其中 $decrypted 是我在上面发布的有效格式化 JSON。当我使用时:

echo json_last_erro();

它给了我 3 的输出,即 JSON_ERROR_CTRL_CHAR

知道为什么没有正确解码吗?

编辑 这是我加密数据的方式。

class Cipher {
public static function encrypt($string, $hash) {
    $size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($size, MCRYPT_RAND);
    $encrypted = mcrypt_encrypt(MCRYPT_BLOWFISH, $hash, utf8_encode($string), MCRYPT_MODE_ECB, $iv);
    //$encoded = urlencode($encrypted);
    $encoded = base64_encode($encrypted);
    return $encoded;
}

public static function decrypt($string, $hash) {
    //$decoded = urldecode($string);
    $decoded = base64_decode($string);
    $size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($size, MCRYPT_RAND);
    $decrypted = mcrypt_decrypt(MCRYPT_BLOWFISH, $hash, $decoded, MCRYPT_MODE_ECB, $iv);
    return $decrypted;
}

下面是我如何制作盐。

public static function salt($length) {
    return mcrypt_create_iv($length); //base64_encode(openssl_random_pseudo_bytes($length));
}

最佳答案

额外的控制字符 (\0) 是由于密码 block 填充。来自mcrypt_decrypt文档

数据

  • 将使用给定的密码和模式解密的数据。如果 数据的大小不是n * blocksize,数据将被填充 用'\0'。

您可以自己在加密中填充 block 大小的输入,然后在 decrypt() 中删除额外的填充,或者您可以从解码消息中删除尾随零字节,执行以下操作。

$decrypt = trim($decrypt, "\0");

关于使用有效 JSON 的 PHP JSON 解码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592971/

相关文章:

php - Zend_Log_Writer_Db - 调用未定义的方法 Zend_Config::insert()

php - CentOS 7 编译 PHP 7 时出现 "Cannot find imap library (libc-client.a)"

php - 在php中单击按钮即可备份Mysql数据库

php - PHP中如何对数组的索引进行排序

java - 将 JSON 数组[array[String]] 转换为 Java 数组

ios - Error Domain=NSCocoaErrorDomain Code=3840 在Swift5中解析JsonString时

R - 解析具有多个级别的 JSON 代码

PHP 通过引用传递增加了内存使用

c# - SignalR 类型名称处理

javascript - PayPal 智能按钮和 REST Checkout SDK - SyntaxError : Unexpected end of JSON input OR Expected an order id to be passed