arduino — шифрование строк esp32 и php XXTEA

Я использую 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?

Заранее спасибо.

2

Решение

Эта проблема может возникать из-за того, что входные данные имеют другой тип данных, поскольку ни одна из текущих реализаций 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 для декодирования, в зависимости от какие языки естественно использовать в двух местах. В конце концов, шифрование чаще всего используется для связи между двумя местоположениями, а язык, используемый в целевом местоположении, может быть даже неизвестен.

1

Другие решения

Почему бы не использовать wificlientsecure библиотека? Отлично работает на esp32.

0

По вопросам рекламы [email protected]