json_decode在已通过加密的字符串上返回NULL

问题描述:

我试图保护我的数据库的信息,并且标准数据类型是JSON,我只是写了一些简单的mcrypt函数来加密和解密任何文本,它们是:json_decode在已通过加密的字符串上返回NULL

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的输出是该SAME,因为它在去

谁能告诉我为什么会发生这种情况?

UPDATE
我之前和之后发现strlen()是不同的。那么,我该如何确保它在整个加密过程中保持不变或在完成后进行修复?

+2

如果'decrypt'的输出是相同的,那么这不会发生。检查字符串长度......解密输出可能用ASCII空字符填充。 – cdhowie

+1

向我们展示解码字符串的'bin2hex()'转储。 – mario

+0

这些加密函数是垃圾。你的随机iv在哪里? – rook

BIN2HEX写着:
033303539222c2274797065223a22686f6d65227d00000000000000000000

这意味着你已经解密的字符串中的尾随NUL字节。发生这种情况是因为mcrybt_cbc以块为单位进行操作。它会填充输入和输出到16(或24)字节的倍数来完成。 (输出可能有时甚至包含垃圾;因此,长度字段通常会出现在大多数加密方案/容器格式中。)

在您的这段代码中,您可以在解密后应用rtrim。或者更确切地说:

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