Каждый раз, когда вы заходите на сайт с замочком 🔒 в адресной строке, происходит маленькое чудо: два незнакомца — ваш браузер и сервер — договариваются об общем секрете прямо на виду у всех. И даже те, кто видит весь разговор, не могут его подслушать.
Представьте: Алиса хочет отправить Бобу тайное сообщение. Но любой канал между ними — открытка на витрине: почтальон, провайдер, сосед по Wi-Fi, злоумышленник с роутером — все видят содержимое.
Наивное решение: «Алиса шифрует сообщение ключом — а ключ отправляет Бобу отдельно». Но любой ключ, отправленный по открытому каналу, тут же перехватят. Получается замкнутый круг: чтобы передать секрет, нужно уже иметь секрет.
Задача, которую Уитфилд Диффи и Мартин Хеллман решили в 1976 году, кажется невозможной. Но она решается — и ниже вы можете увидеть, как именно, своими руками.
Идея Диффи и Хеллмана — представить, что смешивание красок — это сложение чисел. Например, «смешать» два цвета = сложить их номера по кругу (как часы: после 360° снова 0°). Сложение работает так: неважно, в каком порядке складывать — результат одинаковый. Именно на этом свойстве и держится весь обмен.
Публичный цвет (жёлтый, hue 50°) знают все. Алиса выбирает свой секретный цвет, скажем, 100°, и смешивает с публичным: 50 + 100 = 150°. Это её «публичный цвет» — его она отправляет Бобу открыто, Ева тоже видит. Боб делает то же самое: свой секрет 200° + публичный 50° = 250° — отправляет Алисе.
Теперь магия: Алиса получает публичный Боба (250°) и смешивает со своим секретом (100°): 250 + 100 = 350°. А Боб получает публичный Алисы (150°) и добавляет свой секрет (200°): 150 + 200 = 350°. Оба получили один цвет! Просто потому, что 50 + 100 + 200 — это одно и то же число, как его ни переставляй.
Ева видит публичный цвет (50°) и оба публичных цвета Алисы и Боба (150° и 250°). Но она не знает секретов 100° и 200° — а из суммы их не восстановить. Это и есть невыполнимая задача, на которой держится вся современная криптография.
Хотя каждый считал его по-своему:
(публичный 50° + секрет Боба 250°) + её секрет 100°
(публичный 50° + секрет Алисы 150°) + его секрет 200°
Ева видит только публичные данные — ей не хватает секретов, чтобы получить этот цвет.
В реальном Диффи-Хеллмане стороны договариваются о двух публичных числах: p (большое простое) и g (основание). Дальше каждый:
Ева видит p, g, A и B. Чтобы найти a, ей нужно решить уравнение ga ≡ A (mod p) — это задача дискретного логарифмирования. На числах длиной 2048 бит она не решается ни за годы, ни за миллиарды лет ни на каком компьютере.
Разобравшись с обменом ключами, легко понять, зачем в криптографии два разных типа шифрования. Они как молоток и отвёртка — каждый для своей задачи.
Один и тот же ключ и шифрует, и расшифровывает. Быстрое, но требует, чтобы обе стороны уже имели общий ключ. Именно так работает основной канал HTTPS после рукопожатия.
Два ключа: публичный и приватный. Публичным шифруют — расшифровать может только владелец приватного. Медленное, но решает задачу обмена ключами.
Когда вы открываете сайт с HTTPS, браузер и сервер обмениваются несколькими сообщениями — это называется рукопожатием (handshake). Всё занимает 30–100 миллисекунд — меньше одного моргания. Нажмите на карточку, чтобы увидеть, что в ней происходит.
Браузер: «Привет! Я умею вот такие шифры»
Сервер: «Отлично, вот мой паспорт»
Обе стороны договариваются об общем секрете
Дальше всё шифруется симметричным AES
Браузер отправляет серверу первое сообщение: какие версии TLS он поддерживает, какие алгоритмы шифрования умеет, случайное число для будущего ключа.
Даже с DH есть проблема: Алиса не знает, что публичный ключ, который она получила, действительно от Боба, а не от Евы, которая вклинилась в середину. Это называется MITM-атака. Именно от неё защищает сертификат. Переключите режим и посмотрите.
Всё, что мы разобрали выше, работает каждую секунду на каждом устройстве. Вот несколько мест, где вы встречаетесь с этим прямо сейчас.
Каждый запрос к сайту с 🔒 защищён TLS. С 2020 года это стандарт — браузеры помечают HTTP-сайты как «небезопасные».
Signal, WhatsApp, Telegram (в секретных чатах) используют ту же математику — только ключи не у сервера, а на ваших устройствах.
PIN-код, отпечаток, Face ID — всё это превращается в криптографические подписи, которые банк может проверить.
Тот же DH-обмен, только вместо сертификата — общий пароль сети. Каждое устройство после подключения работает по своему каналу.
Номер карты никогда не хранится у магазина в открытом виде — только токен от платёжной системы.
Программисты подписывают свои коммиты, чтобы доказать авторство. Вся эта магия — тоже асимметричная криптография.