json_decode对经过加密的字符串返回NULL



我正试图保护我的数据库信息和数据的标准类型是JSON,我只是写了一些简单的mcrypt函数加密和解密任何文本,它们是:

function encrypt($key, $data){
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT);
    return base64_encode($encrypted_data);
}
function decrypt($key, $encryptedData){
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, base64_decode($encryptedData), MCRYPT_DECRYPT);
    return $decrypt;
}

我有一个有效的JSON字符串,我已经测试了json_decode没有通过加密,它的工作。但是当我加密然后解密它然后尝试json_decode它只返回NULL

现在我只是在一个简单的脚本中调试它,下面是:

include("coreFunctions.php");
$arr = '{"number":"4646464646","type":"home"}';
$key = "ladida";
$locked = encrypt($key, $arr);
var_dump($locked);
var_dump(json_decode(decrypt($key, $locked), true));

已经验证了decrypt的输出与输入的相同。

谁能告诉我为什么会这样?


我发现strlen()前后是不同的。那么我怎样才能确保它在整个加密过程中保持不变,或者在加密完成后修复它呢?

bin2hex写道:
033303539222 c2274797065223a22686f6d65227d00000000000000000000

这意味着在解密的字符串中尾随NUL字节。这是因为mcrybt_cbc按块操作。它会将输入和输出填充为16(或24)个字节的倍数。(输出有时甚至可能包含垃圾;这就是为什么长度字段经常出现在大多数加密方案/容器格式中。

在您的情况下,您可以在解密后应用rtrim。或者更确切地说:

 json_decode(rtrim(decrypt($key, $locked), ""), true);

最新更新