Апокриф 11

Обмен ключами: Диффи — Хеллман и его атаки

Обмен ключами: Диффи — Хеллман и его атаки

Диффи — Хеллман решает задачу, которая кажется невозможной: двое, никогда не встречавшиеся, договариваются об общем секрете по открытому каналу. Стойкость держится на том, что дискретный логарифм в подходящей группе не считается. Всё остальное — выбор группы, проверка чужих значений, аутентификация сторон — решается протоколом, и именно там случаются катастрофы.

Тема идёт от математики к протоколу. Сначала группа по простому модулю: безопасное простое p, генератор g, порядок q, вычисление общего секрета. Потом — проверка открытых значений: как атака на малую подгруппу обнуляет секрет, если сервер принимает y = 1 или y = p−1. Затем атака «человек посередине» и то, почему без аутентификации обмен ключами бесполезен. Дальше — Полиг — Хеллман и Logjam: как слабая группа и понижение версии ломают протокол целиком. Заканчивается прямой секретностью и тем, как TLS 1.3 заменил классический DH на (EC)DHE с аутентификацией подписями.

Диффи — Хеллман по простому модулю

Схема

Параметры: большое простое p, генератор g подгруппы простого порядка q, где q делит p−1. Алиса выбирает секрет a, Боб — b. Алиса отправляет A = g^a mod p, Боб — B = g^b mod p. Общий секрет: Z = B^a = A^b = g^(ab) mod p 1.

Для стойкости нужно, чтобы p было «безопасным» простым (p = 2q + 1, q простое) либо чтобы работа велась в подгруппе простого порядка. Размер: 2048 бит и больше для классического DH, 3072 бита для долгоживущих ключей 2.

Выбор группы

Стандартные группы описаны в RFC 3526 (модулярные) и RFC 7919 (ffdhe). Использование стандартной группы — не лень, а безопасность: самостоятельно выбранные параметры часто оказываются слабыми, а проверка «это безопасное простое» дорога и легко пропускается.

Проверка значений и малые подгруппы

Атака на малую подгруппу

Если сервер не проверяет присланное y, противник присылает y = 1 или y = p−1. Тогда общий секрет равен 1 или ±1 независимо от секрета жертвы, и противник знает его заранее. Дальше — расшифровать сессию или подделать сообщение.

Защита: проверить 1 < y < p−1 и y^q ≡ 1 mod p. Вторая проверка гарантирует, что y лежит в подгруппе простого порядка q, а не в маленькой подгруппе. Без неё возможны атаки, где противник подбирает y так, чтобы секрет имел мало вариантов 3.

Contribution и «честный» обмен

Протокол должен требовать, чтобы обе стороны внесли вклад: если разрешено y = 1, одна сторона может зафиксировать секрет. Проверки y^q = 1 и y ≠ 1 — часть контракта, а не «дополнительная валидация».

Человек посередине

Атака

Обмен ключами не аутентифицирует стороны. Мэллори встаёт между Алисой и Бобом: с Алисой договаривается о ключе K_1, с Бобом — о K_2, и перешифровывает трафик. Ни Алиса, ни Боб не замечают подмены, если не проверяют аутентичность ключей 4.

Схема на рисунке 1.

Человек посередине
Рисунок 1. Мэллори договаривается о двух разных ключах и перешифровывает трафик

Защита

Аутентификация: подписи сторон (как в TLS с сертификатами), предварительно разделённый секрет (PSK), привязка к личности через SIGMA или подобные протоколы; систематический разбор таких конструкций есть в справочнике Менезеса, ван Оршота и Ванстоуна 8. Ключевое: обмен ключами даёт секретность только против пассивного противника; против активного нужна аутентификация.

Подтверждение ключа и подмена личности

Подписи и сертификаты привязывают ключ к имени, но сами по себе не гарантируют, что обе стороны получили один и тот же секрет и что они согласны с тем, кому он принадлежит. Отсюда два отдельных требования.

Первое — подтверждение ключа (key confirmation): каждая сторона доказывает владение сессионным секретом, например тегом MAC по транскрипту. TLS 1.3 делает это неявно через Finished, который вычисляется из ключа рукопожатия. Этап нужен, потому что без него одна сторона может принять соединение как установленное, тогда как другая его уже прервала.

Второе — устойчивость к unknown key-share: противник подменяет не ключи, а привязку личности, и в результате Алиса уверена, что говорит с Бобом, а Боб — что с Мэллори, при том что сессионный ключ один. Защита — включать в подпись и в вывод ключей не только эфемерные значения, но и идентификаторы сторон, а также роль каждого участника. Если этого не делать, протокол может оказаться стойким к подмене ключа и при этом уязвимым к подмене личности.

Активный противник против пассивного

Разница между пассивным и активным противником — не стилистическая. Пассивный видит обмен и ничего не меняет; для него достаточно стойкости CDH. Активный вставляет свои значения, удаляет сообщения, повторяет их и переупорядочивает; для него нужна модель, в которой протокол проверяет всё, что проверить можно: принадлежность точки, допустимость группы, согласованность версии, наличие подтверждения ключа. Большинство описанных ниже атак — атаки именно активного противника.

Полиг — Хеллман и Logjam

Гладкие порядки

Если p−1 раскладывается на малые простые, дискретный логарифм считается по китайской теореме об остатках: сначала находятся x mod q_i для каждого малого q_i, затем собирается x. Это алгоритм Полига — Хеллмана. Стойкость DH требует, чтобы у p−1 был большой простой множитель 5.

Logjam

В 2015 году выяснилось, что многие серверы поддерживают экспортные 512-битные группы, а распространённая 1024-битная группа используется настолько широко, что её предвычисление окупается для хорошо финансируемого противника. Атака понижения версии заставляла клиента согласиться на слабую группу 6. Ответ — убрать экспортные шифры и перейти на 2048+ бит или ECDHE.

Прямая секретность

Что это

Прямая секретность (forward secrecy) означает: компрометация долгоживущего ключа не раскрывает прошлые сессии. Достигается тем, что сессионные ключи выводятся из эфемерных значений, которые уничтожаются после использования.

Как проверять

В работе есть записанный трафик двух сессий и «утёкший» долгоживущий ключ Боба. Если протокол использует эфемерные ключи, утечка не помогает расшифровать прошлое; если сессионный ключ выводится из долгоживущего — помогает. Схема на рисунке 2.

Прямая секретность
Рисунок 2. Эфемерные ключи уничтожаются; утечка долгоживущего ключа не раскрывает прошлые сессии

Как это сделано в TLS 1.3

TLS 1.3 оставил только (EC)DHE с аутентификацией подписями: эфемерные ключи на каждую сессию, обмен через X25519 или стандартные группы, вывод ключей через HKDF, обязательная проверка всех параметров 7. Классический RSA-обмен ключами убран: он не давал прямой секретности. Экспортные группы убраны: они давали Logjam.

Итог: обмен ключами в современном протоколе — это эфемерный DH/ECDH, аутентифицированный подписью, с выводом ключей через KDF и строгой валидацией. Каждый элемент закрывает конкретную атаку из этой темы.

Итоги темы

  • Стойкость DH держится на трудности дискретного логарифма и на хорошей группе.
  • Без проверки y возможны атаки на малые подгруппы и фиксация секрета.
  • Без аутентификации обмен ключами ломается человеком посередине.
  • Гладкий p−1 ломается Полигом — Хеллманом; слабые группы и понижение версии дали Logjam.
  • Прямая секретность требует эфемерных ключей.
  • TLS 1.3 собирает всё вместе: (EC)DHE, подпись, HKDF, валидация.

Литература

  1. Diffie W., Hellman M. New Directions in Cryptography. IEEE Transactions on Information Theory, 1976. — исходная идея обмена ключами.
  2. NIST. SP 800-56A Rev. 3: Recommendation for Pair-Wise Key-Establishment Schemes Using Discrete Logarithm Cryptography. 2018. — требования к группам и проверкам.
  3. RFC 7919: Negotiated Finite Field Diffie-Hellman Ephemeral Parameters. 2016. — стандартные группы и их проверка.
  4. RFC 8446: TLS 1.3. 2018. — (EC)DHE, аутентификация, вывод ключей.
  5. Pohlig S., Hellman M. An Improved Algorithm for Computing Logarithms over GF(p) and Its Cryptographic Significance. 1978. — атака на гладкие порядки.
  6. Adrian D. et al. Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice. CCS 2015. — Logjam и понижение версии.
  7. RFC 7748: Elliptic Curves for Security. 2016. — X25519 для эфемерного обмена.
  8. Menezes A., van Oorschot P., Vanstone S. Handbook of Applied Cryptography, глава 12. — систематическое изложение протоколов обмена ключами.