1

我在为我的消息加密初始化等效“初始化向量”时遇到问题。我有一个 ESP32(微控制器)通过 JSON 向 Django 服务器发送数据。在 ESP32 上我使用 Arduino IDE,所以 ESP32 上的代码是用 C/C++ 编写的。Django 当然是使用 Python。

如果我在双方都像这样初始化 IV,我的加密工作到目前为止:

ESP32:

unsigned char iv[16] = {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};

姜戈:

iv = b'0000000000000000'

ESP32 的库有一个加密函数,它需要一个无符号字符数组。我必须注意数组不是以空值结尾的(最后是'\0'),否则我会得到不同的结果。这就是背景信息。你需要。现在到我的具体问题:

我想在我的加密中使用计数器模式。我想将一个整数计数器复制到两侧 IV 的最后 4 个字节:

在 ESP32 上,我这样做:

int msg_counter = 15 //15 just as an example
memcpy(iv+12, &msg_counter, sizeof(msg_counter));

在 Django 上,我这样做:

counter = (int) 15;
iv = counter.to_bytes(16, byteorder = 'big')

如果我打印出变量“iv”,我会在 Django 上得到这个:

b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f'

解密失败。我没有从服务器上的 ESP32 收到原始消息。

如果我不像上面那样初始化 IV,我总是会得到不同的结果。

我正在使用 PyCryptoDome 对 Django 进行加密/解密。我将 IV 传递给这行代码: obj = AES.new(enckey, AES.MODE_CFB, iv, segment_size = 128) IV 必须以类似 b'0000000000000000' 的格式传递。所以我在服务器端没有任何其他选择。

如果我在 ESP32 上这样做:

memset(iv,0,16);

b'0000000000000000'

在 Django 上,我得到不同的结果。我不知道该怎么做。

有任何想法吗?

4

2 回答 2

0

根据其技术手册第 1.3.1 节,ESP32 以little-endian格式存储数据。这意味着 IV 由以下人员创建:

int msg_counter = 15;
memcpy(iv+12, &msg_counter, sizeof(msg_counter));

看起来像:

0 0 0 0 0 0 0 0 0 0 0 0 0x0F 0 0 0

要在 Python 中实现相同的功能,您需要执行以下操作:

msg_counter = 15
iv = iv[:12] + msg_counter.to_bytes(4, byteorder="little")
于 2018-06-29T22:14:53.120 回答
0

我不断尝试并自己发现了它。

在 ESP32 上,您必须执行以下操作:

int msg_counter = 15;
unsigned char iv[16];
unsigned char bytes[4];
bytes[0] = (msg_counter >> 24) & 0xFF;
bytes[1] = (msg_counter >> 16) & 0xFF;
bytes[2] = (msg_counter >> 8) & 0xFF;
bytes[3] = msg_counter & 0xFF;
memcpy(iv+12, bytes, sizeof(bytes));

在 Django 上:

counter = 15;
iv = counter.to_bytes(16, byteorder = 'big')
于 2018-07-01T14:36:16.783 回答