Обмен ключа Диффи-Хеллмана
Обмен ключа Диффи-Хеллмана обеспечивает разделяемый секрет, который не может быть определен оппонентом. При обмене ключа используется подпись, создаваемая закрытым ключом сервера для аутентификации сервера и защиты от атак "man-in-the-middle".
Будем использовать следующие обозначения:
С - клиент; |
S - сервер; |
р - простое число; |
g - генератор для подгруппы GF (p); |
V_S - строка версии S; |
V_C - строка версии С; |
K_S - открытый ключ сервера S; |
I_C - сообщение KEXINIT C; |
I_S - сообщение KEXINIT S, которыми участники обменялись перед данными сообщениями. |
- С создает случайное число х и вычисляет e = gx mod p. C посылает e к S.
SSH_MSG_KEXDH_INIT e
- 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
- С проверяет, действительно ли 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 как часть операции подписывания.