Un cifrario a blocchi come AES sa fare una sola cosa: prendere un blocco di 16 byte e trasformarlo, con una chiave, in un altro blocco di 16 byte. Ma un file, un messaggio o una connessione sono fatti di migliaia o milioni di blocchi. Il modo in cui questi blocchi vengono collegati tra loro si chiama modalità operativa, e la sua scelta conta quanto quella dell'algoritmo. Due sistemi che usano entrambi "AES-256" possono avere livelli di sicurezza molto diversi.
ECB: il modo sbagliato più semplice
Nella modalità ECB (Electronic Codebook) ogni blocco viene cifrato in modo indipendente con la stessa chiave. È la soluzione più intuitiva, ed è proprio per questo che va evitata.
Il problema è che blocchi in chiaro identici producono blocchi cifrati identici. Se un file contiene ripetizioni, queste restano visibili anche dopo la cifratura. L'esempio più famoso è un'immagine bitmap cifrata in ECB: i colori diventano casuali, ma i contorni della figura restano perfettamente riconoscibili.
ECB permette anche di riordinare, duplicare o sostituire blocchi senza che il destinatario se ne accorga. Non c'è alcuna situazione pratica in cui sia la scelta giusta per cifrare dati reali.
CBC: la catena di blocchi
La modalità CBC (Cipher Block Chaining) risolve il problema delle ripetizioni collegando ogni blocco al precedente:
- prima di cifrare un blocco, lo si combina con il blocco cifrato precedente tramite XOR;
- per il primo blocco, che non ha un predecessore, si usa un vettore di inizializzazione (IV), un valore casuale di 16 byte.
In questo modo due blocchi identici in posizioni diverse producono risultati diversi, e lo stesso messaggio cifrato due volte con IV diversi dà due testi cifrati diversi.
CBC è stato per anni la modalità più usata, ma ha alcuni limiti importanti:
- l'IV deve essere imprevedibile: un IV ripetuto o indovinabile ha permesso attacchi pratici contro versioni passate di TLS;
- richiede un riempimento (padding) per portare i dati a un multiplo di 16 byte, e la gestione degli errori di riempimento ha dato origine agli attacchi detti padding oracle, in cui un server che rivela se il riempimento è corretto permette di decifrare i dati un byte alla volta;
- non protegge l'integrità: un attaccante può modificare il testo cifrato e ottenere alterazioni controllate nel testo in chiaro;
- la cifratura non è parallelizzabile, perché ogni blocco dipende dal precedente.
CTR: trasformare un cifrario a blocchi in un cifrario a flusso
La modalità CTR (Counter) funziona in modo diverso: invece di cifrare i dati, cifra una sequenza di valori formata da un nonce e da un contatore che aumenta di uno a ogni blocco. Il risultato è un flusso di byte pseudocasuali che viene combinato con i dati tramite XOR.
I vantaggi sono notevoli:
- nessun riempimento: si cifra esattamente la lunghezza dei dati;
- piena parallelizzazione, sia in cifratura sia in decifratura;
- possibilità di decifrare un punto qualsiasi del file senza partire dall'inizio.
Il rischio principale è il riutilizzo del nonce: se la stessa combinazione di chiave e nonce viene usata per due messaggi, combinando i due testi cifrati si eliminano i flussi pseudocasuali e si ottiene il confronto diretto tra i due testi in chiaro. Inoltre, come CBC, CTR da solo non protegge l'integrità.
GCM: cifratura e autenticazione insieme
La modalità GCM (Galois/Counter Mode) combina la cifratura CTR con un meccanismo di autenticazione. Oltre al testo cifrato produce un'etichetta di autenticazione (tag), tipicamente di 16 byte, calcolata su tutto il messaggio.
Al momento della decifratura il destinatario ricalcola l'etichetta: se non coincide, il messaggio è stato alterato o la chiave è sbagliata, e i dati vengono scartati senza essere restituiti. Questo schema si chiama cifratura autenticata con dati associati (AEAD): permette anche di autenticare informazioni che devono restare in chiaro, come le intestazioni di un pacchetto, legandole al contenuto cifrato.
GCM è oggi la modalità predefinita in TLS e in moltissimi altri protocolli. Ha però un requisito rigido: il nonce non deve mai ripetersi con la stessa chiave. Una ripetizione compromette la riservatezza dei messaggi coinvolti e permette di falsificare etichette di autenticazione. Esistono varianti, come AES-GCM-SIV, progettate per limitare i danni in caso di nonce ripetuti.
L'alternativa più diffusa a AES-GCM è ChaCha20-Poly1305, anch'essa una cifratura autenticata, particolarmente veloce sui dispositivi privi di accelerazione hardware per AES.
Un confronto riassuntivo
| Modalità | Nasconde le ripetizioni | Protegge l'integrità | Valore iniziale | Uso consigliato |
|---|---|---|---|---|
| ECB | No | No | Nessuno | Mai, per dati reali |
| CBC | Sì | No | IV casuale e imprevedibile | Solo sistemi esistenti, con autenticazione separata |
| CTR | Sì | No | Nonce unico | Come base per modalità autenticate |
| GCM | Sì | Sì | Nonce unico | Scelta predefinita |
Per i dischi si usa una modalità specifica, XTS, progettata per cifrare settori di dimensione fissa senza spazio aggiuntivo per IV o etichette.
In sintesi
- La modalità operativa decide come un cifrario a blocchi tratta dati più lunghi di un blocco.
- ECB rivela le ripetizioni e non va mai usata per dati reali.
- CBC e CTR nascondono le ripetizioni ma non proteggono l'integrità.
- GCM e ChaCha20-Poly1305 offrono cifratura autenticata e sono le scelte predefinite di oggi.
- Il nonce o l'IV non deve mai ripetersi con la stessa chiave.