Encrypted Key Exchange (anche detta EKE) è una famiglia di metodi di interazione tra due o più partecipanti per l'autenticazione e la condivisione di una chiave crittografica di sessione. Basati sulla conoscenza condivisa di una comune password, sono stati descritti da Steven M. Bellovin e Michael Merritt.[1] Alcune varianti di EKE presenti nella pubblicazione originale hanno mostrato diverse debolezze, ma altre sue varianti, migliorate e potenziate, hanno reso EKE il primo metodo efficace per ricavare una chiave di sessione condivisa e l'autenticazione mutua mediante una password condivisa.
Un protocollo EKE per essere considerato sicuro deve poter garantire la robustezza nei confronti di diversi attacchi:
Una delle versioni presenti nella pubblicazione originale ed effettivamente sicura è basata sul metodo di scambio di chiavi Diffie-Hellman. Si riporta di seguito il protocollo. Si supponga che sia il client, sia il server e sia con funzione crittografica di hash.
con indichiamo la cifratura con un algoritmo a chiave simmetrica di con la chiave
calcola K come e sceglie un nonce
può decifrare il challenge selezionare un nuovo nonce . In questo modo invia un challenge al server e nel contempo mostra di conoscere autenticandosi come verso il server
il server risponde al challenge autenticandosi verso . Di qui in poi i due attori del protocollo sono autenticati e dispongono di una chiave di sessione. Si noti che un attacco brute force sui messaggi cifrati con sono inattuabili poiché un attaccante non può verificare (se non per tentativi on-line) che la decifratura è andata a buon fine. La quantità è infatti casuale. Lo stesso motivo (la scelta di quantità e casuali mette al sicuro il protocollo nei confronti di reply-attack).
DH-EKE è vulnerabile ad un attacco di discovery sul database del server. Se infatti un malintenzionato riuscisse a rubare l'hash potrebbe inscenare un protocollo di autenticazione sia camuffandosi da server, che da client.
Per eliminare la vulnerabilità precedente si fa in modo che il server conservi non la password, ma una quantità derivata da una funzione one-way applicata sulla stessa. In questo modo un attaccante anche rubando le informazioni presenti sul server non può utilizzarle per rimpiazzare il client.