3

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

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

我尝试将 XXTEA 协议与这些库一起用于PHPesp32

但是加密的字符串不会在 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

提前致谢。

4

2 回答 2

1

这个问题可能是由于输入的数据类型不同,因为当前的 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 进行解码,具体取决于哪些语言在两个地方很自然地使用。毕竟,加密最常用于两个位置之间的通信,甚至可能不知道目标位置使用的语言。

于 2018-10-25T17:54:10.380 回答
0

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

于 2018-09-13T19:06:10.803 回答