json_decode возвращает NULL после того, как строка json была расшифрована с помощью mcrypt_decrypt (aes)

Я хочу отправить «сообщение» на php как данные json. Но «сообщение» должно быть строкой. Если я "строчу" свои данные json в Javascript и шифрую их с помощью "CryptoJS.AES.encrypt", я не могу получить отдельное содержимое в PHP, потому что "json_decode" всегда возвращает NULL.

Я использовал "json_last_error" и он вернул 3. Когда я кодирую его с помощью "utf8_encode" и json_encode, он возвращает 0.

"mcrypt_decrypt" - это PHP-дешифратор AES.

Я действительно не знаю, что сделать. Пожалуйста, помогите мне и заранее спасибо!

//JAVASCRIPT
    var encrypted = CryptoJS.AES.encrypt(
        JSON.stringfy({'message':'message','messageA':'messageA','messageB':'messageB'}),
        key512Bits500Iterations, {iv:iv});

    var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    var iv_base64 = encrypted.iv.toString(CryptoJS.enc.Base64);
    var key_base64 = encrypted.key.toString(CryptoJS.enc.Base64);

    $.ajax({
		url: 'http://localhost/workspace/messageAppl.php',
		type: 'POST',
		data: {
          'data_base64':data_base64,
          'iv_base64':iv_base64,
          'key_base64':key_base64 //key_base64 will be encrypted with RSA
		},
    	success: function(data){
        	alert(data);
        },
        error: function(){
          alert('Index-Error');
    	}	
    });

//    PHP

    // I can get the jsonString but I can't get the single message like 'message', 'messageA' or 'messageB'
         ...
         
     //Decryption in PHP
         public function jsMessage($data_base64, $iv_base64, $key_base64){
			$data_enc = base64_decode($data_base64); // data_base64 from JS
			$iv        = base64_decode($iv_base64);   // iv_base64 from JS
			$key       = base64_decode($key_base64);  // key_base64 from JS
		
			$plaintext = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $data_enc, MCRYPT_MODE_CBC, $iv ), "\t\0 " );
			return $plaintext;
		}

         
    $json_string = aes_decrypt($_POST['data_base64'], $_POST['iv_base64'], $_POST['key_base64']);


    // json_decode returns NULL but WHY?
    $array=json_decode($json_string);

    $message=$array->message
    $messageA=$array->messageA
    $messageB=$array->messageB

**Edit 1**
The error message I get is:
**"Control character error, possibly incorrectly encoded"**

but the Json which I get in php after the decryption is valid:
{"message":"blablabalbalbalaballab","messageA":"blablabalbalbalaballab" ,"messageB":"blablabalbalbalaballab"}

и, чтобы быть уверенным, я снова и снова тестировал json здесь


< br> **Редактировать 2 **



Я не могу это опубликовать с этими знаками, поэтому я сделал фото.


person Hungry2Learn    schedule 10.04.2015    source источник
comment
Работает ли json_decode, если вы не шифруете строку?   -  person Carson Crane    schedule 11.04.2015
comment
Разве stringify не должно быть JSON.stringify?   -  person Barmar    schedule 11.04.2015
comment
Я надеюсь, что это не то, как ваше приложение действительно разработано. Отправка ключа в том же AJAX-запросе, что и зашифрованные данные, не имеет смысла. Если кто-то получает зашифрованное сообщение, он также получает ключ, чтобы расшифровать его самостоятельно.   -  person Barmar    schedule 11.04.2015
comment
Очевидно, что-то не так с вашим кодом дешифрования. Пожалуйста, отредактируйте свой вопрос, чтобы добавить воспроизводимый пример вашей проблемы.   -  person Artjom B.    schedule 11.04.2015
comment
@Barmar Ключ будет зашифрован с помощью RSA, и проблема не в JSON.stringify. Все работает нормально с обычными строками. Но я не хочу шифровать и расшифровывать каждую строку, потому что это занимает слишком много времени. ‹br› ‹br› Артём Б.: Я добавил метод расшифровки. ‹br›‹br› Спасибо за ответы!   -  person Hungry2Learn    schedule 11.04.2015
comment
@CarsonCrane Да, с обычным jsonString все работает нормально. Сразу после шифрования этого jsonString с помощью cryptojs в js он возвращает null в php. Спасибо за Ваш ответ!   -  person Hungry2Learn    schedule 11.04.2015
comment
Можете ли вы объяснить свою линию rtrim? Похоже, вы пытаетесь удалить неправильный тип заполнения. Попробуйте просто с нулем \0   -  person Phil    schedule 12.04.2015
comment
@Phil_1984_ Я пробовал с \0, \t, \n, \x0B, \r... всегда один и тот же результат.   -  person Hungry2Learn    schedule 13.04.2015


Ответы (3)


в примечаниях пользователя к mcrypt_decrypt() есть ответ

Похоже, что mcrypt_decrypt дополняет RETURN STRING нулями ('\0'), чтобы заполнить размер блока n *

$json = rtrim($json, "\0");
person Jeremy French    schedule 17.09.2015
comment
Затем $strPad = ord($json[strlen($json)-1]); $n_data = substr($json, 0, -$strPad); $строка=json_decode($n_data); - person Hungry2Learn; 19.09.2015

Похоже, вы кодируете base64 зашифрованную строку json. Однако вы не декодируете его в base64 в своем примере PHP, прежде чем пытаться расшифровать.

Кроме того, если ваша функция расшифровки mcrypt_decrypt, то вы неправильно передаете параметры , это должно быть mcrypt_decrypt($cipher, $key, $data, $mode, $iv).

Изменить: больше информации

Также кажется, что вы кодируете base64 другие значения, которые вы передаете в своем вызове ajax, но не декодируете их на стороне php в своем примере, это также нужно будет сделать.

person Nilithus    schedule 11.04.2015
comment
Расшифровка отлично работает с обычной строкой. Я отредактировал свой вопрос. Пожалуйста, взгляните на мой код расшифровки. Я могу получить jsonString, но не могу разобрать jsonString в php - person Hungry2Learn; 11.04.2015

Объяснение
Сценарий: в JS я шифрую jsonString с помощью cryptojs. В PHP я расшифровываю его с помощью «mcrypt_decrypt».
Но JsonString, который я получаю в php после расшифровки, имеет в конце несколько забавных символов.
Я могу увидеть эти символы, только если скопирую вывод var_dump() и вставьте его в IDE (т.е. notepad++, eclipse и т.д.).

Этих символов всегда 12. Я не знаю, откуда они берутся (Возможно, пока сообщение зашифровано или расшифровано), но после " подстроку», я могу получить допустимую строку jsonString для «json_decode()».

решение
Я просто добавляю 12 невидимых символов после последней фигурной скобки, и это работает. Надеюсь, это кому-нибудь поможет.

json_decode(substr( $json, 0, strlen( $jsonString)-12));


EDIT

Better use this:

$strPad = ord($json[strlen($json)-1]);
$n_data = substr($json, 0, -$strPad); 
$row=json_decode($n_data );

чем

json_decode(substr( $json, 0, strlen( $jsonString)-12));

Так что вам не нужно считать точки, которые вы должны удалить, как это сделал я.

person Hungry2Learn    schedule 12.04.2015
comment
Этот код просто удаляет последние 12 символов. Пожалуйста, не могли бы вы объяснить свой ответ? - person Phil; 12.04.2015