Secure Shell (SSH)
Výměna klíčů
Během výměny klíčů jsou určeny dvě hodnoty K a H. Šifrovací a autentizační klíče jsou pak odvozeny z těchto hodnot. Hodnota H z první výměny klíčů je navíc použita jako identifikátor spojení (session_id). Identifikátor tvoří část dat, které se podepisují jako důkaz vlastnictví soukromého klíče. Když je identifikátor spojení jednou vypočten, už se nemění, pouze pokud by byly vytvořeny nové klíče.Každá metoda výměny klíčů používá nějaký hašovací algoritmus. Stejný algoritmus se používá k odvození klíče. Budeme jej nazývat HASH. Šifrovací klíč je vypočten jako HASH ze známé hodnoty K takto:
Klíč se bere ze začátku výstupu hašovací funkce. Pro algoritmy s volitelnou délkou klíče se bere 128 bitů, pro ostatní tolik, kolik je potřeba. Pokud by byl výstup HASH kratší než požadovaný klíč, spočte se HASH ze zřetězení K a doposud spočtené délky klíče. Výsledek se připojí na konec klíče. Opakuje se tak dlouho, až má klíč dostatečnou délku.
- Počáteční inicializační vektor od klienta k serveru
- HASH(K || "A" || session_id) ("A" znamená znak A, ascii 65 a značka || znamená zřetězení).
- Počáteční inicializační vektor od serveru ke klientovi
- HASH(K || "B" || session_id)
- Šifrovací klíč od klienta k serveru
- HASH(K || "C" || session_id)
- Šifrovací klíč od serveru ke klientovi
- HASH(K || "D" || session_id)
- Klíč integrity od klienta k serveru
- HASH(K || "E" || session_id)
- Klíč integrity od serveru ke klientovi
- HASH(K || "F" || session_id)
Zprovoznění klíčů
Výměna klíčů končí pro obě strany zasláním zprávy SSH_MSG_NEWKEYS. Od této doby jsou všechny zprávy šifrovány novými klíči.Výměna klíčů metodou Diffie-Hellman
Metoda Diffie-Hellman používá společně sdílený tajný klíč, který nemůže být zjištěn nikým druhým. Výměna klíčů je zkombinována s podepisováním hostitelským klíčem pro zajištění autentizace počítače. Vnásledujícím popisu je "p" hodně velké prvočíslo, "g" generátor podgrupy GF(p), "q" číslo podgrupy, "V_S" číslo verze serveru, "V_K" číslo verze klienta, "K_S" veřejný hostitelský klíč serveru, "I_K" zpráva KEXINIT klienta a "I_S" je dřívější zpráva KEXINIT serveru.
- Klient vygeneruje náhodné číslo x (1 < x < q) a spočítá e = g^x mod p. Pošle číslo "e" serveru.
- Server vygeneruje náhodné číslo y (0 < y < q) a spočítá f=g^y mod p. Server přijme "e". Pak spočítá K = e^y mod p, H = hash (V_K || V_S || I_K || I_S || K_S || e || f || K) a vytvoří podpis "s" na H svým soukromým hostitelským klíčem. Server odešle "K_S || f || s" klientovi.
- Klient si ověří, že K_S opravdu patří serveru (cetifikátem nebo v místní databázi). Může přijmout klíč bez ověření, ale tím se zjednoduší aktinicializační vektorní útoky na protokol. Klient pak spočítá K = f^x mod p, H = hash (V_K || V_S || I_K || I_S || K_S || e || f || K) a ověří podpis "s" na H.
Metoda diffie-hellman-group1-sha1
Metoda diffie-hellman-group1-sha1 je úpravou metody Diffie-Hellman. Jako hašovací funkce je použit algoritmus SHA-1. Za prvočíslo p bylo zvoleno číslo 2^1024 - 2^960 - 1 + 2^64 * floor( 2^894 Pi + 129093 ), což je přesně179769313486231590770839156793787453197860296048756011706444 423684197180216158519368947833795864925541502180565485980503 646440548199239100050792877003355816639229553136239076508735 759914822574862575007425302077447712589550957937778424442426 617334727629299387668709205606050270810842907692932019128194 467627007Funkce floor() znamená celočíselné zaokrouhlení dolů. Za generátor byl vybrán g = 2. Číslo grupy q je ( p - 1 ) / 2. Doporučená velikost hostitelského klíče je 1024 bitů a 768 bitů pro serverový klíč. Nejmenší délka klíče je 512 bitů pro menší z klíčů.