Алгоритм Диффи-Хеллмана: обмен ключами без передачи ключа

Алгоритм Диффи-Хеллмана - это протокол обмена ключами, который позволяет двум сторонам выработать общий секретный ключ через полностью открытый канал, не передавая сам ключ. Схему в 1976 году опубликовали Уитфилд Диффи и Мартин Хеллман (с заметным вкладом Ральфа Меркла), и она стала первой практической реализацией асимметричной криптографии. Идея проста на поверхности и глубока внутри: безопасность держится на вычислительной сложности задачи дискретного логарифма. В этой статье разбираем математику протокола, пошаговый обмен, выбор параметров и , атаку «человек посередине» и характерные ошибки, которые студенты допускают на экзамене по защите информации.
Что решает обмен ключами Диффи-Хеллмана
Главная проблема симметричного шифрования - доставка ключа. Если Алиса и Боб хотят шифровать переписку одним ключом, его нужно как-то согласовать заранее, а злоумышленник Ева слушает канал. Передать ключ открыто нельзя, а защищённого канала ещё нет - получается замкнутый круг.
Алгоритм Диффи-Хеллмана разрывает этот круг. Стороны обмениваются публичными значениями, а общий секрет каждая вычисляет у себя локально, комбинируя свой приватный ключ с чужим публичным. Перехватив всё, что летит по каналу, Ева не может восстановить секрет за разумное время - мешает односторонность операции возведения в степень по модулю простого числа.
Чтобы перейти от описания к конкретным числам и увидеть, как из приватных показателей рождается одинаковый общий ключ, удобно прогнать протокол на реальных значениях. Воспользуйтесь конструктором ниже.
Математическая основа: дискретный логарифм
Протокол работает в мультипликативной группе вычетов по модулю простого числа . Выбирается образующая (генератор) - элемент, степени которого пробегают по всем ненулевым вычетам по модулю . Публичными параметрами становятся пара - их знают все, в том числе перехватчик.
Каждая сторона генерирует приватный показатель: Алиса выбирает случайное , Боб - случайное . По ним считаются публичные значения:
Возвести в степень по модулю легко, а вот обратная задача - по известным , и найти показатель - это и есть задача дискретного логарифма. Для больших (тысячи бит) эффективного алгоритма решения не известно, что и обеспечивает стойкость. Именно асимметрия «легко вперёд, трудно назад» делает алгоритм Диффи-Хеллмана работоспособным.
Пошаговый протокол обмена ключами
Классический сеанс обмена ключами по Диффи-Хеллману укладывается в пять шагов.
- Стороны согласуют публичные параметры - простое и генератор . Их можно жёстко зашить в стандарт или передать открыто.
- Алиса выбирает секрет , вычисляет и отправляет Бобу.
- Боб выбирает секрет , вычисляет и отправляет Алисе.
- Алиса считает ; Боб считает .
- Оба получают одно и то же значение - общий секретный ключ.
Совпадение объясняется свойством степеней:
Общий секрет никогда не передаётся по каналу - его вычисляют независимо обе стороны. Ева видит только , , и ; чтобы получить , ей пришлось бы решить дискретный логарифм и найти или .
На практике итоговый общий секрет почти никогда не используют как ключ шифрования напрямую: его пропускают через функцию формирования ключа (KDF, например HKDF), чтобы получить ключ нужной длины с равномерным распределением битов.
Числовой пример на маленьких параметрах
Возьмём учебные значения , . Пусть Алиса выбрала , Боб - .
Публичные значения:
Общий секрет:
Значения совпали: . На таких крошечных числах дискретный логарифм Ева подберёт перебором мгновенно, поэтому реальные параметры берут из стандартизованных групп с длиной не менее 2048 бит.
Выбор параметров p и g
От параметров напрямую зависит стойкость. Несколько правил.
- Модуль должен быть большим простым. Современная рекомендация - не менее 2048 бит, для долгосрочной защиты 3072 бита и выше.
- Особенно удобны безопасные простые: , где тоже простое. В такой группе порядок подгруппы делится только на 2 и , что закрывает целый класс атак с малыми подгруппами.
- Генератор должен порождать подгруппу большого простого порядка. Часто берут для подходящего безопасного простого.
- Приватные показатели , - криптографически случайные, свежие для каждого сеанса (это даёт прямую секретность, forward secrecy).
Самостоятельно «придумывать» и не нужно: используют проверенные группы из RFC 3526 (MODP-группы) или переходят на эллиптические кривые (ECDH), где те же идеи работают на меньших ключах.
Атака «человек посередине»
Сам по себе алгоритм Диффи-Хеллмана защищает только от пассивного прослушивания. Против активного злоумышленника он беззащитен. В атаке «человек посередине» (man-in-the-middle) Меллори встаёт между сторонами и подменяет публичные значения: Алисе он шлёт своё вместо , а Бобу - вместо . В итоге Меллори делит один секрет с Алисой и другой с Бобом, прозрачно расшифровывая и пересылая трафик.
Корень проблемы - отсутствие аутентификации: стороны не знают, чьё именно публичное значение получили. Лечится это привязкой публичных значений к подлинности: подписью (authenticated DH), сертификатами или общим паролем (PAKE). Именно в таком, аутентифицированном, виде Диффи-Хеллман живёт внутри TLS, IPsec и Signal. К слою аутентификации тесно примыкают и другие криптопротоколы - например, доказательство с нулевым разглашением, позволяющее подтвердить владение секретом, не раскрывая его.
Частые ошибки
- Путают приватный и публичный ключ. Передавать по каналу можно только и ; показатели и остаются у владельцев и наружу не выходят.
- Считают, что DH сам по себе аутентифицирует стороны. Без подписи или сертификата протокол уязвим к атаке «человек посередине» - это не опция, а обязательное дополнение.
- Берут маленькое или составное . Учебные годятся только для иллюстрации; в реальной системе нужен большой простой модуль из стандартизованной группы.
- Используют общий секрет как ключ напрямую. - это число с неравномерным распределением; перед использованием его прогоняют через KDF.
- Переиспользуют приватный показатель между сеансами. Свежие , на каждый сеанс дают прямую секретность: компрометация одного ключа не раскрывает прошлые сессии.
FAQ
Чем алгоритм Диффи-Хеллмана отличается от RSA? RSA - это полноценная асимметричная схема шифрования и подписи: им можно зашифровать сообщение или подписать его. Диффи-Хеллман решает более узкую задачу - согласование общего секретного ключа; шифровать им напрямую нельзя. На практике их часто комбинируют: DH вырабатывает сеансовый ключ, а подпись (RSA или ECDSA) аутентифицирует обмен.
Что такое ECDH и зачем он нужен? ECDH - это тот же протокол Диффи-Хеллмана, перенесённый из группы вычетов по модулю в группу точек эллиптической кривой. Задача дискретного логарифма на кривых сложнее, поэтому сравнимая стойкость достигается на гораздо более коротких ключах (256 бит ECDH ≈ 3072 бита классического DH), что экономит память и время.
Можно ли восстановить общий секрет, перехватив весь трафик? Только решив задачу дискретного логарифма - найти по . Для корректно выбранных больших параметров эффективного алгоритма не существует, поэтому пассивный перехват , , и не раскрывает .
Коротко
Алгоритм Диффи-Хеллмана позволяет двум сторонам выработать общий секрет по открытому каналу, обмениваясь лишь публичными значениями и . Стойкость держится на сложности дискретного логарифма, безопасность параметров - на большом простом и правильном генераторе , а защита от активного злоумышленника - на обязательной аутентификации поверх протокола.
Читайте также

Доказательство с нулевым разглашением: как это работает
Разбираем доказательство с нулевым разглашением: как убедить проверяющего в истинности, ничего не раскрыв, три ключевых свойства протокола и где такие схемы применяют.

Цифровая подпись ECDSA: как устроена и как проверяется
Разбираем цифровую подпись ECDSA на эллиптических кривых: как из приватного ключа и хэша рождается пара (r, s), как идет проверка и почему важен nonce k.

Алгоритм Рабина-Карпа: поиск подстроки за O(n+m)
Разбираем алгоритм Рабина-Карпа: как полиномиальный хеш и скользящее окно ускоряют поиск подстроки до O(n+m) в среднем, почему бывают ложные совпадения и при чём тут плагиат.