EssayAI
Блог
Блог
Математика и алгоритмы

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

6 мая 2026Время чтения: 7 минут
#криптография#диффи-хеллман#обмен ключами#дискретный логарифм#протоколы
Алгоритм Диффи-Хеллмана: обмен ключами без передачи ключа

Алгоритм Диффи-Хеллмана - это протокол обмена ключами, который позволяет двум сторонам выработать общий секретный ключ через полностью открытый канал, не передавая сам ключ. Схему в 1976 году опубликовали Уитфилд Диффи и Мартин Хеллман (с заметным вкладом Ральфа Меркла), и она стала первой практической реализацией асимметричной криптографии. Идея проста на поверхности и глубока внутри: безопасность держится на вычислительной сложности задачи дискретного логарифма. В этой статье разбираем математику протокола, пошаговый обмен, выбор параметров pp и gg, атаку «человек посередине» и характерные ошибки, которые студенты допускают на экзамене по защите информации.

Что решает обмен ключами Диффи-Хеллмана

Главная проблема симметричного шифрования - доставка ключа. Если Алиса и Боб хотят шифровать переписку одним ключом, его нужно как-то согласовать заранее, а злоумышленник Ева слушает канал. Передать ключ открыто нельзя, а защищённого канала ещё нет - получается замкнутый круг.

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

Чтобы перейти от описания к конкретным числам и увидеть, как из приватных показателей рождается одинаковый общий ключ, удобно прогнать протокол на реальных значениях. Воспользуйтесь конструктором ниже.

Математическая основа: дискретный логарифм

Протокол работает в мультипликативной группе вычетов по модулю простого числа pp. Выбирается образующая (генератор) gg - элемент, степени которого пробегают по всем ненулевым вычетам по модулю pp. Публичными параметрами становятся пара (p,g)(p, g) - их знают все, в том числе перехватчик.

Каждая сторона генерирует приватный показатель: Алиса выбирает случайное aa, Боб - случайное bb. По ним считаются публичные значения: A=gamodp,B=gbmodp.A = g^a \bmod p, \qquad B = g^b \bmod p.

Возвести gg в степень по модулю легко, а вот обратная задача - по известным gg, pp и A=gamodpA = g^a \bmod p найти показатель aa - это и есть задача дискретного логарифма. Для больших pp (тысячи бит) эффективного алгоритма решения не известно, что и обеспечивает стойкость. Именно асимметрия «легко вперёд, трудно назад» делает алгоритм Диффи-Хеллмана работоспособным.

Пошаговый протокол обмена ключами

Классический сеанс обмена ключами по Диффи-Хеллману укладывается в пять шагов.

  1. Стороны согласуют публичные параметры - простое pp и генератор gg. Их можно жёстко зашить в стандарт или передать открыто.
  2. Алиса выбирает секрет aa, вычисляет A=gamodpA = g^a \bmod p и отправляет AA Бобу.
  3. Боб выбирает секрет bb, вычисляет B=gbmodpB = g^b \bmod p и отправляет BB Алисе.
  4. Алиса считает K=BamodpK = B^a \bmod p; Боб считает K=AbmodpK = A^b \bmod p.
  5. Оба получают одно и то же значение - общий секретный ключ.

Совпадение объясняется свойством степеней: Ba=(gb)a=gab=(ga)b=Ab(modp).B^a = (g^b)^a = g^{ab} = (g^a)^b = A^b \pmod p.

Общий секрет K=gabmodpK = g^{ab} \bmod p никогда не передаётся по каналу - его вычисляют независимо обе стороны. Ева видит только pp, gg, AA и BB; чтобы получить KK, ей пришлось бы решить дискретный логарифм и найти aa или bb.

На практике итоговый общий секрет почти никогда не используют как ключ шифрования напрямую: его пропускают через функцию формирования ключа (KDF, например HKDF), чтобы получить ключ нужной длины с равномерным распределением битов.

Числовой пример на маленьких параметрах

Возьмём учебные значения p=23p = 23, g=5g = 5. Пусть Алиса выбрала a=6a = 6, Боб - b=15b = 15.

Публичные значения: A=56mod23=15625mod23=8,A = 5^6 \bmod 23 = 15625 \bmod 23 = 8, B=515mod23=19.B = 5^{15} \bmod 23 = 19.

Общий секрет: KАлиса=196mod23=2,KБоб=815mod23=2.K_{\text{Алиса}} = 19^6 \bmod 23 = 2, \qquad K_{\text{Боб}} = 8^{15} \bmod 23 = 2.

Значения совпали: K=2K = 2. На таких крошечных числах дискретный логарифм Ева подберёт перебором мгновенно, поэтому реальные параметры берут из стандартизованных групп с pp длиной не менее 2048 бит.

Выбор параметров p и g

От параметров напрямую зависит стойкость. Несколько правил.

  • Модуль pp должен быть большим простым. Современная рекомендация - не менее 2048 бит, для долгосрочной защиты 3072 бита и выше.
  • Особенно удобны безопасные простые: p=2q+1p = 2q + 1, где qq тоже простое. В такой группе порядок подгруппы делится только на 2 и qq, что закрывает целый класс атак с малыми подгруппами.
  • Генератор gg должен порождать подгруппу большого простого порядка. Часто берут g=2g = 2 для подходящего безопасного простого.
  • Приватные показатели aa, bb - криптографически случайные, свежие для каждого сеанса (это даёт прямую секретность, forward secrecy).

Самостоятельно «придумывать» pp и gg не нужно: используют проверенные группы из RFC 3526 (MODP-группы) или переходят на эллиптические кривые (ECDH), где те же идеи работают на меньших ключах.

Атака «человек посередине»

Сам по себе алгоритм Диффи-Хеллмана защищает только от пассивного прослушивания. Против активного злоумышленника он беззащитен. В атаке «человек посередине» (man-in-the-middle) Меллори встаёт между сторонами и подменяет публичные значения: Алисе он шлёт своё M=gmmodpM = g^m \bmod p вместо BB, а Бобу - вместо AA. В итоге Меллори делит один секрет с Алисой и другой с Бобом, прозрачно расшифровывая и пересылая трафик.

Корень проблемы - отсутствие аутентификации: стороны не знают, чьё именно публичное значение получили. Лечится это привязкой публичных значений к подлинности: подписью (authenticated DH), сертификатами или общим паролем (PAKE). Именно в таком, аутентифицированном, виде Диффи-Хеллман живёт внутри TLS, IPsec и Signal. К слою аутентификации тесно примыкают и другие криптопротоколы - например, доказательство с нулевым разглашением, позволяющее подтвердить владение секретом, не раскрывая его.

Частые ошибки

  • Путают приватный и публичный ключ. Передавать по каналу можно только AA и BB; показатели aa и bb остаются у владельцев и наружу не выходят.
  • Считают, что DH сам по себе аутентифицирует стороны. Без подписи или сертификата протокол уязвим к атаке «человек посередине» - это не опция, а обязательное дополнение.
  • Берут маленькое или составное pp. Учебные p=23p = 23 годятся только для иллюстрации; в реальной системе нужен большой простой модуль из стандартизованной группы.
  • Используют общий секрет как ключ напрямую. gabmodpg^{ab} \bmod p - это число с неравномерным распределением; перед использованием его прогоняют через KDF.
  • Переиспользуют приватный показатель между сеансами. Свежие aa, bb на каждый сеанс дают прямую секретность: компрометация одного ключа не раскрывает прошлые сессии.

FAQ

Чем алгоритм Диффи-Хеллмана отличается от RSA? RSA - это полноценная асимметричная схема шифрования и подписи: им можно зашифровать сообщение или подписать его. Диффи-Хеллман решает более узкую задачу - согласование общего секретного ключа; шифровать им напрямую нельзя. На практике их часто комбинируют: DH вырабатывает сеансовый ключ, а подпись (RSA или ECDSA) аутентифицирует обмен.

Что такое ECDH и зачем он нужен? ECDH - это тот же протокол Диффи-Хеллмана, перенесённый из группы вычетов по модулю pp в группу точек эллиптической кривой. Задача дискретного логарифма на кривых сложнее, поэтому сравнимая стойкость достигается на гораздо более коротких ключах (256 бит ECDH ≈ 3072 бита классического DH), что экономит память и время.

Можно ли восстановить общий секрет, перехватив весь трафик? Только решив задачу дискретного логарифма - найти aa по A=gamodpA = g^a \bmod p. Для корректно выбранных больших параметров эффективного алгоритма не существует, поэтому пассивный перехват pp, gg, AA и BB не раскрывает K=gabmodpK = g^{ab} \bmod p.

Коротко

Алгоритм Диффи-Хеллмана позволяет двум сторонам выработать общий секрет K=gabmodpK = g^{ab} \bmod p по открытому каналу, обмениваясь лишь публичными значениями A=gamodpA = g^a \bmod p и B=gbmodpB = g^b \bmod p. Стойкость держится на сложности дискретного логарифма, безопасность параметров - на большом простом pp и правильном генераторе gg, а защита от активного злоумышленника - на обязательной аутентификации поверх протокола.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также