Калькулятор протокола Диффи — Хеллмана
Учебный калькулятор обмена ключами Диффи — Хеллмана. Задайте простой модуль p, основание g и секретные числа сторон или сгенерируйте параметры — калькулятор вычислит открытые ключи и общий секрет, проверит, является ли g первообразным корнем, и для малых p покажет, как перехватчик восстановит секрет.
Ход обмена
Как договориться о ключе по открытому каналу
Протокол Диффи — Хеллмана (1976) позволяет двум сторонам получить общий секретный ключ, обмениваясь сообщениями, которые может читать кто угодно.
- Стороны открыто договариваются о большом простом числе p и основании g.
- Алиса выбирает секретное число a и отправляет A = ga mod p.
- Боб выбирает секретное число b и отправляет B = gb mod p.
- Алиса вычисляет K = Ba mod p, Боб — K = Ab mod p. Оба получают одно и то же число gab mod p.
Перехватчик знает p, g, A и B, но чтобы найти K, ему нужно вычислить a по A — решить задачу дискретного логарифма. Для чисел в 2048 бит и больше это считается практически невозможным.
Пример
p = 23, g = 5. Алиса выбирает a = 6 и отправляет A = 5⁶ mod 23 = 8. Боб выбирает b = 15 и отправляет B = 5¹⁵ mod 23 = 19. Алиса считает 19⁶ mod 23 = 2, Боб — 8¹⁵ mod 23 = 2. Общий секрет K = 2.
Выбор параметров
Основание g должно порождать большую подгруппу: лучше всего, если g — первообразный корень, то есть его степени пробегают все числа от 1 до p − 1. Удобно брать «безопасное» простое p = 2q + 1, где q тоже простое: тогда у группы нет маленьких подгрупп, в которые можно «загнать» ключ. На практике используют стандартизированные группы размером 2048–4096 бит или эллиптические кривые (X25519), где ключи намного короче при той же стойкости.
Уязвимость к подмене
Сам по себе протокол не проверяет, с кем идёт обмен. Злоумышленник посередине может провести два отдельных обмена — с Алисой и с Бобом — и читать всю переписку. Поэтому в TLS, SSH и мессенджерах открытые ключи Диффи — Хеллмана подписываются, а подлинность собеседника проверяется сертификатами или сравнением отпечатков ключей.
Комментарии и вопросы