我在为我的消息加密初始化等效“初始化向量”时遇到问题。我有一个 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 上,我得到不同的结果。我不知道该怎么做。
有任何想法吗?