У меня проблемы с инициализацией эквивалентных «векторов инициализации» для шифрования моего сообщения.
У меня есть 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'
на Джанго я получаю разные результаты. Я не знаю, что делать.
Есть идеи?