python - 加密 IV - C 和 Python 等效

标签 python c django encryption esp32

我在为我的消息加密初始化等效“初始化 vector ”时遇到问题。 我有一个 ESP32(微 Controller )通过 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 的库有一个加密函数,需要一个 unsigned char 数组。我必须注意该数组不是以 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 上我得到了不同的结果。我不知道该怎么办。

有什么想法吗?

最佳答案

根据其 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")

关于python - 加密 IV - C 和 Python 等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51100805/

相关文章:

python - Pandas :获得最多计数标签

python - 如何在 python 中将键码转换为字符?

c - 如何在 C 中创建一个非常基本的线程函数

c - 从标准输入中读取一个整数(在 C 中)

c - 在多个字符串的偶数和奇数位置打印字符

python - 从 django 模板解析 session

python - Django 在模型内调用另一个模型的 upload_to

AWS ECS 中的 Python 应用程序。如何链接到外部应用程序配置?

javascript - 如何在html和javascript中声明全局变量

python - 更改Python中的重复值