Prima di iniziare una comunicazione, il server vuole avere la certezza che il client sia realmente colui che asserisce di essere. Un intruso, infatti, potrebbe intercettare i messaggi e, dopo averli modificati ingannerebbe i due interlocutori inviando false risposte.
Nell'ipotesi che il client A e il server B condividano una chiave segreta, il protocollo di autenticazione sfida-risposta prevede che il server B invii un numero casuale al client A, chiedendogli di codificarlo con la chiave segreta e di rispedire il risultato. Più dettagliatamente, il processo di autenticazione consiste dei seguenti passi:
Il client A invia la propria identità al server B, ad esempio tramite un form di login;
Il server B genera un numero casuale e lo invia al client A, (sfida);
Il client A usa la chiave condivisa per criptare il numero ricevuto;
Il client B riceve la risposta e decripta il messaggio.
In questo modo il client A ha provato la sua identità, perchè solo lui poteva possedere la chiave segreta.
Ma se anche A vuole avere la certezza che stia comunicando con B, allora A, usando una diversa chiave condivisa, invia la sfida a B e questi, che deve conoscere l'altra chiave, deve criptare la sfida e restituirla ad A.
I due sistemi in comunicazione devono accordarsi sulle chiavi da usare. Lo scambio manuale non sempre è realizzabile. Lo scambio tramite la rete, prima della comunicazione potrebbe essere intercettato.
L'algoritmo di Diffie-Hellman consente a due sistemi, che intendono comunicare, di individuare una chiave segreta da condividere, senza farla viaggiare in rete per comunicarsela.
Il sistema A sceglie due numeri primi P e Q, tale che P abbia la proprietà che (P-1)/2 sia ancora un numero primo, il numero P deve avere un numero elevato di cifre. Per il numero Q non ci sono vincoli.
Il sistema A sceglie un numero segreto N molto grande e invia a B un pacchetto in cui sono contenuti i due numeri primi P, Q e il risultato dell'operazione (QN modulo P).
Alla ricezione del pacchetto, il sistema B genera un numero M, molto grande, e invia al sistema A il risultato dell'operazione: (QM modulo P).
Il sistema A, ricevendo questo valore calcola la potenza (QM modulo P)N.
Il sistema B, invece calcola (QN modulo P)M.
Entrambi i sistemi hanno ottenuto lo stesso valore (QM·N modulo P). Questo risultato rappresenta la chiave segreta che i due sistemi interconnessi condividono.
Esempio:
A sceglie P=47 e Q=7, verificando che (P-1)/2 sia ancora un numero primo. Genera il numero casuale N=10 ed invia a B il pacchetto: (47, 7, 32) - corrispondenti ai valori P=47, Q=7 e 710 modulo 47=32;
B genera un numero casuale M=6 e invia ad A il pacchetto contenente 8, ottenuto dal calcolo: 76 modulo 47=8;
A calcola 810 modulo 47 = 34;
B calcola 326 modulo 47 = 34.
I due sistemi usano il valore 34 come chiave segreta condivisa. È ovvio che, siccome ad un intruso sono richiesti solo 47 tentativi per individuare la chiave, occorre scegliere il numero P molto grande.
Un intruso potrebbe intercettare il primo messaggio inviato dal sistema A e quindi stabilire una chiave condivisa con A, poi l'intruso invia a B il messaggio che aveva intercettato e quindi stabilisce una chiave condivisa anche con B. A questo punto l'intruso intercetta i messaggi spediti da uno dei due sistemi, li modifica e li consegna all'altro sistema.
Un centro di distribuzione delle chiavi ha lo scopo di autenticare gli utenti che intendono comunicare e permettere loro di scambiarsi la chiave condivisa.
Gli utenti che usano il centro di distribuzione delle chiavi devono condividere una chiave segreta con il centro. Ad esempio, il sistema A condivide, con il centro di distribuzione delle chiavi, la chiave Ka, mentre il sistema B condivide, con il centro di distribuzione delle chiavi, la chiave Kb.
Il sistema A, criptando il pacchetto con la chiave Ka, invia al KDC
la propria identità,
l'identificativo del destinatario B con cui vuole comunicare,
la chiave Ks che vuole condividere con il sistema destinatario B.
Il centro di distribuzione delle chiavi dopo aver decriptato il messaggio ricevuto da A, criptando il pacchetto con la chiave Kb, invia al sistema destinatario B:
L'identificativo del sistema A a cui connettersi,
La chiave da condividere con il sistema A
Il rischio di questo metodo consiste nella possibilità che l'intruso potrebbe intercettare il pacchetto che il KDC invia a B e, intercettando i pacchetti successivi, pur non riuscendo a decriptarli, li invierebbe in un momento successivo a B. Per contrastare questo attacco i messaggi vengono corredati di un campo che ne marca la validità temporale, in modo che B scarta quelli che vengono ritenuti scaduti.