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

Режимы блочного шифрования

2011 год. Исследователи Thai Duong и Juliano Rizzo демонстрируют BEAST - атаку на CBC в TLS 1.0. Они расшифровывают cookie в реальном времени прямо в браузере. Уязвимость существовала 10 лет. Причина: предсказуемый IV в CBC. Один неправильный режим шифрования - и безопасность рассыпается несмотря на 'правильный' AES.

  • TLS 1.3 удалил CBC полностью - остался только GCM и ChaCha20-Poly1305, оба AEAD
  • WireGuard использует исключительно ChaCha20-Poly1305 - один алгоритм, ноль исторического груза, минимальная поверхность атаки
  • Signal Protocol использует AES-256-CTR для сообщений + отдельный HMAC-SHA256 - Encrypt-then-MAC как текущий стандарт pre-GCM

ECB: почему шифрование пикселей - плохая идея

Electronic Codebook (ECB) - наивный режим: каждый 16-байтовый блок шифруется независимо одним ключом. Результат детерминирован: одинаковый plaintext всегда даёт одинаковый ciphertext. Это катастрофа.

Знаменитый пример: зашифровать Linux Tux пингвина через AES-ECB. Пространство цветов пикселей ограничено - повторяющиеся блоки пикселей дают повторяющиеся блоки ciphertext. Контуры пингвина остаются видимы в зашифрованном изображении. Шифрование есть. Безопасности нет.

ECB небезопасен при любых данных с паттернами. HTTP-заголовки, JSON-структуры, SQL-запросы, изображения - всё это имеет повторяющиеся паттерны. Практическая атака: Cut-and-Paste. Если зашифрованное сообщение состоит из ECB-блоков, их можно переставить, изменив смысл без знания ключа. Известный кейс - атака на Oracle padding с ECB.

ECB никогда не используется в современных протоколах. Но он до сих пор существует в библиотеках 'для совместимости'. Если видишь AES/ECB в code review - это красный флаг. Минимум должен быть CBC с случайным IV или, лучше, GCM.

Почему ECB считается небезопасным?

CBC: XOR с предыдущим блоком

Cipher Block Chaining (CBC) решает ECB-проблему через chaining: каждый plaintext-блок XOR'ится с предыдущим ciphertext-блоком перед шифрованием. Первый блок XOR'ится с Initialization Vector (IV) - случайным числом, которое передаётся вместе с ciphertext.

CBC решает ECB-проблему, но создаёт новую: шифрование строго последовательное (нельзя шифровать блоки параллельно). Расшифрование - параллельное. Атака BEAST (2011) показала уязвимость CBC в TLS 1.0 при предсказуемом IV. POODLE (2014) - атака на padding CBC в SSL 3.0. В TLS 1.3 CBC убрали совсем.

Padding oracle attack - классика против CBC. Если сервер возвращает разные ошибки для 'неверный padding' и 'неверная подпись', атакующий может по-одному восстановить всё сообщение, послав O(256N) запросов, где N - число блоков. Защита: всегда проверять MAC до unpadding (Encrypt-then-MAC, не MAC-then-Encrypt).

Зачем нужен Initialization Vector (IV) в CBC?

CTR: блочный шифр как поточный

Counter Mode (CTR) превращает блочный шифр в поточный. Вместо шифрования данных напрямую, шифруется счётчик: AES(nonce || counter) = keystream. Затем keystream XOR данные. AES никогда не расшифровывает - только шифрует. Расшифрование идентично шифрованию.

CTR полностью параллелен: все блоки keystream можно вычислить независимо. Это означает hardware AES-NI инструкции дают максимальный throughput. Intel AES-NI на современном CPU даёт 40+ Гбит/с для AES-128-CTR. CTR позволяет произвольный доступ к потоку: чтобы расшифровать байт #1000000, не нужно расшифровывать первые 999999.

Критическое правило CTR: nonce никогда не должен повторяться с одним ключом. Если nonce повторится, XOR двух ciphertext'ов = XOR двух plaintext'ов. При известном одном plaintext, второй восстанавливается элементарно. Это произошло с WEP (Wi-Fi 1999) - IV всего 24 бита, повторяется через ~16M пакетов.

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

OFB и CFB: feedback-режимы и их ниши

Output Feedback (OFB) и Cipher Feedback (CFB) - исторически важные режимы, сейчас практически вытесненные CTR и GCM. Но они появляются в embedded и legacy-системах, поэтому понять их стоит.

OFB генерирует keystream независимо от данных - как CTR. Разница: CTR использует счётчик, OFB рекурсивно применяет AES к предыдущему выходу. OFB строго последовательный. CFB 'кусает' данные по N бит (8, 64, 128) - удобно для протоколов с нефиксированным размером блока. CFB-8 использовался в ранних версиях SSH.

Практический совет 2024: для нового кода - только AES-GCM или ChaCha20-Poly1305 (AEAD). Если нужен CTR без аутентификации - только для специфичных протоколов где MAC выносится наружу. CBC - только для совместимости с legacy. OFB/CFB - почти никогда в новом коде.

CBC с HMAC эквивалентен по безопасности GCM

CBC+HMAC требует правильного порядка (Encrypt-then-MAC) и внимания к padding oracle; GCM атомарно даёт confidentiality + integrity

MAC-then-Encrypt (как в TLS до 1.2) уязвим к padding oracle. Encrypt-then-MAC безопасен но требует дополнительных 32 байта HMAC. GCM решает обе проблемы в одном примитиве, аппаратно ускоренном. Переход на GCM - не luxury, а стандарт

Главное отличие OFB от CTR?

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

Режимы шифрования - ключевой элемент стека криптографических протоколов:

  • AES — Базовый блочный шифр для всех режимов
  • AEAD (GCM, ChaCha20-Poly1305) — Современные режимы с аутентификацией
  • TLS — Реальное применение режимов шифрования

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

  • ECB небезопасен: одинаковые блоки -> одинаковый ciphertext, паттерны данных видны
  • CBC решает ECB через chaining, но уязвим к padding oracle и BEAST - в TLS 1.3 удалён
  • CTR: блочный шифр как поточный, полная параллельность, произвольный доступ, nonce нельзя повторять
  • Для нового кода - только AEAD (GCM или ChaCha20-Poly1305). CBC/CTR только с явным MAC

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

  • Почему nonce-reuse в CTR катастрофичен, а IV-reuse в CBC лишь ослабляет безопасность?
  • Как атака BEAST использовала предсказуемый IV, и что именно поменяли в TLS 1.1 для защиты?
  • Когда CTR без MAC приемлем, и какой слой тогда должен обеспечивать integrity?

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

  • crypto-14-aes — AES - базовый блочный шифр для всех режимов
  • crypto-16-aead — AEAD строится поверх режимов (GCM = CTR + auth)
  • crypto-32-tls — TLS использует CBC и GCM как cipher suites
  • crypto-05-information-theory — Информационная теория объясняет почему ECB небезопасен
  • net-23-https-tls
Режимы блочного шифрования

0

1

Войти