У меня есть устройство, которому необходимо взаимодействовать с другим хостом и обмениваться сообщениями фиксированной длины.
Весь трафик должен быть зашифрован и аутентифицирован, и он должен быть устойчив к повторным атакам. К сожалению, полагаться на TLS нельзя, поэтому мне нужно реализовать какой-то собственный протокол. У меня есть контроль над обоими устройствами, поэтому я могу безопасно генерировать и распространять общий ключ $к$.
Я думал использовать AEAD с блочным шифром для выполнения тяжелой работы, например, AES в режиме GCM. Проблема, с которой я сталкиваюсь, заключается в предотвращении повторных атак, и я придумал следующую идею. Назовем устройства $А$ и $В$ и рассмотреть сообщение от $А$ к $В$ Только.
- $А$ генерирует случайную строку $а$ и отправляет его на $В$.
- $В$ генерирует случайную строку $b$ и отправляет его на $А$.
- Обе $А$ и $В$ вычислять $h=H(k \Vert a \Vert b)$ для некоторой криптографической хеш-функции $Ч$и использовать $ч$ как первый вектор инициализации для схемы AEAD.
В любое время $А$ нужно отправить сообщение $м$ к $В$, он шифрует $м$ чтобы получить соответствующий зашифрованный текст $с$, вычисляет тег аутентификации $t$, и отправляет $c \Верт т$ к $А$ (сообщения имеют фиксированную длину, поэтому длина $c \Верт т$ является постоянным). затем $А$ приращения $ч$ и повторно инициализирует схему AEAD с новым IV $ч$.
Процесс расшифровки аналогичен: $В$ получает $c \Верт т$, расшифровывает $с$ в $м$, аутентифицирует сообщение с помощью тега $t$, приращения $ч$, и повторно инициализирует схему AEAD с новым значением $ч$.
Сообщение от $В$ к $А$ полностью симметрична, за исключением того, что начальные IV $H(k \Верт б \Верт а)$.
Есть ли какой-либо очевидный недостаток в приведенной выше идее? Я заново изобретаю велосипед? Если да, то какое решение может быть использовано для решения этой проблемы?