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:

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)
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.

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.
  1. Klient vygeneruje náhodné číslo x (1 < x < q) a spočítá e = g^x mod p. Pošle číslo "e" serveru.
  2. 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.
  3. 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
467627007
Funkce 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íčů.

[<předchozí část<]  [^obsah^]  [>další část>]

xzarsky@fi.muni.cz