Я использую esp32 (платформа Arduino, а не esp-idf) с "HTTPClient.h"
библиотека для отправки запросов на получение параметров с моим PHP сервером.
Я хочу зашифровать значения параметров и расшифровать их в своем коде PHP и наоборот (мой сервер отправляет данные JSON обратно в мой esp32).
Я пытался использовать протокол XXTEA с этими библиотеками для PHP, и для esp32.
Но зашифрованная строка не будет правильно расшифровываться на PHP.
Пример:
Когда я шифрую "HELLO WORLD"
на моем esp32
с ключом "ENCRYPTION KEY"
Я получаю это:
35bd3126715874f741518f4d
И когда я расшифровываю его на PHP, он возвращается пустым.
Более того, когда я шифрую его на своем PHP-сервере, я получаю это:
T1YNYC4P4R2Y5eCxUqtjuw==
Мой эскиз esp32 выглядит так:
#include <xxtea-iot-crypt.h>
void setup() {
Serial.begin(115200);
}
void loop() {
String plaintext = "HELLO WORLD";
// Set the Password
xxtea.setKey("ENCRYPTION KEY");
// Perform Encryption on the Data
Serial.print(F(" Encrypted Data: "));
String result = xxtea.encrypt(plaintext);
Serial.println(result);
// Perform Decryption
Serial.print(F(" Decrypted Data: "));
Serial.println(xxtea.decrypt(result));
delay(2000);
}
Мой PHP-код выглядит так:
require_once('xxtea.php');
$str = "HELLO WORLD"$key = "ENCRYPTION KEY";
$encrypt_data = xxtea_encrypt($str, $key);
error_log($encrypt_data);
Есть ли способ иметь зашифрованные строки связи между PHP и esp32
?
Заранее спасибо.
Эта проблема может возникать из-за того, что входные данные имеют другой тип данных, поскольку ни одна из текущих реализаций XXTEA не выполняет какую-либо проверку типа или диапазона.
Или это может быть связано с разным поведением байтов в обоих случаях, поскольку двоичный файл обычно хранится в виде массива слов, составленного из байтов.
Или это может быть связано с отсутствием официальных или стандартных справочных примеров для правильного шифрования конкретной строки и ключа. В отсутствие эталонных примеров (с использованием шестнадцатеричного или base64 преобразования двоичного результата шифрования) невозможно определить, правильна ли реализация шифрования, даже если его результаты правильно расшифрованы с использованием соответствующей реализации дешифрования.
ДОБАВЛЕНО:
Я думаю, что я нашел одну проблему совместимости в опубликованном коде для XXTEA. Возможно, стоит обсудить это здесь.
В частности, проблема заключается в том, что разные реализации создают разные результаты для шифрования одного и того же открытого текста и ключа.
Обсуждение:
Эта проблема возникает из-за добавления длины открытого текста в качестве последнего элемента массива long. Хотя это решает проблему с открытым текстом, длина которого не кратна 4, он генерирует зашифрованное значение, отличное от реализации JavaScript.
Если вы вставите «$ w = false;» в начале функций long2str и str2long зашифрованное значение для реализации PHP становится таким же, как реализация JavaScript, но расшифрованное значение имеет мусор в конце.
Вот некоторые результаты теста с этим изменением:
PHP:
text: >This is an example. !@#$%^&*(){}[]:;<
Base64: PlRoaXMgaXMgYW4gZXhhbXBsZS4gIUAjJCVeJiooKXt9W106Ozw=
key: 8GmZWww5T97jb39W
encrypt: sIubYrII6jVXvMikX1oQivyOXC07bV1CoC81ZswcCV4tkg5CnrTtqQ==
decrypt: >This is an example. !@#$%^&*(){}[]:;<��
Примечание: в конце строки «расшифровать» есть два знака вопроса UTF-8.
JavaScript:
text: >This is an example. !@#$%^&*(){}[]:;<
Base64: PlRoaXMgaXMgYW4gZXhhbXBsZS4gIUAjJCVeJiooKXt9W106Ozw=
key: 8GmZWww5T97jb39W
encrypt: sIubYrII6jVXvMikX1oQivyOXC07bV1CoC81ZswcCV4tkg5CnrTtqQ==
decrypt: >This is an example. !@#$%^&*(){}[]:;<
Причина того, что в реализации JavaScript нет мусора, даже при том, что он не сохраняет длину открытого текста, приведена в комментарии: «Примечание, начинающееся с конца строки, генерирует нули, поскольку побитовые операторы обрабатывают NaN как 0». Другими словами, сгенерированная строка дополняется NUL, которые никогда не видны, хотя JavaScript, как и PHP, может включать NUL в строки, потому что он хранит длину отдельно.
У меня нет мнения о том, какой подход лучше, но его следует выбирать для всех реализаций.
Причина, по которой должен быть стандарт для результата шифрования (независимо от того, преобразован ли двоичный файл в шестнадцатеричный или в base64 для безопасного транзита), заключается в том, что можно использовать, скажем, PHP для кодирования, но JavaScript для декодирования, в зависимости от какие языки естественно использовать в двух местах. В конце концов, шифрование чаще всего используется для связи между двумя местоположениями, а язык, используемый в целевом местоположении, может быть даже неизвестен.
Почему бы не использовать wificlientsecure библиотека? Отлично работает на esp32.