Поточные шифры: bit-flipping и повтор ключа
Поточный шифр превращает ключ и nonce в длинную псевдослучайную последовательность и складывает её с сообщением побитово. Это быстро, просто и удобно для потоковых данных, но у него есть два слабых места, которые эксплуатируются десятилетиями: операция XOR линейна, а повтор пары «ключ, nonce» полностью уничтожает поток. Первое даёт подмену данных без знания ключа, второе — восстановление открытых текстов и, в некоторых режимах, ключа.
Тема опирается на тему 5 основного курса (LFSR, RC4, ChaCha20) и готовит тему 6 (AEAD): именно здесь видно, почему конфиденциальность без целостности недостаточна. Атаки на TLS-режимы и WEP используются как исторические примеры.
Как устроен поточный шифр
Ключевой поток и XOR
Схема: c_i = m_i ⊕ s_i, где s_i — i-й байт ключевого потока, выработанного из ключа k и nonce n. Расшифрование — та же операция: m_i = c_i ⊕ s_i. Синхронный поточный шифр вырабатывает поток независимо от сообщения; самосинхронизирующийся использует предыдущие байты шифртекста и восстанавливается после потери синхронизации.
Требования к паре (k, n): она должна быть уникальной для каждого сообщения. Если nonce повторяется с тем же ключом, поток повторяется, и c1 ⊕ c2 = m1 ⊕ m2 — ключ исчезает из уравнения (рисунок 2).
Это не «ослабление», а полная потеря конфиденциальности для пары сообщений.
Линейность и её последствия
XOR линеен: изменение бита шифртекста на позиции i меняет ровно тот же бит открытого текста. Противнику не нужно знать ключ, чтобы превратить role=guest в role=admin, если он знает структуру сообщения. Достаточно вычислить Δ = m ⊕ m' и применить c' = c ⊕ Δ. Целостность при этом не нарушается с точки зрения расшифрования: получатель увидит валидный по форме, но подменённый текст. Защита — MAC или AEAD, которые проверяют целостность до использования открытого текста. Схема на рисунке 1 показывает, что ключ в подмене вообще не участвует.
LFSR и линейная сложность
Регистр сдвига с линейной обратной связью
LFSR из L бит хранит состояние и на каждом такте сдвигается, добавляя в старший бит XOR выбранных отводов. Выход — один бит за такт. Период максимален (2^L − 1), если многочлен обратной связи примитивен. LFSR быстры, но линейны: последовательность удовлетворяет линейной рекуррентности порядка L.
Алгоритм Берлекэмпа — Мэсси
По 2L битам выхода LFSR восстанавливается его структура: алгоритм находит минимальный многочлен, порождающий последовательность, за O(L^2) операций 2. После этого предсказывается весь дальнейший поток. Именно поэтому чистый LFSR непригоден как шифр: сложность взлома растёт квадратично, а не экспоненциально.
Нелинейные комбинации нескольких LFSR (фильтрующая или комбинирующая функция) усложняют атаку, но не дают доказуемой стойкости; A5/1 в GSM — пример, который был взломан. Современный стандарт — ARX-шифры, построенные на сложении, вращении и XOR: чистой линейности над GF(2) у них нет, но это не означает, что линейный и дифференциальный криптоанализ к ним неприменим. Для ARX разработаны специализированные варианты — анализ по модулю сложения, дифференциалы с учётом переносов через границы слов, — и именно ими оценивают Salsa20 и ChaCha20. Меняется не наличие метода, а его рабочая модель.
RC4 и его смещения
Алгоритм
RC4 состоит из KSA (key scheduling algorithm), который перемешивает 256-байтовый массив S ключом, и PRGA, который на каждом шаге меняет местами два элемента и выдаёт S[(S[i] + S[j]) mod 256]. Он прост, быстр и десятилетиями использовался в WEP, WPA-TKIP и TLS.
Смещения и атаки
Выход RC4 не равномерен: второй байт ключевого потока равен нулю с вероятностью около 2/256 вместо 1/256, а первые байты коррелируют с ключом. FMS-атака на WEP использует слабость первых байтов и IV, чтобы восстановить ключ по многим пакетам; в TLS атаки на RC4 (RC4 NOMORE и другие) эксплуатируют смещения в статистике. В 2015 году RFC 7465 запретил RC4 в TLS 4. Восстановление ключа RC4 по внутреннему состоянию разобрано в работе Бихама и Кармели 8.
Практический вывод: «алгоритм выглядит случайным» не означает «выход неотличим от случайного». Смещения в первых байтах достаточно, чтобы сломать протокол, использующий RC4 с разными nonce.
ChaCha20
Состояние и четверть-раунд
ChaCha20 (RFC 8439) использует состояние 4×4 из 32-битных слов: константы "expand 32-byte k", ключ (8 слов), счётчик (1 слово) и nonce (3 слова). Раунд состоит из четырёх четверть-раундов над диагоналями и столбцами; каждый четверть-раунд — четыре сложения, четыре XOR и четыре циклических сдвига (ARX). За 20 раундов (10 двойных) состояние тщательно перемешивается, после чего прибавляется к исходному и выдаётся как блок потока 3.
Семейство Salsa20/ChaCha20 предложено Дэниелом Бернстайном и стало основой eSTREAM 5; ARX-операции нелинейны относительно GF(2), поэтому линейный криптоанализ неприменим; лучшие известные атаки на ChaCha20 не практичны. Важны детали реализации: счётчик увеличивается на каждый блок, nonce уникален для ключа, при переполнении счётчика поток нельзя продолжать 6.
Почему повтор nonce фатален
Повтор nonce даёт тот же поток. Тогда c1 ⊕ c2 = m1 ⊕ m2, и при известном одном сообщении второе восстанавливается полностью. В ChaCha20-Poly1305 повтор nonce ломает и аутентификацию: Poly1305 использует одноразовый ключ, выведенный из потока, и его повтор позволяет подделать тег (подробно — в теме 6).
Bit-flipping на практике
Подмена поля в токене
Пусть сервер выдаёт cookie role=guest;uid=42, зашифрованную поточным шифром, и доверяет расшифрованному содержимому. Противник знает формат и хочет role=admin;uid=42. Он вычисляет Δ для первых десяти байт и применяет к шифртексту. Сервер расшифрует валидную строку с правами администратора.
Защита: AEAD с проверкой тега, подпись cookie, серверная сессия. Поточный шифр без MAC не даёт целостности, и никакая длина ключа этого не исправляет.
Почему MAC обязателен
Шифрование и аутентификация — разные задачи. Поточный шифр скрывает содержимое, но не мешает изменению. MAC вычисляется по шифртексту (encrypt-then-MAC) или по открытому тексту (MAC-then-encrypt) с разными последствиями; безопасный вариант — AEAD, где тег проверяется до расшифрования 7. Об этом — темы 6 и 9 основного курса.
Повтор ключа и crib-dragging
Two-time pad
Если два сообщения зашифрованы одним потоком, c1 ⊕ c2 = m1 ⊕ m2. Для текстов на естественном языке этого достаточно, чтобы восстановить оба: пробел XOR буква даёт букву в другом регистре, а позиции пробелов угадываются по частотным аномалиям. Метод crib-dragging перебирает предполагаемое слово в одном сообщении и проверяет, даёт ли результат осмысленный текст во втором.
Проект «Venona»
Исторический пример — перехваты советских сообщений в проекте Venona: повторное использование ключей одноразовых блокнотов позволило американским криптоаналитикам частично восстановить текст. Это иллюстрация того, что «одноразовый» блокнот, использованный дважды, перестаёт быть одноразовым 1.
Автоматизация
В лабораторной работе реализуется crib-dragging: для каждого смещения crib накладывается на c1 ⊕ c2, оценивается правдоподобность результата (доля печатных символов, частые слова) и выводятся кандидаты. Затем вручную или эвристикой восстанавливаются пробелы и оба текста.
Итоги темы
Поточный шифр быстр, но линеен: XOR позволяет менять открытый текст, не зная ключа, а повтор nonce уничтожает поток. LFSR ломается алгоритмом Берлекэмпа — Мэсси по 2L битам; RC4 имеет смещения, достаточные для атак на WEP и TLS; ChaCha20 свободен от известных практических атак, но требует уникального nonce и MAC.
Ключевой вывод: конфиденциальность и целостность — разные свойства, и поточный шифр даёт только первое. Следующая тема — блочные шифры и режимы — покажет, как те же ошибки (детерминированность, отсутствие целостности) проявляются в ECB, CBC и padding oracle.
Литература
- Kahn D. The Codebreakers. — Scribner, 1996.
- Menezes A., van Oorschot P., Vanstone S. Handbook of Applied Cryptography. — CRC Press, 1996. https://cacr.uwaterloo.ca/hac/
- Nir Y., Langley A. ChaCha20 and Poly1305 for IETF Protocols. — RFC 8439, IETF, 2018. https://www.rfc-editor.org/rfc/rfc8439
- Popov A. Prohibiting RC4 Cipher Suites. — RFC 7465, IETF, 2015. https://www.rfc-editor.org/rfc/rfc7465
- Bernstein D. J. The Salsa20 Family of Stream Ciphers. — в кн. New Stream Cipher Designs, Springer, 2008, С. 84–97. DOI: 10.1007/978-3-540-68351-3_8
- Aumasson J.-P. Serious Cryptography. — 2-е изд. — No Starch Press, 2024.
- Ferguson N., Schneier B., Kohno T. Cryptography Engineering. — Wiley, 2010.
- Biham E., Carmeli Y. Efficient Reconstruction of RC4 Keys from Internal States. — FSE 2008, DOI: 10.1007/978-3-540-71095-0_25