Криптография

Потоковые шифры

TLS 1.3 в браузере устанавливает соединение с сервером - в 0-RTT режиме первые зашифрованные данные летят ещё до подтверждения handshake. Для шифрования этого потока используется ChaCha20 или AES-CTR - потоковые шифры, способные шифровать произвольное количество байт без блочного выравнивания.

  • **TLS 1.3**: ChaCha20-Poly1305 - один из двух обязательных AEAD-шифров. Cloudflare обрабатывает миллиарды HTTPS-запросов в день с ChaCha20.
  • **WireGuard VPN**: использует ChaCha20-Poly1305 как единственный шифр - простота криптографии считается преимуществом перед OpenVPN с его 20+ вариантами шифров.
  • **GSM A5/1**: потоковый шифр на LFSR, защищающий голосовые звонки. Взломан в 2003 году, но продолжает использоваться в 2G-сетях по всему миру.
  • **SSH**: AES-CTR или ChaCha20-Poly1305 для шифрования интерактивного терминального трафика - потоковый режим критичен для интерактивности.

RC4: история взлёта и падения

RC4 (Rivest Cipher 4) создан Роном Ривестом в 1987 году для RSA Security. Алгоритм настолько прост, что умещается в 30 строк кода - 256-байтная таблица перестановок S-box и два счётчика i, j. Ключ инициализирует S-box через KSA (Key-Scheduling Algorithm), затем PRGA (Pseudo-Random Generation Algorithm) выдаёт поток байт, которые XOR-ятся с открытым текстом.

RC4 сломан. В 2015 году RFC 7465 запретил RC4 в TLS. Атаки Bar-Mitzvah и NOMORE восстанавливают cookies HTTPS-сессий за несколько часов. WEP (RC4 с 24-битным IV) взламывается за минуты. Ни в одном новом проекте RC4 использовать нельзя.

Главная проблема RC4 - bias в первых байтах keystream: байт 0 с вероятностью 2/256 равен нулю вместо ожидаемых 1/256. Это статистически различимо от случайного потока. Атака BEAST использовала похожий bias для расшифровки HTTPS в реальном браузере.

Почему RC4 запрещён в TLS согласно RFC 7465?

ChaCha20: потоковый шифр от Бернштейна

ChaCha20 разработан Дэниелом Бернштейном в 2008 году как улучшение Salsa20. Google перевёл Android и Chrome на ChaCha20-Poly1305 в 2014 году, RFC 7539 стандартизировал его в 2015. Сегодня это один из двух обязательных шифров в TLS 1.3, наряду с AES-GCM.

ChaCha20 использует только операции ADD-XOR-ROTATE (ARX) - никаких lookup tables. Это даёт иммунитет к cache-timing атакам, которые опасны для AES на процессорах без аппаратного AES-NI. Cloudflare обслуживает ~40% HTTPS-трафика интернета с ChaCha20-Poly1305.

Пара ChaCha20-Poly1305 - это AEAD (Authenticated Encryption with Additional Data): шифрование + аутентификация в одном примитиве. Poly1305 - MAC на основе полиномиальных вычислений над полем GF(2^130-5). Вместе они обеспечивают конфиденциальность и целостность без отдельного HMAC.

Почему ChaCha20 предпочтительнее AES на мобильных устройствах без AES-NI?

Salsa20: предшественник ChaCha20

Salsa20 - тот же Бернштейн, 2005 год. Выбран в финал eSTREAM - европейского конкурса потоковых шифров (2004-2008). Salsa20/8 и Salsa20/12 (8 и 12 раундов) признаны eSTREAM Portfolio. ChaCha20 - это Salsa20 с изменённым порядком XOR для лучшего диффузионного распространения.

Salsa20 используется в NaCl (Networking and Cryptography library) от Бернштейна и в libsodium. libsodium выбирает XSalsa20 (Salsa20 с расширенным 192-битным nonce через HSalsa20) для длинноживущих ключей.

Чем ChaCha20 лучше Salsa20?

LFSR: аппаратные потоковые генераторы

LFSR (Linear Feedback Shift Register) - регистр сдвига с линейной обратной связью. Ячейка состояния сдвигается, а новый бит вычисляется как XOR нескольких позиций (тапов). При правильно выбранном образующем полиноме LFSR длиной n бит генерирует последовательность периода 2^n - 1 (m-последовательность).

Одиночный LFSR криптографически ненадёжен: линейный тест Берлекэмпа-Мэсси восстанавливает образующий полином и начальное состояние по 2n битам выхода. Для безопасности LFSR комбинируют нелинейными функциями (Grain, Trivium) или используют фильтрующий генератор.

Trivium - компактный аппаратный шифр eSTREAM Portfolio: три LFSR по 93, 84 и 111 бит с нелинейными связями. Одна итерация требует 3 AND и 11 XOR - идеально для RFID и IoT устройств с ограниченными ресурсами.

Длинный LFSR безопасен, потому что период 2^n слишком велик для перебора

Длина периода не защищает от алгоритма Берлекэмпа-Мэсси, который работает за O(n^2) и восстанавливает весь генератор по 2n известным битам

Безопасность требует нелинейности. Любая линейная система (включая LFSR) уязвима для линейного алгебраического анализа независимо от размера состояния.

Почему одиночный LFSR не используется как потоковый шифр?

Ключевые идеи

  • **RC4 сломан** - статистический bias позволяет восстановить plaintext. RFC 7465 запрещает RC4 в TLS. Никогда не использовать в новых системах.
  • **ChaCha20** - современный стандарт: ARX-операции без lookup tables дают иммунитет к cache-timing атакам. ChaCha20-Poly1305 = шифрование + MAC в одном примитиве.
  • **LFSR** - быстрые аппаратные генераторы, но линейная алгебра (Берлекэмп-Мэсси) взламывает одиночный LFSR по 2n битам. Безопасны только нелинейные комбинации.
  • **Nonce**: повторное использование nonce в любом потоковом шифре катастрофично - XOR двух ciphertext при одном ключе и nonce раскрывает XOR открытых текстов.

Связанные темы

Потоковые шифры - часть большой картины симметричной криптографии:

  • AES-GCM — AES в режиме CTR фактически превращается в потоковый шифр + GHASH MAC. Конкурент ChaCha20-Poly1305 в TLS 1.3.
  • TLS 1.3 — Протокол выбирает между ChaCha20-Poly1305 и AES-GCM. Клиент предлагает список cipher suites, сервер выбирает.
  • Poly1305 MAC — Часть AEAD-пары ChaCha20-Poly1305. Полиномиальный MAC над GF(2^130-5) обеспечивает аутентификацию.

Вопросы для размышления

  • Если ChaCha20 и AES-GCM оба безопасны, по какому критерию TLS-клиент должен предпочесть один другому?
  • Почему повторное использование nonce в потоковом шифре опаснее, чем повторное использование IV в CBC?
  • Как LFSR используются в Bluetooth (E0) и какие уязвимости это создаёт?

Связанные уроки

  • alg-35-bit-manipulation
  • nt-03
Потоковые шифры

0

1

Войти