Задача, которая казалась неразрешимой
Чтобы зашифровать сообщение быстрым симметричным шифром, обе стороны должны знать один ключ. Но как передать его, если канал прослушивается? Раньше ключи вручную доставляли на бумаге или через курьера. В 1976 году Уитфилд Диффи и Мартин Хеллман опубликовали метод, при котором две стороны получают общий секрет, обмениваясь только открытыми сообщениями, и наблюдатель не может этот секрет вычислить.
Это стало отправной точкой для всей современной криптографии с открытым ключом. Метод не шифрует данные, он лишь позволяет договориться о ключе для последующего шифрования.
Аналогия с красками
Классическая картинка: у Алисы и Боба есть общая банка жёлтой краски, её видят все, включая подслушивающего. Каждый добавляет туда свой секретный цвет: Алиса красный, Боб синий, и отправляет получившуюся смесь другому. Смеси видны всем. Затем каждый добавляет свой секретный цвет к полученной смеси. Алиса получает жёлтый плюс синий плюс красный, Боб жёлтый плюс красный плюс синий. Результат одинаков.
Наблюдатель знает жёлтый и обе промежуточные смеси, но не знает секретных цветов. Разделить смесь обратно на компоненты практически невозможно. В математике роль смешивания красок играет операция, которую легко выполнить в одну сторону, а обратно вычислить трудно.
Как это выглядит в числах
Без формул суть такова. Стороны заранее выбирают общие открытые параметры: большое простое число и основание. Каждая генерирует секретное число и вычисляет от него открытое значение с помощью возведения в степень по модулю. Открытые значения пересылаются. Затем каждая сторона возводит полученное чужое значение в степень своего секрета и получает одно и то же число.
Обратная задача, восстановить секрет по открытому значению, называется задачей дискретного логарифма. Для достаточно больших параметров она считается трудной для обычных компьютеров. Вариант на эллиптических кривых, ECDH, даёт тот же результат с более короткими ключами, о нём в статье про эллиптическую криптографию.
Где применяется на практике
Почти каждое защищённое соединение начинается с той или иной формы обмена Диффи-Хеллмана. В TLS его эфемерные варианты используют для получения сеансового ключа, что даёт прямую секретность, описанную на отдельной странице. Мессенджеры со сквозным шифрованием применяют его, чтобы собеседники получили общий ключ без участия сервера. VPN-протоколы, в том числе IKEv2, тоже опираются на такой обмен.
В вопросах безопасности полезно помнить: чистый обмен без проверки подлинности уязвим к активному злоумышленнику. Если он встанет посередине и проведёт обмен с каждой из сторон отдельно, обе будут считать, что говорят друг с другом. Поэтому обмен сопровождается подписью или сертификатом.
Заблуждения и проверка: Обмен ключами Диффи-Хеллмана
Частое заблуждение: «Диффи-Хеллман шифрует данные». Нет, он даёт только общий секрет, а шифрование выполняет затем AES или другой симметричный шифр. Другое: «значения, которые видит наблюдатель, позволяют восстановить ключ». Для правильно выбранных параметров не позволяют, но слабые параметры, малые простые числа или общие давно известные группы, ослабляют защиту.
Увидеть обмен на практике можно в браузере или через openssl s_client: в выводе указана группа, например X25519, которая соответствует варианту на кривой Curve25519. Попробуйте учебные калькуляторы обмена с маленькими числами, чтобы понять механику, но для реальной защиты нужны параметры размером в сотни и тысячи бит.
Параметры и группы
Безопасность обмена зависит от выбора параметров. Если простое число невелико или им пользуются миллионы серверов, то злоумышленник с большими ресурсами может заранее провести дорогие вычисления для этого числа и затем быстро вскрывать отдельные соединения. Так выглядела проблема Logjam в 2015 году, когда старые серверы применяли 512-битные экспортные группы. Поэтому современные рекомендации требуют группы от 2048 бит либо кривые вроде X25519. Именованные стандартизованные группы предпочтительнее самодельных: их параметры проверены и не содержат скрытых слабостей.