LINUX.ORG.RU

Вопрос про шифрование AES

 


1

1

Здравствуйте.

У меня есть программа (для микроконтроллера), которая должна посылать пакет данных по UART'у. Эти данные я зашифровываю с помощью этой библиотеки https://github.com/kokke/tiny-AES-c

Принимающее устройство расшифровывает этот пакет.

Собственно вот функция шифрования...


void encrypt_cbc(uint8_t *in_buf, uint16_t count_byte)
{
    uint8_t key[] = {0x62, 0x4d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81,
                      0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4};

    uint8_t iv[]  = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

    struct AES_ctx ctx;
    AES_init_ctx_iv(&ctx, key, iv);
    AES_CBC_encrypt_buffer(&ctx, in_buf, count_byte);
}

Вот так я подаю свой (не зашифрованный) массив (небольшой байт 10) в эту функцию...

encrypt_cbc(crypt_buff, SIZE_PACKET);

И на выходе получаю зашифрованный массив.

Функция в свою очередь передаёт всё хозяйство в библиотечный файл aes.c https://github.com/kokke/tiny-AES-c/blob/master/aes.c#L76

Вопрос вот в чём. Скажите пожалуйста, можно ли сделать так, чтоб в зашифрованном пакете НЕ встречался символ 0x7E ?

Этот символ служит у меня маркером конца передачи. Других вариантов маркеров нет и сделать их не возможно.


Можно. Для достижения заявленной тобой цели нужна схема кодирования, в которой ты будешь как-то его избегать. Будет ресурсозатратно и заморочно.

На самом деле тебе надо крепко задуматься, не переделать ли тебе наружный протокол, или, если он до тебя придуман мудрым старцами, выяснить, как по их мнению в него прикажете энкапсулировать произвольный payload.

AES не при чем.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Используй идею крипты. Если при кодировании появился вредный символ, прибавляй к исходной строке произвольный символ/число, чтобы изменить результат шифрования до требуемого т.е., не содержащего символа 0x7E. После расшифровки отбрасывай «вариативную часть».

Jurik_Phys ★★★★★
()
Ответ на: комментарий от Jurik_Phys

мне кажется, этот способ сильно зависит от величины шифруемого блока и как следствие вероятности появления запретной комбинации. при больших блоках можно постоянно получать эту комбинацию в потоке на любых данных.

AVL2 ★★★★★
()

При шифровании

0xFF Заменяй на 0xFF 0x00
0x7E Заменяй на 0xFF 0x01

При расшифровании

0xFF 0x00 Заменяй на 0xFF 
0xFF 0x01 Заменяй на 0x7E

То есть 0xFF будет использоваться как escape-символ.

uuencode - слишком избыточно, достаточно введение escape-символа

Psilocybe ★★★★
()
Последнее исправление: Psilocybe (всего исправлений: 3)

можно ли сделать так, чтоб в зашифрованном пакете НЕ встречался символ 0x7E ?

Этот символ служит у меня маркером конца передачи. Других вариантов маркеров нет и сделать их не возможно

Читайте про байт-стаффинг.

akk ★★★★★
()
Ответ на: комментарий от stD

Так как в пакете возможна любые комбинации полезных байтов.

escape-последовательности как бы расширяют любые последовательности полезных байтов.

Приведи пример, когда не получится.

Psilocybe ★★★★
()

Других вариантов маркеров нет и сделать их не возможно.

если вначале пакета отправлять количество байт которые надо принять, тогда никакие костыли не нужны будут

Rost ★★★★★
()