Immagina di dover concordare una password con una persona che non hai mai incontrato, scrivendo soltanto su una lavagna che chiunque può leggere. Sembra impossibile: tutto ciò che scrivi è pubblico. Eppure è proprio ciò che permette lo scambio di chiavi Diffie-Hellman, pubblicato nel 1976 da Whitfield Diffie e Martin Hellman. È una delle idee più eleganti della crittografia moderna, e la usi ogni volta che apri un sito in HTTPS.
L'analogia dei colori
Un modo intuitivo per capirlo usa la pittura.
- Anna e Bruno si accordano pubblicamente su un colore di base, per esempio giallo.
- Ciascuno sceglie in segreto un proprio colore: Anna il rosso, Bruno il blu.
- Anna mescola il giallo con il suo rosso e invia a Bruno il risultato, un arancione. Bruno mescola il giallo con il suo blu e invia ad Anna un verde.
- Anna aggiunge il proprio rosso al verde ricevuto; Bruno aggiunge il proprio blu all'arancione ricevuto.
Entrambi ottengono lo stesso colore finale: giallo, rosso e blu mescolati. Chi ha osservato lo scambio ha visto il giallo, l'arancione e il verde, ma non sa "separare" i colori per scoprire il rosso o il blu segreti, e quindi non può ottenere il colore finale.
L'analogia funziona perché mescolare i colori è facile, mentre separarli è praticamente impossibile. In matematica serve un'operazione con la stessa proprietà.
La versione matematica
L'operazione "facile in un verso, difficile nell'altro" è l'elevamento a potenza modulare: calcolare g elevato alla a, e prendere il resto della divisione per un numero primo p. Farlo è rapido; risalire ad a conoscendo il risultato, il cosiddetto logaritmo discreto, è estremamente difficile quando p è molto grande.
Un esempio con numeri piccoli
- Valori pubblici: il primo p = 23 e la base g = 5.
- Anna sceglie in segreto a = 4 e calcola 5⁴ = 625; il resto della divisione per 23 è 4. Invia 4 a Bruno.
- Bruno sceglie in segreto b = 3 e calcola 5³ = 125; il resto della divisione per 23 è 10. Invia 10 ad Anna.
- Anna calcola 10⁴ = 10000; il resto della divisione per 23 è 18.
- Bruno calcola 4³ = 64; il resto della divisione per 23 è 18.
Entrambi hanno ottenuto il segreto condiviso 18, che non è mai stato trasmesso. Un osservatore conosce 23, 5, 4 e 10, ma per arrivare a 18 dovrebbe ricavare a oppure b. Con numeri di migliaia di bit, questo non è fattibile.
Il segreto condiviso non si usa direttamente come chiave: viene passato in una funzione di derivazione che produce le chiavi simmetriche per cifrare la comunicazione.
Il punto debole: chi c'è dall'altra parte?
Diffie-Hellman, da solo, garantisce che nessuno osservando lo scambio possa ricavare il segreto. Non garantisce però con chi lo stai condividendo.
Un attaccante in grado di intercettare e modificare i messaggi può mettersi in mezzo: fa uno scambio con Anna fingendosi Bruno e un altro con Bruno fingendosi Anna. Ottiene due segreti, uno per lato, e può leggere e ritrasmettere tutto. È il classico attacco man in the middle.
La soluzione è autenticare lo scambio. In TLS, per esempio, il server firma i propri valori con la chiave privata del certificato; nelle app di messaggistica cifrata le chiavi d'identità vengono confrontate tramite i codici di sicurezza. Scambio di chiavi e autenticazione sono due metà della stessa protezione.
Versioni moderne
Diffie-Hellman su curve ellittiche
La stessa idea funziona con le curve ellittiche: al posto dell'elevamento a potenza si usa la moltiplicazione di un punto per un numero. Si chiama ECDH, e la sua variante più diffusa, X25519, è oggi lo scambio di chiavi predefinito in molti protocolli. Le chiavi sono molto più corte e i calcoli più veloci rispetto alla versione classica.
Chiavi effimere e forward secrecy
Se Anna e Bruno generano valori segreti nuovi a ogni sessione e li cancellano subito dopo, si parla di scambio effimero (DHE o ECDHE). Il vantaggio è la forward secrecy: anche se in futuro venisse rubata una chiave a lungo termine, le sessioni passate resterebbero protette, perché i segreti che le hanno generate non esistono più.
Errori da evitare
- Parametri troppo piccoli: nel 2015 l'attacco noto come Logjam ha mostrato che molti server accettavano ancora gruppi Diffie-Hellman da 512 bit, retaggio di vecchie limitazioni all'esportazione, e che questi potevano essere violati. Oggi si usano almeno 2048 bit per la versione classica, o curve ellittiche moderne.
- Valori non verificati: un'implementazione deve controllare che i valori ricevuti siano validi, altrimenti può essere indotta a produrre segreti deboli.
- Scambio non autenticato: senza firma o verifica delle chiavi, la protezione contro l'intercettazione attiva è nulla.
In sintesi
- Diffie-Hellman permette di concordare un segreto su un canale pubblico senza mai trasmetterlo.
- Si basa sulla difficoltà del logaritmo discreto, o del suo equivalente sulle curve ellittiche.
- Da solo non protegge da chi si mette in mezzo: lo scambio va autenticato.
- X25519 è la versione moderna più diffusa; le chiavi effimere offrono forward secrecy.
- Parametri piccoli e valori non verificati sono gli errori da evitare.