我在初始化消息加密的等效“初始化向量”时遇到问题。
我有一个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'};
Django公司:
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得到原始消息。
如果我不像上面那样初始化静脉注射,我总是得到不同的结果。
我在Django上使用PyCryptoDome进行加密/解密。
我要把IV传给这行代码:
obj=AES.new(enckey,AES.MODE_CFB,iv,segment_size=128)
IV必须以类似于b'0000000000000000'的格式传递。所以我在服务器端没有其他选择。
如果我在ESP32上这么做:
memset(iv,0,16);
和
b'0000000000000000'
在Django我得到了不同的结果。我不知道该怎么办。
有什么想法吗?
最佳答案
根据itstechnical manual的1.3.1节,ESP32以little-endian格式存储数据。这就是说,第四部由:
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")