json_decode возвращает NULL для строки, прошедшей шифрование - PullRequest
0 голосов
/ 02 сентября 2011

Я пытаюсь защитить информацию в своей базе данных, и стандартным типом данных является 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() до и после отличается.Итак, как я могу убедиться, что он остается неизменным на протяжении всего процесса шифрования, или исправить его после того, как это будет сделано?

1 Ответ

3 голосов
/ 02 сентября 2011

bin2hex читает:
033303539222c2274797065223a22686f6d65227d00000000000000000000

Это означает, что у вас есть конечные байты NUL в расшифрованной строке. Это происходит потому, что mcrybt_cbc работает блочно. Для этого он заполнит ввод и вывод кратными 16 (или 24) байтам. (Вывод может иногда даже содержать мусор; следовательно, поле длины часто встречается в большинстве схем шифрования / контейнерных форматов.)

В вашей системе вы можете получить rtrim после расшифровки. Или точнее:

 json_decode(rtrim(decrypt($key, $locked), "\0"), true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...