Потоковое шифрование с проверкой подлинности и связанными данными (Streaming AEAD)

Примитив Streaming AEAD обеспечивает шифрование с проверкой подлинности для потоковых данных. Это полезно, когда данные, подлежащие шифрованию, слишком велики, чтобы их можно было обработать за один шаг. Типичные случаи использования включают шифрование больших файлов или потоков данных в реальном времени.

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

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

Реализации потоковой передачи AEAD соответствуют определению AEAD и безопасны по стандарту OAE2 . Они обладают следующими свойствами:

  • Секретность : об открытом тексте ничего не известно, кроме его длины.
  • Подлинность : невозможно изменить зашифрованный открытый текст, лежащий в основе зашифрованного текста, не будучи обнаруженным.
  • Симметричный : шифрование открытого текста и расшифровка зашифрованного текста выполняются одним и тем же ключом.
  • Рандомизация : шифрование рандомизировано. Два сообщения с одинаковым открытым текстом дают разные зашифрованные тексты. Злоумышленники не могут знать, какой зашифрованный текст соответствует данному открытому тексту.

Связанные данные

Потоковая передача AEAD может использоваться для привязки зашифрованного текста к конкретным связанным данным . Предположим, у вас есть база данных с полями user-id и encrypted-medical-history . В этом сценарии user-id может использоваться в качестве связанных данных при шифровании encrypted-medical-history . Это не позволяет злоумышленнику передать историю болезни от одного пользователя к другому.

Выберите тип ключа

Для большинства случаев мы рекомендуем AES128_GCM_HKDF_1MB . В целом:

  • AES128_GCM_HKDF_1MB (или AES256_GCM_HKDF_1MB) — более быстрый вариант. Он может зашифровать 264 файла размером до 264 байт каждый. Во время процесса шифрования и дешифрования потребляется ~1 МБ памяти.
  • AES128_GCM_HKDF_4KB потребляет около 4 КБ памяти и является хорошим выбором, если в вашей системе мало памяти.
  • AES128_CTR_HMAC_SHA256_1MB (или AES256_CTR_HMAC_SHA256_1MB) — более консервативный вариант.

Гарантии безопасности

Реализации потоковой передачи AEAD предлагают:

  • Безопасность CCA2.
  • Уровень аутентификации не менее 80 бит.
  • Возможность шифрования не менее 2 64 сообщений 3 общей длиной 2 51 байт 2 . Никакая атака с использованием до 2 32 выбранных открытых текстов или выбранных зашифрованных текстов не имеет вероятности успеха, превышающей 2 -32 .

Пример варианта использования

См. раздел «Я хочу зашифровать большие файлы или потоки данных» .


  1. Причиной этого ограничения является использование шифра AES-GCM. Шифрование другого сегмента открытого текста в том же месте было бы эквивалентно повторному использованию IV, что нарушает гарантии безопасности AES-GCM. Другая причина заключается в том, что это предотвращает атаки отката, когда злоумышленник может попытаться восстановить предыдущую версию файла без обнаружения.

  2. 2 Поддерживается 32 сегмента, каждый из которых содержит segment_size - tag_size байтов открытого текста. Для сегментов размером 1 МБ общий размер открытого текста составляет 2 32 * (2 20 -16) ~= 2 51 байт.

  3. Потоковая передача AEAD становится небезопасной, когда повторяется комбинация производного ключа (128-бит) и префикса nonce (независимое случайное 7-байтовое значение). У нас есть 184-битная устойчивость к коллизиям, что примерно соответствует 2 64 сообщениям, если мы хотим, чтобы вероятность успеха была меньше 2 -32 .