Протоколы безопасного сетевого взаимодействия

       

Обмен ключа Диффи-Хеллмана


Обмен ключа Диффи-Хеллмана обеспечивает разделяемый секрет, который не может быть определен оппонентом. При обмене ключа используется подпись, создаваемая закрытым ключом сервера для аутентификации сервера и защиты от атак "man-in-the-middle".

Будем использовать следующие обозначения:

С - клиент;
S - сервер;
р - простое число;
g - генератор для подгруппы GF (p);
V_S - строка версии S;
V_C - строка версии С;
K_S - открытый ключ сервера S;
I_C - сообщение KEXINIT C;
I_S - сообщение KEXINIT S, которыми участники обменялись перед данными сообщениями.
  1. С создает случайное число х и вычисляет e = gx mod p. C посылает e к S.

    SSH_MSG_KEXDH_INIT e

  2. S создает случайное число у и вычисляет f = gy mod p. S получает e и вычисляет K = еу mod p, H = hash (V_C || V_S || I_C || I_S || K_S || e || f || K) и подпись s для Н своим закрытым ключом сервера. S посылает {K_S || f || s} к С. Операция подписывания может включать вторую операцию хэширования.

    SSH_MSG_KEXDH_REPLY открытый ключ сервера и сертификаты (K_S) f s

  3. С проверяет, действительно ли K_S является ключом сервера S, используя сертификаты или локальную БД. С также может принимать ключ без проверки, однако это делает протокол небезопасным против активных атак (но это может быть сделано из практических соображений во многих окружениях). Затем С вычисляет K = fx mod p, H = hash (V_C || V_S || I_C || K_S || e || f || K) и проверяет подпись s для Н.

    Хэш Н вычисляется от конкатенации следующих значений:

    V_C – строка версии клиента (CR и NL исключаются)
    V_C – строка версии сервера (CR и NL исключаются)
    I_C – содержимое сообщения SSH_MSG_KEXINIT клиента
    I_S – содержимое сообщения SSH_MSG_KEXINIT сервера
    K_S – ключ хоста
    e – значение, посылаемое клиентом
    f – значение, посылаемое сервером
    K – разделяемый секрет

Эти значения называются хэшем обмена и используются для аутентификации сервера.

Алгоритм подписи применяется к значению Н. Большинство алгоритмов подписи включают хэширование. Например, ssh-dss определяет использование SHA. В этом случае данные, во-первых, хэшируются HASH, в результате чего вычисляется Н, и затем Н хэшируется с использованием SHA как часть операции подписывания.



Содержание раздела