использование tiny-AES-c для зашифрованной беспроводной связи - PullRequest
0 голосов
/ 19 декабря 2018

Недавно я ознакомился с реализацией AES в C для встраиваемых систем и пытался использовать ее в беспроводном соединении «точка-ко-многим точкам» (или «точка-точка» для начинающих).

Код корректно компилируется на моей платформе и, похоже, дает правильные результаты при использовании тестового кода, предоставляемого в режиме CTR, вплотную (этот режим CRT - то, что мне требуется, поскольку мои пакеты имеют размер 120 байтов каждый и не могут быть изменены).

По сути, передатчик Tx должен использовать функцию шифрования tiny-AES, чтобы генерировать непрерывный поток зашифрованных пакетов по 120 байтов каждый, передавать их с прикрепленным CTR и заголовком и т. Д., А также принимать и дешифровать надругой конец приемником Rx.

Предусматривается, что передатчик Tx и приемник Rx используют точно один и тот же крошечный код AES с тем же ключом, который известен только мне.Этот ключ может быть установлен и будет отличаться для разных пар Tx-Rx.

Мой вопрос касается, в частности, режима CRT и использования следующих функций как на Tx, так и на Rx:

/* Initialize context calling (iv can be NULL): */
void AES_ctx_init(AES_ctx *ctx, uint32_t keylen, const uint8_t *key, const uint8_t *iv);

/* ... or reset IV or key at some point: */
void AES_ctx_set_key(AES_ctx *ctx, uint32_t keylen, const uint8_t *key);
void AES_ctx_set_iv(AES_ctx *ctx, const uint8_t *iv);

Итак

  1. Какова цель AES_ctx_init() и выполняется ли это только один раз в начале сеанса шифрования / дешифрования защищенной линии?
  2. Чтоцель функции AES_ctx_set_iv() и опять же, выполняется ли это только один раз в начале сеанса защищенного канала?Комментарий «... или сбросить IV или ключ в какой-то момент» мне не понятен - причина моего вопроса ... То есть когда нужно сбрасывать IV при использовании AES в режиме CRT?
  3. Требуется ли для Tx и Rx использовать один и тот же IV, и можно ли оставить его как есть или его нужно менять при каждом новом сеансе защищенной линии?Я понимаю, что секретный ключ обычно выбирается для пары Tx / Rx и изменяется пользователем только на обоих при необходимости, но обычно он остается неизменным для каждого сеанса.Это вообще правильно?Является ли это случаем (или нет) для IV, и в какой момент можно сбросить IV?

В беспроводных линиях связи из-за шума, и если нет реализации FEC,получатель будет вынужден отбросить пакеты из-за неправильных CRC.В моей ссылке CRC проверяется для полученного 120-байтового пакета (один за другим, когда они получены), и начинается дешифрование для восстановления исходных данных, если CRC верен, но данные отбрасываются, если нет.Каковы последствия этого для потока зашифрованных пакетов Tx, поскольку они продолжают передаваться независимо от того, как не существует протокола дрожания рук, чтобы сообщить Tx, что Rx отбросил пакет из-за ошибки CRC, если таковая имеется?

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


ИтакВот некоторые дальнейшие комментарии и ответы, уже сделанные.По сути, пара Tx / Rx имеет заранее заданную структуру пакета с определенной полезной нагрузкой, CRC заголовка и т. Д., Но давайте назовем это «пакетом».Полезная нагрузка - это то, что мне нужно, чтобы зашифровать, и это установлено в 120 байтов, не подлежит обсуждению независимо, и это находится в пакете.Итак, вы говорите, что при каждой передаче пакета Tx и Rx должны будут изменять одноразовый номер с каждым пакетом, и оба Tx & Rx должны использовать один и тот же одноразовый номер с каждой обработкой пакета?

Скажем, я начинаю передачу, и у меня есть пакет (1), пакет (2)… пакет (n) и т. Д., Затем с каждым переданным пакетом мне нужно обновить «счетчик», и что и передатчик, и приемник должны быть синхронизированы так,что оба используют один и тот же nonce в сеансе?

Это может быть проблематично, когда и если из-за шума или помех система Tx / Rx теряет синхронизацию, как это может произойти, и каким-то образом два независимых счетчика дляnonce больше не синхронизируются и на одной странице, так сказать ... вообще session не потребует в среднем более 2 ^ 16 пакетов, так что вы можете обойти это?Как я уже сказал, вопрос об отправке другого одноразового номера с каждым отдельным пакетом полностью исключен, поскольку полезная нагрузка уже завершена и полна.

Другой способ, которым я подумал, возможно, вы можете пролить некоторый свет, если это можетработа, есть через GPS.Скажем, если у каждого Tx и Rx есть каждый модуль GPS (что имеет место), то информация о синхронизации может быть получена из часов GPS на обоих Tx и Rx, поскольку оба получат это независимо, и некоторый вид синхронизированного счетчика может быть переведен вобновить одноразовый номер на обоих, скажем, от 0 до 2 ^ 16 в сеансе ... вы согласны?Таким образом, даже если из-за шума / помех пакеты будут потеряны приемником, счетчик продолжит обновлять одноразовый номер с некоторой формой надежного «тика» в фоновом режиме…

Что касается источника энтропии, хорошоочевидно, ламповая схема обеспечит это для хорошего PRNG, работающего локально, скажем, для сеанса из 2 ^ 16 пакетов, но это еще не доступно в моей системе, но может быть, если мы решим пойти дальше…

Что вы думаете об этом как профессионал в этой области?С уважением,

1 Ответ

0 голосов
/ 19 декабря 2018

Я предполагаю, что Tiny AES, на который вы ссылаетесь, равен tiny-AES-c (хотя ваш код немного отличается от этого кода; я не могу найти где-нибудь, что AES_ctx_set_key являетсяопределены).Я предполагаю, что когда вы говорите «режим CRT», вы имеете в виду режим CTR.

Какова цель AES_ctx_init (), и это делается только один раз в начале сеанса шифрования / дешифрования защищенной ссылки?

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

В режиме CTR абсолютно важно, чтобы комбинация Key + Nonce (IV) быланикогда не используется повторно в двух разных сообщениях.(Режим CTR технически не имеет «IV». Он имеет «nonce», но он выглядит точно так же, как IV и передается идентично в каждой криптографической библиотеке, которую я когда-либо видел.) Если вам нужно повторно использовать nonce,Вы должны изменить ключ.Как правило, это означает, что вам придется поддерживать постоянный (то есть при перезагрузке системы) счетчик на вашем устройстве шифрования, чтобы отслеживать последний использованный одноразовый номер.Существуют способы безопасного использования полуслучайного одноразового номера, но вам нужен высококачественный источник энтропии, который часто недоступен на встроенных устройствах.

Если вы передаете NULL в качестве IV / nonce и повторно используетеключ, режим CTR является почти бесполезной схемой шифрования.

Поскольку вам необходимо иметь возможность аккуратно отбрасывать пакеты, вам нужно будет отправить одноразовый номер вместе с каждым пакетом.Одноразовый номер не является секретом;это просто должно быть уникальным для данного ключа.Одноразовый номер имеет длину 16 байтов.Если это слишком много данных, общий подход заключается в обмене первых 12 байтов одноразового номера в начале сеанса, а затем использовать нижние 4 байта в качестве счетчика, начинающего 0. Если сеансы могут быть длиннее, чем 2 ^ 32блоков, тогда вам нужно будет сбросить сеанс после исчерпания значений.

Имейте в виду, что здесь "блоки" имеют длину 16 байтов, и каждый блок требует своего собственного одноразового номера.Чтобы вписаться в 120 байтов, вы, вероятно, сделаете что-то вроде отправки 4-байтового начального счетчика, а затем добавите 7 блоков для n, n + 1, n + 2, ... n + 6.

Разработка этогоНу, это немного сложно, и это легко сделать неправильно и подорвать вашу криптографию.Если это важно, вам, вероятно, следует привлечь кого-то с опытом, чтобы разработать это для вас.Я делаю такую ​​работу, но я уверен, что вы можете найти много людей.


Итак, вы говорите, что при каждой передаче пакета Tx и Rx будутНужно изменить одноразовый номер с каждым пакетом, и оба Tx и Rx должны использовать один и тот же одноразовый номер с каждой обработкой пакета?

Правильно.Сторона Tx будет определять одноразовый номер, а сторона Rx будет его использовать.Хотя они могут координировать что-то иное, чем отправка явно, если это никогда не повторяется, и они всегда соглашаются.Это одно из преимуществ режима CTR;он полагается на «счетчик», который не обязательно отправлять.

Часы хороши тем, что не повторяются.Сложная часть остается синхронизированной, но при этом вы абсолютно уверены, что вы не используете одноразовый номер.Проще синхронизироваться, если временное окно для каждого одноразового номера велико.Проще убедиться, что вы никогда не будете повторно использовать одноразовый номер, если временное окно мало.Хорошим подходом может быть объединение производного от часов одноразового номера с последовательным счетчиком.На приемной стороне все еще будут возникать проблемы с синхронизацией, когда получателю нужно попробовать несколько разных счетчиков (или счетчиков nonce +), чтобы найти правильный.Но это должно быть возможно.

Обратите внимание, что синхронизация предполагает, что существует способ отличить действительный открытый текст от недействительного открытого текста.Если в открытом тексте есть структура, то вы можете попробовать одноразовый номер, а если вывод - бессмысленный, попробуйте другой.Но если для открытого текста нет структуры, то у вас есть большая проблема, потому что вы не сможете синхронизироваться.Под «структурой» я подразумеваю, «можете ли вы определить разницу между действительными данными и случайным шумом.

Использование часов, если ваше окно достаточно мало, чтобы вы никогда не использовали повторно начальный одноразовый номер, даже при перезагрузке,Вы могли бы избежать необходимости в PRNG. Одноразовый номер не должен быть случайным, он просто никогда не может повториться.

Обратите внимание, что если у вас есть 4-байтовая счетная часть, то у вас есть 2 ^ 32 блока, а не2 ^ 16.

...