我在初始化用于加密邮件的等效“初始化向量”时遇到问题。 我有一个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的库具有加密功能,需要一个未签名的char数组。我必须注意,数组不是以空值结尾(末尾为'\ 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(密钥,AES.MODE_CFB,iv,segment_size = 128) IV必须以类似b'0000000000000000'的格式传递。所以我在服务器端没有其他选择。
如果我在ESP32上执行此操作:
memset(iv,0,16);
和
b'0000000000000000'
在Django上,我得到了不同的结果。我不知道该怎么办。
有什么想法吗?
答案 0 :(得分:0)
根据其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")
答案 1 :(得分: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')