Я пытаюсь обеспечить информацию о моей базе данных, а стандартный тип данных – 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));
в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 гласит:
033303539222c2274797065223a22686f6d65227d00000000000000000000
Это означает, что в дешифрованной строке вы заканчиваете NUL байты. Это происходит потому, что mcrybt_cbc
работает по блоку. Он будет заполнять входные и выходные данные кратным 16 (или 24) байтам для этого. (Выход может иногда содержать мусор, поэтому поле длины часто оккупирует большинство схем шифрования / форматов контейнеров).
В вашем ase вы можете уйти с применением rtrim
после дешифрования. Или, точнее,
json_decode(rtrim(decrypt($key, $locked), "\0"), true);