esp32 和 php XXTEA 字符串加密

Posted

技术标签:

【中文标题】esp32 和 php XXTEA 字符串加密【英文标题】:esp32 and php XXTEA strings encryption 【发布时间】:2019-02-18 03:04:15 【问题描述】:

我正在使用带有 "HTTPClient.h" 库的 esp32(Arduino 平台不是 esp-idf)向我的 php 服务器发送带有参数的 get 请求。

我想加密参数值并在我的 PHP 代码中解密它们,反之亦然(我的服务器将 JSON 数据发送回我的 esp32)。

我尝试将 XXTEA 协议与这些库一起用于 PHP 和 esp32。

但加密后的字符串在 PHP 上无法正确解密。

例子:

当我使用密钥"ENCRYPTION KEY" 在我的esp32 上加密"HELLO WORLD" 时,我得到了这个:

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 之间进行加密字符串通信?

提前致谢。

【问题讨论】:

Encrypted strings communication between esp32 and php的可能重复 我删除了旧的,因为一个离点阻塞或保持或类似的东西 由于问题的问题而被搁置。重新发布它不是解决这个问题的好方法。 我认为主要问题是你的问题太宽泛了。 PHP 和 ESP32 都能够加密,但 Stack Overflow 不太适合此类广泛的问题,因为响应可能主要是基于意见的。我建议改用 ESP32 论坛@ESP32.com。 我也会尝试在那里发布,我还在 github 上发布了图书馆的错误,但我没有得到回应,所以我来到这里。我在互联网上到处寻找方法,但没有找到任何关于我想在我的 PHP 和我的 esp32 之间使用的加密通信。 【参考方案1】:

这个问题可能是由于输入的数据类型不同,因为当前的 XXTEA 实现似乎没有进行任何类型或范围检查。

也可能是由于所涉及的两台计算机的字节序行为不同,因为二进制文件通常存储为由字节构成的单词数组。

也可能是由于缺少正确加密特定字符串和密钥的官方或标准参考示例。在没有参考示例的情况下(使用二进制加密结果的十六进制或 base64 转换),即使其结果使用相应的解密实现正确解密,也无法判断加密实现是否正确。

添加:

我想我在 XXTEA 的已发布代码中发现了一个兼容性问题。可能值得在这里花一些空间来讨论它。

具体来说,问题在于不同的实现会为加密相同的明文和密钥创建不同的结果。

讨论:

这个问题是由于添加了明文的长度作为 longs 数组的最后一个元素。虽然这解决了长度不是 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进行解码,取决于在两个位置自然使用哪种语言。毕竟,加密最常用于两个位置之间的通信,甚至可能不知道目标位置使用的语言。

【讨论】:

【参考方案2】:

为什么不使用wificlientsecure 库?在 esp32 上效果很好。

【讨论】:

我在 HTTPClient 库上使用 ssl,但这不是我想要的。我想加密通过 HTTP 请求发送到我的 PHP 脚本的数据。 这个答案没有回答问题。

以上是关于esp32 和 php XXTEA 字符串加密的主要内容,如果未能解决你的问题,请参考以下文章

2019红帽杯部分wp

介绍XXTEA加密算法及其C实现

跨平台的加密算法XXTEA 的封装

xxtea---单片机数据加密算法

SQLite XXTea加密学习

xxtea 文件加密与解密