Шифрование IV - C и Python эквивалент - PullRequest
0 голосов
/ 29 июня 2018

У меня проблемы с инициализацией эквивалентных «векторов инициализации» для шифрования моего сообщения. У меня есть ESP32 (микроконтроллер), отправляющий данные через JSON на сервер Django. На ESP32 я использую Arduino IDE, поэтому код на ESP32 написан на C / C ++. Джанго, конечно, использует 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 имеет функцию шифрования, которая ожидает массив unsigned char. Я должен обратить внимание, что массив не заканчивается нулем ('\ 0' в конце), или я получаю другие результаты. Это справочная информация. тебе нужно. Теперь к моей конкретной проблеме:

Я хочу использовать режим счетчика в своем шифровании. Я хочу скопировать счетчик целых чисел в последние 4 байта IV с обеих сторон:

На ESP32 я делаю:

int msg_counter = 15 //15 just as an example
memcpy(iv+12, &msg_counter, sizeof(msg_counter));

На Джанго я делаю:

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 ,gment_size = 128) IV должен быть передан в таком формате, как этот b'0000000000000000. Поэтому у меня нет других вариантов на стороне сервера.

Если я сделаю это на ESP32:

memset(iv,0,16);

и

b'0000000000000000'

на Джанго я получаю разные результаты. Я не знаю, что делать.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Я продолжал пытаться и нашел это сам.

На 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));

На Джанго:

counter = 15;
iv = counter.to_bytes(16, byteorder = 'big')
0 голосов
/ 30 июня 2018

В соответствии с разделом 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")
...