🔑 Crittografia

Diffie-Hellman: lo scambio di chiavi spiegato semplice

Come concordare una chiave segreta parlando in pubblico: lo scambio Diffie-Hellman con un esempio numerico, i suoi limiti e le versioni moderne.

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.

  1. Anna e Bruno si accordano pubblicamente su un colore di base, per esempio giallo.
  2. Ciascuno sceglie in segreto un proprio colore: Anna il rosso, Bruno il blu.
  3. 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.
  4. 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.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche