Несколько вопросов про Алгоритм Diffie-Hellman'a

Решая CTF, в котором было предоставлено задание,в котором было сказано расшифровать дамп трафика TLS, я познакомился с алгоритмом Диффи-Хелмана.

В классике шифр работает как показано на картинке:

введите сюда описание изображения

Теперь сами вопросы:

  1. Если число p было не простое, это делает его уязвимым к ??? Не очень понятно, почему если число p - простое, оно менее уязвимо.
  2. Где генерируется p & g - на сервере, или на клиенте и если это согласовывается, то где?
  3. Может ли в реальных условиях встретится такое, что p и (или) g числа не простые?

Ответы (1 шт):

Автор решения: Fat-Zer

Дисклеймер: Я не криптоаналитик и вообще с трудом ориентируюсь в теории чисел.
Здесь и далее подразумеваются обозначения из изложения в вики.


В данном примере число "p" было не простым, что делает его уязвимым к ??? Не очень понятно, почему если число "p" - простое, оно менее уязвимо.

Как написано во всех букварях, надёжность протокола Диффи—Хеллмана основана на сложности дискретного логорифмирования, т.е. нахождения такого а, что A ≡ ga (mod p). Если p будет составным, то это собственно сильно упростит дело. Если кратко, то нужно найти все ai для всех делителей pi, таких что A ≡ gai (mod pi) с помощью «тяжёлых» методов, например, с помощью ро-метода Полларда, а затем с помощью китайской теоремы об остатках и малой теоремы Ферма вычислить a. Нахождение общего секрета далее — тривиальная задача. Хорошее подробное описание этого алгоритма есть на code.stackexchange.

Где генерируется "p" & "g" - на сервере, или на клиенте и если это согласовывается, то где?

Генерация p относительно тяжёлый и ответственный процесс: может занимать от нескольких секунд до нескольких часов и в случае неудачного значения криптостойкость алгоритма сильно страдает. В качестве g выбирается обычно очень небольшое число, например 2. Так что эти значения генерируются «заранее». В частности не редко используются заранее вычисленные константы, например, для того же TLS 1.3 они есть прямо в rfc протокола. Для других протоколов, в частности более старых версий TLS, они обычно хранятся на сервере.

Может ли в реальных условиях встретится такое, что "p" и (или) "g" числа не прсотые?

Может. Иногда это может произойти по ошибке т.к. проверка больших чисел на простоту — процесс стохастический. Но иногда это вызывает подозрения в бекдорах. Простота g, вообще говоря, не имеет значения. Важно, чтобы оно порождало достаточно большую подгруппу в Zp.


Также для общего обзора см. Брюс Шнайер — «Прикладная криптография»: главы 11 и 22.1.

→ Ссылка