Intereting Posts
PHP. Можно ли использовать array_column с массивом объектов Невозможно создать пример приложения с помощью Yii Framework Получение подмножества узлов XML с помощью PHP PHP глобальный или $ GLOBALS Добавить как отдельные элементы корзины для продукта с пользовательскими данными в Woocommerce Передача событий в режиме Laravel 5.4 не работает с vuejs Ошибка 403 в форме submit Как разрешить исключение ServiceCircularReferenceException? Приверженность Zend Framework – любые аргументы против? Проверка подлинности HTTP с использованием проверки подлинности PHP Водяной знак на анимированном gif с php Моя почта SMTP продолжает поступать как Junk Как переназначить столбец AUTO_INCREMENT для каждой строки в таблице MySQL с помощью PHP Регулярное выражение для удаления не буквенно-цифровых символов из строк UTF8 В PHP после назначения ресурса указателя файла переменной с помощью функции fopen (), как я могу получить имя файла из переменной?

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)); в 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);