Источник и важность nonce/IV для протокола с использованием AES-GCM

Я делаю протокол, который использует пакеты (т.е. не потоки), зашифрованные с помощью AES. Я решил использовать GCM (основанный на CTR), потому что он обеспечивает интегрированную проверку подлинности и является частью NSA Suite B. Ключи AES обсуждаются с использованием ECDH, где открытые ключи подписываются доверенными контактами как часть веб- что-то вроде ECDSA. Я считаю, что мне нужен 128-битный вектор nonce/initialization для GCM, потому что, хотя я использую 256-битный ключ для AES, он всегда имеет 128-битный блочный шифр (правда?) используя 96-битный IV после считывания кода BC.

Я определенно не реализую свои собственные алгоритмы (только протокол - мой крипто провайдер - BouncyCastle), но мне все еще нужно знать, как использовать этот nonce, не снимая себя в ногу. Ключ AES, используемый между двумя людьми с теми же ключами DH, останется постоянным, поэтому я знаю, что тот же самый nonce не должен использоваться для более чем одного пакета.

Могу ли я просто добавить 96-битное псевдослучайное число в пакет и использовать получателя как nonce? Это одноранговое программное обеспечение, и пакеты могут быть отправлены либо в любое время (например, мгновенное сообщение, запрос на передачу файлов и т.д.), А скорость - большая проблема, поэтому было бы неплохо не использовать безопасный случайный номер источника. Ночь не обязательно должна быть секретной, верно? Или обязательно такой случайный, как "криптографически безопасный" PNRG? Википедия говорит, что она должна быть случайной, или же она восприимчива к выбранной атаке открытого текста - но там есть "цитата" рядом с обеим утверждениями, и я не уверен, что это верно для блочных шифров. Могу ли я использовать счетчик, который подсчитывает количество отправленных пакетов (отдельно от счетчика числа 128-битных блоков) с заданным ключом AES, начиная с 1? Очевидно, это сделало бы nonce предсказуемым. Учитывая, что GCM аутентифицируется, а также шифрует, может ли это нарушить его функции аутентификации?

Ответ 1

GCM является блочным шифром режим счетчика с аутентификацией. Режим счетчика эффективно превращает блок-шифр в потоковый шифр, и поэтому многие правила шифрования потоков все еще применяются. Важно отметить, что тот же Key + IV всегда будет генерировать тот же поток PRNG, и повторное использование этого потока PRNG может привести к тому, что злоумышленник получит простой текст с простым XOR. В протоколе один и тот же ключ + IV может использоваться для жизни сеанса, пока счетчик режимов не завершает (int overflow). Например, протокол может иметь две стороны, и у них есть общий ключ общего доступа, тогда они могут согласовывать новый криптографический Nonce, который используется как IV для каждого сеанса (помните, что nonce означает использование ТОЛЬКО ОДИН РАЗ).

Если вы хотите использовать AES в качестве блочного шифрования, вы должны изучить режим CMAC или, возможно, вариант OMAC1. В режиме CMAC применяются все правила для CBC. В этом случае вам нужно будет убедиться, что каждый пакет использует уникальный IV, который также случайный. Однако важно отметить, что повторное использование IV не имеет почти столь же тяжелых последствий, как повторное использование потока PRNG.

Ответ 2

Я предлагаю не создавать собственный протокол безопасности. Есть несколько вещей, которые вам нужно учитывать, что даже квалифицированный криптограф может ошибаться. Я бы назвал вас TLS протокол (RFC5246) и протокол TLS дейтаграммы (RFC 4347). Выберите библиотеку и используйте их.

Относительно вашего вопроса с IV в режиме GCM. Я расскажу вам, как это делают DTLS и TLS. Они используют явное nonce, то есть номер последовательности сообщений (64-разрядные), который включен в каждый пакет, с секретной частью, которая не передается (верхние 32 бита) и получена из первоначального обмена ключами (отметьте RFC 5288 для более подробная информация).