Innanzitutto, un punto di terminologia: ciò che descrivi è la crittografia simmetrica e una chiave condivisa tra i partecipanti è generalmente nota come chiave segreta; "Chiave privata" di solito indica la parte di una chiave nella crittografia a chiave pubblica che solo un partecipante conosce.
Esistono due modi per diffondere una chiave segreta: può essere trasportata in un modo fisicamente sicuro o può essere trasportata usando un'altra forma di crittografia, comunemente crittografia a chiave pubblica.
Esistono modi per scambiare una chiave segreta che non richiede un canale di comunicazione segreto. Il più popolare è il protocollo di scambio chiavi Diffie-Hellman. Il principio di Diffie-Hellman è che ogni partecipante genera la propria coppia di chiavi e c'è un'operazione matematica che costruisce un gran numero da una chiave pubblica e una chiave privata. Questa operazione matematica ha una proprietà molto interessante: il gran numero può essere costruito dalla chiave privata di Alice e dalla chiave pubblica di Bob, oppure dalla chiave privata di Bob e dalla chiave pubblica di Alice; ottieni lo stesso numero in entrambi i modi. Quindi Alice e Bob si scambiano le loro chiavi pubbliche ed entrambe le parti conoscono il numero elevato, che può quindi essere utilizzato come chiave segreta. Un intercettatore può scoprire entrambe le chiavi pubbliche, ma è impossibile¹ trovare il numero elevato solo dalle chiavi pubbliche.
Lo scambio di chiavi Diffie-Hellman consente a due parti di scambiare un segreto, indipendentemente da chi sta ascoltando. Tuttavia, non autentica Alice su Bob o viceversa. Pertanto è suscettibile di un attacco man-in-the-middle : Mallory esegue lo scambio di chiavi con Alice (che crede di parlare con Bob) e separatamente con Bob (che crede di parlare con Alice), e quindi può decidere o almeno conosco il segreto.
Quando l'attaccante può intercettare e iniettare messaggi, è necessaria più crittografia per consentire ai partecipanti di autenticarsi a vicenda. (Un attaccante passivo significa effettivamente che il protocollo di trasporto sottostante fornisce l'autenticazione.) Il modo semplice è per ogni partecipante di conoscere già la chiave pubblica dell'altro. Se Alice conosce la chiave pubblica di Bob:
- Alice può autenticare Bob inviandogli una sfida: un valore casuale (un nonce ) crittografato con la chiave pubblica di Bob. Se Bob riesce a decifrare quel valore e rispedirlo, Alice sa che sta davvero parlando con Bob.
- Bob può autenticarsi con Alice inviandole un messaggio firmato con la sua chiave pubblica. Alice verifica la firma per verificare che stia davvero parlando con Bob.
Esistono molte varianti che utilizzano uno di questi metodi (o ancora un'altra variante) in una direzione e lo stesso metodo o un metodo diverso nell'altra direzione o che eseguono l'autenticazione in una sola direzione. Ad esempio, SSL / TLS (il livello di crittografia per molti protocolli come HTTPS, SMTPS, IMAPS, ecc.) Può utilizzare diverse combinazioni di cifratura e di solito autentica il server sul client ma può anche autenticare il client. Diffie-Hellman è lento e ingombrante per questa applicazione; l'algoritmo più diffuso con la distribuzione delle chiavi pubbliche è RSA .
Naturalmente, Alice e Bob potrebbero non conoscersi in anticipo la chiave pubblica dell'altro. Quindi si affidano invece a una catena di fiducia: Bob invia ad Alice la sua chiave pubblica, insieme a una dichiarazione firmata da una terza parte che afferma che questa chiave è in realtà la chiave pubblica di Bob. Questa dichiarazione firmata si chiama certificato e la terza parte è un'autorità di certificazione . La terza parte può essere nota a Bob o la sua identità può essere confermata da una quarta parte e così via. Alla fine questa catena di fiducia (... garantisce Dominique per Charlie che garantisce per Bob) deve raggiungere una parte di Ron di cui Bob si fida già, il che significa che Bob ha la chiave pubblica di Ron e si fida di Ron per firmare solo certificati validi.
Esistono protocolli che non si basano sulla crittografia a chiave pubblica. In particolare, il protocollo Kerberos viene utilizzato in entrambe le reti unix e basate su Windows per stabilire connessioni tra un client e un server. Kerberos utilizza un server di autenticazione centrale chiamato Key Distribution Center (KDC). Il KDC deve avere la password dell'utente memorizzata in un database e il client richiede normalmente all'utente la password. Per evitare di esporre la password, il protocollo non utilizza direttamente la password, ma un hash crittografico o più in generale una funzione di derivazione della chiave applicata alla password.
Con questo segreto condiviso, il client e il KDC stabiliscono un canale sicuro e il KDC invia al client un "ticket". Il ticket contiene una chiave di sessione (ovvero una chiave segreta appena generata), nonché una copia della chiave crittografata con un'altra chiave simmetrica condivisa tra il KDC e il server che il client desidera contattare. Il client quindi inoltra questa copia crittografata al server. Il server decodifica questo messaggio per ottenere la chiave di sessione e genera un nonce che crittografa con la chiave di sessione e lo invia al client. Il client quindi avvia un canale sicuro con il server, crittografato con la chiave di sessione, e inizia mostrando che potrebbe decrittografare il nonce: questo autentica il client sul server. Una istituzione di sessione Kerberos è una variante del protocollo Needham-Schroeder .
¹ Nel senso che i crittografi hanno provato molto duramente, ma il modo migliore che hanno trovato per farlo richiede un'incredibile quantità di potenza di calcolo.