首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >加密IV -C和Python等效物

加密IV -C和Python等效物
EN

Stack Overflow用户
提问于 2018-06-29 19:32:53
回答 2查看 172关注 0票数 1

我在初始化用于加密我的消息的等效“初始化向量”时遇到了问题。我有一个ESP32 (微控制器)通过JSON发送数据到Django服务器。在ESP32上,我使用Arduino IDE,因此ESP32上的代码是用C/C++编写的。当然,Django正在使用Python。

到目前为止,如果我像这样初始化两端的IV,我的加密是有效的:

ESP32:

代码语言:javascript
复制
unsigned char iv[16] = {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'};

Django:

代码语言:javascript
复制
iv = b'0000000000000000'

ESP32的库有一个加密函数,它需要一个无符号字符数组。我必须注意数组不是以null结尾的('\0‘结尾),否则我会得到不同的结果。这些都是背景信息。你需要。现在来看我的具体问题:

我想在我的加密中使用计数器模式。我想复制一个整数计数器到IV的两边的最后4个字节:

在ESP32上,我这样做:

代码语言:javascript
复制
int msg_counter = 15 //15 just as an example
memcpy(iv+12, &msg_counter, sizeof(msg_counter));

在Django上,我这样做:

代码语言:javascript
复制
counter = (int) 15;
iv = counter.to_bytes(16, byteorder = 'big')

如果我打印出变量"iv“,我在Django上得到这个:

代码语言:javascript
复制
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上这样做:

代码语言:javascript
复制
memset(iv,0,16);

代码语言:javascript
复制
b'0000000000000000'

在Django上,我得到了不同的结果。我不知道该怎么办。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-01 22:36:17

我不断尝试,自己也发现了这一点。

在ESP32上,您必须执行以下操作:

代码语言:javascript
复制
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上:

代码语言:javascript
复制
counter = 15;
iv = counter.to_bytes(16, byteorder = 'big')
票数 0
EN

Stack Overflow用户

发布于 2018-06-30 06:14:53

根据其technical manual的1.3.1节,ESP32以little-endian格式存储数据。这意味着创建的IV是由:

代码语言:javascript
复制
int msg_counter = 15;
memcpy(iv+12, &msg_counter, sizeof(msg_counter));

将如下所示:

代码语言:javascript
复制
0 0 0 0 0 0 0 0 0 0 0 0 0x0F 0 0 0

要在Python中实现相同的功能,您需要执行以下操作:

代码语言:javascript
复制
msg_counter = 15
iv = iv[:12] + msg_counter.to_bytes(4, byteorder="little")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51100805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档