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