json_encode не работает с зашифрованной строкой

#php #json #node.js #encryption #phpseclib

#php #json #node.js #шифрование #phpseclib

Вопрос:

У меня небольшая проблема, поскольку я хочу зашифровать некоторые данные post, которые я получаю из формы, а затем отправить их на мой сервер nodejs в формате json, чтобы поместить их в базу данных.

Моя проблема: кажется, я не могу опубликовать данные после их шифрования. Я могу опубликовать строку json просто отлично, но не более того:

Мой код:

 $rsa->loadKey($keydata);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

$encrypted = $rsa->encrypt("test");

$jsonArray = array(
    'crypt' => $encrypted
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;

$ch = curl_init('https://..........');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonArrayEncoded);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
  

Я даже не получаю вывод echo. Но строка, похоже, зашифровывается, поскольку я могу повторить это (множество ошибок кодировки несколько случайных букв и цифр), и если я расшифрую ее в php skript, я также получу правильный результат. Я не получаю никаких консольных предупреждений или ошибок ни в Chrome, ни в Firefox.

Я что-нибудь делаю не так? (совершенно уверен, что есть)

e: Я использую это как криптографическую библиотеку:http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc1

правка2: ну, как и советовалось в комментариях, я преобразовал строку в utf8, но теперь она кажется слишком длинной для расшифровки моим ключом… Tough o зашифровал только слово «test»…

Я думаю, что мне нужно копнуть глубже…

Если кто-нибудь знает: для расшифровки я использую модуль Ursa для node.js с помощью следующего кода:

 var buffer = new Buffer(req.body.crypt);

var data = private.decrypt(buffer, 'utf8', 'utf8', ursa.RSA_PKCS1_PADDING);
  

Комментарии:

1. Может быть проблема с кодировкой, вы пробовали применять utf8_encode() между шифрованием и json’ing?

2. Поскольку я не знал, что функции нет… но вроде как это сработало…

3. Что вы подразумеваете под «слишком длинным для расшифровки»? Очевидно, что вы бы декодировали перед расшифровкой — поэтому для процесса шифрования кодировка вообще не должна иметь никакого значения

4. Да, все еще я получаю ошибку «длиннее, чем modlen» при попытке декодировать ее с помощью ursa… Я выбрал один и тот же метод заполнения для обоих, поэтому я думаю, что есть другая проблема, на которую я посмотрю завтра.

Ответ №1:

что ж, как было указано в комментариях, я преобразовал строку в utf8, но теперь она кажется слишком длинной для расшифровки моим ключом… Tough o зашифровал только слово «test»…

Было бы полезно увидеть ваш обновленный код, который это делает. Вместо этого…

json_encode изначально не обрабатывает двоичные данные. Моей рекомендацией было бы сделать что-то вроде этого:

 $jsonArray = array(
    'crypt' => bin2hex($encrypted)
);
$jsonArrayEncoded = json_encode($jsonArray);
echo $jsonArrayEncoded;
  

Однако вам нужно будет сжать ее обратно в двоичный файл после того, как вы декодируете json в Java.

В качестве альтернативы, вы могли бы выполнить base64_encode, а base64 декодировать его позже.

Проблема, которую я бы испытал с кодировкой utf8, заключается в том, что внутренний строковый тип PHP не является utf8. Если Java, то, похоже, это может вызвать проблемы.

Комментарии:

1. Я попробую это позже. Мой код на данный момент не сильно изменился, я просто добавил один utf8_encode () перед json_encode() , хотя я могу опубликовать и это позже.

Ответ №2:

Функция json_encoding имеет множество флагов, которые вы можете передать ей, которые позволяют функции анализировать определенные наборы символов. Следующий вызов может решить возникающие у вас проблемы

json_encode($jsonArray, JSON_UNESCAPED_SLASHES | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP );

Комментарии:

1. Извините, ничего из этого не помогло : ( как указано выше, преобразование строки в utf8 помогло.

2. ОК. В любом случае, это стоит знать на будущее. Удачи с вашим проектом