Соответствует ли эта схема моим требованиям? Представляет ли усечение последних 48 битов угрозу безопасности?
Схема нарушается пассивным противником, который получает одну пару $(т,р)$. Обратите внимание, что последние 48 бит ключа могут быть восстановлены как $K[:48] = t \oplus r$. Таким образом, злоумышленник теперь может отправлять произвольные $(т^*, г^*)$ значения, которые примет получатель. Напоминая, что верификатор делает следующее
$r' = t' \oplus K$ (оставить только последние 48 бит); проверять $ г = г '$
Мы видим, что знание остального ключа не нужно.
Кроме того, 48-битные значения обеспечивают низкую защиту от коллизий, но это может подойти для вашего приложения...
Повтор: более простая атака состоит в том, чтобы воспроизвести пару $(г, т)$. В описании не сказано, как приемник это проверяет.
Возможное решение: Из первоначального описания кажется, что приемник довольно ограничен в вычислительном отношении, и он может вычислять, например, только xor, а не AES-CTR. Что было бы странно со следующим
Итак, есть какая-то предварительная аутентификация, которая уже произошла, но здесь это не имеет значения.
В любом случае, возможное решение — использование двух псевдослучайных функций, если получатель может делать больше, чем исключающие операции. (Я сомневаюсь, что это безопасно...). Сначала разверните $К$ в $К_1, К_2, К_3$ соответствующей длины.
Отправитель делает следующее
- $ г = $ AES-CTR$(K_1, счетчик)$ (оставить последние 48 бит)
- Отправить $счетчик, г, \тау = HMAC(K_2, счетчик,г)$
Получатель делает следующее
- При получении $ г, тау $, проверять $\тау$
- Счетчик чеков увеличился
- Повторное получение $г$.
Некоторые замечания:
- Вещание здесь даже не нужно, если отправитель и получатель используют одни и те же часы.
- У альтернативы есть несколько проблем, когда речь идет о надежности в случае перезагрузки, как указано в комментарии Пола.