我在初始化用于加密我的消息的等效“初始化向量”时遇到了问题。我有一个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的库有一个加密函数,它需要一个无符号字符数组。我必须注意数组不是以null结尾的('\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上,我得到了不同的结果。我不知道该怎么办。
有什么想法吗?
发布于 2018-07-01 22:36:17
我不断尝试,自己也发现了这一点。
在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-06-30 06:14:53
根据其technical manual的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")
https://stackoverflow.com/questions/51100805
复制相似问题