Ogni volta che invii un messaggio, effettui un pagamento online o accedi a un servizio sicuro, la crittografia lavora dietro le quinte per mantenere i tuoi dati privati. Uno degli algoritmi che svolge questo compito oggi è ChaCha20: un cifrario veloce, sicuro e leggero, fidato dai giganti della tecnologia e dagli esperti di sicurezza. Ecco cos'è e come protegge i tuoi dati.

ChaCha20

Comprendere l'algoritmo ChaCha20

Per comprendere l'algoritmo ChaCha20, è utile scomporlo nei suoi elementi fondamentali: la sua origine, il processo che utilizza per produrre i dati crittografati e il ruolo della chiave, del nonce e del contatore. Ciascuna di queste parti lavora insieme per offrire velocità, efficienza e sicurezza, rendendo ChaCha20 una scelta solida in molti protocolli di crittografia moderni.

Chi ha sviluppato ChaCha20 e perché?

ChaCha è stato sviluppato nel 2008 da Daniel J. Bernstein, un matematico, informatico e crittografo americano-tedesco. Si basa sul suo precedente progetto, Salsa20.

Uno dei motivi principali per la creazione di ChaCha20 era offrire una valida alternativa a cifrari ampiamente utilizzati come l'Advanced Encryption Standard (AES). Sebbene AES sia molto sicuro, funziona più velocemente sui dispositivi che supportano l'accelerazione hardware: istruzioni CPU speciali, come le Advanced Encryption Standard New Instructions (AES-NI) di Intel, che ne velocizzano le operazioni. Molti dispositivi più vecchi, mobili o a basso consumo non dispongono di questo supporto hardware, rendendo AES più lento e più dispendioso in termini di batteria quando implementato puramente via software.

ChaCha20 è stato progettato per evitare questo problema. Utilizza solo operazioni semplici che vengono eseguite rapidamente su praticamente qualsiasi processore. Questo design leggero lo rende particolarmente adatto a smartphone, sistemi embedded e altri ambienti con risorse limitate. Oggi ChaCha20 è raccomandato in protocolli moderni come Transport Layer Security (TLS) 1.3 come opzione affidabile accanto ad AES.

Come funziona ChaCha20

Diciamo che vuoi crittografare questo messaggio usando ChaCha20: “ExpressVPN protegge la mia privacy online e aiuta a mantenere i miei dati al sicuro.” Ecco come si fa, passo dopo passo.

1. Trasforma il messaggio in byte.

I computer lavorano con i byte, che sono unità da 8 bit in grado di memorizzare un numero da 0 a 255. Un testo come la nostra frase viene memorizzato associando ogni carattere (“E,” “x,” spazio, “.”, ecc.) a 1 byte. La nostra frase è lunga 66 byte, quindi servirà un po’ più di un chunk (blocco) da 64 byte per crittografarla.

2. Poi ti serve una chiave segreta.

ChaCha20 è un cifrario simmetrico, il che significa che lo stesso segreto viene usato per crittografare e decrittografare. Quel segreto è una chiave da 256 bit (32 byte). Puoi immaginarla come una password lunga e casuale che solo il mittente e il destinatario conoscono. Perché 256 bit? È abbastanza grande da rendere praticamente impossibile indovinarla per tentativi.

3. Serve anche un nonce (numero usato una sola volta).

Un nonce è un numero pubblico e univoco scelto per ogni messaggio che crittografi con una determinata chiave.

Nella versione Internet Engineering Task Force (IETF) di ChaCha20, il nonce è di 96 bit (12 byte). Non deve essere segreto, ma non deve mai ripetersi con la stessa chiave. Riutilizzare una coppia chiave–nonce rivelerebbe il tuo messaggio.

4. ChaCha20 genera un keystream.

ChaCha20 appartiene alla famiglia dei “cifrari a flusso”. Invece di mescolare direttamente il messaggio, produce prima un flusso di byte pseudo-casuali chiamato keystream. Poi si combina quel keystream con i byte del messaggio usando una semplice operazione chiamata OR esclusivo (XOR).

Come fa ChaCha20 a generare il keystream?

Costruire uno stato interno

ChaCha20 mantiene una piccola area di lavoro chiamata stato, disposta come una griglia 4×4 di numeri. Ogni numero della griglia è una word, che qui indica un intero senza segno a 32 bit (4 byte) come, ad esempio, 00000000 00000000 00000111 01001001.

Le 16 word della griglia sono riempite con:

  • 4 costanti fisse (identificano semplicemente l’algoritmo),
  • 8 word dalla chiave a 256 bit (poiché 8 × 4 byte = 32 byte),
  • 1 contatore di blocco (spiegato di seguito),
  • 3 word dal nonce (3 × 4 byte = 12 byte).

ChaCha internal state

Il contatore di blocco

Il keystream viene prodotto in blocchi di 64 byte alla volta.

Per rendere diverso ogni blocco da 64 byte, ChaCha20 usa un contatore a 32 bit all’interno dello stato che inizia da 0 per il primo blocco, 1 per il blocco successivo, e così via.

Mescolare lo stato (il nucleo ARX)

ChaCha20 mescola ripetutamente le 16 parole della griglia usando solo tre operazioni: addizione (modulo 2³²), rotazione (rotazione bit a bit di parole a 32 bit) e XOR (che confronta due bit e restituisce 1 se sono diversi e 0 se sono uguali).

Questa mescolanza, basata sulle operazioni di Addition, Rotation e XOR (ARX), avviene in round (ChaCha20 esegue 20 round). Il punto chiave è che queste operazioni semplici e veloci rimescolano a fondo lo stato in un modo difficile da invertire senza la chiave.

Produrre 64 byte di keystream

Dopo la mescolanza, ChaCha20 somma lo stato originale allo stato mescolato (parola per parola) e poi restituisce il risultato come 64 byte di keystream. Questo è un blocco di keystream.

5. Generare tutti i blocchi di keystream necessari

Il messaggio può avere qualsiasi lunghezza. ChaCha20 usa semplicemente counter = 0 per generare i primi 64 byte di keystream, counter = 1 per i successivi 64 byte, counter = 2 per i successivi 64 byte, e così via. Poiché il counter cambia, ogni blocco di keystream è unico (anche con la stessa chiave e lo stesso nonce).

6. Allineare il keystream al messaggio

Il nostro messaggio di esempio è di 67 byte, quindi il blocco 0 copre i byte 0–63 del messaggio (64 byte) e il blocco 1 copre i byte 64–66 del messaggio (gli ultimi 3 byte). Usiamo solo i primi 3 byte del secondo blocco di keystream e ignoriamo il resto.

7. Combinare il messaggio con il keystream usando XOR

XOR è un'operazione byte per byte con una proprietà elegante: eseguire lo stesso XOR due volte riporta al punto di partenza:

Cifratura (per byte): plaintext XOR keystream = ciphertext

Decrittazione (per byte, stesso keystream): ciphertext XOR keystream = plaintext

Confronto tra ChaCha20 e altri cifrari

Sebbene ChaCha20 sia ampiamente utilizzato oggi, non è l'unico algoritmo di crittografia in uso. Altri cifrari, come AES e Rivest–Shamir–Adleman (RSA), sono altrettanto comuni, ma funzionano in modi diversi e sono adatti a compiti differenti. Confrontarli aiuta a capire dove si colloca ChaCha20 e perché alcuni protocolli lo scelgono rispetto alle alternative.

ChaCha20 vs. AES

ChaCha20 e AES sono entrambi algoritmi di crittografia a chiave simmetrica, il che significa che la stessa chiave viene utilizzata sia per la cifratura che per la decifratura. Per comprendere meglio le varie tecniche crittografiche, comprese le differenze tra crittografia e hashing, puoi consultare questa spiegazione di hashing vs. crittografia.

La principale differenza tra ChaCha20 e AES sta nel modo in cui elaborano i dati. AES è un cifrario a blocchi, che cifra i dati in blocchi di dimensione fissa, mentre ChaCha20 è un cifrario a flusso, che genera un keystream continuo combinato con i dati.

AES spesso beneficia dell'accelerazione hardware sui processori moderni, il che lo rende estremamente veloce in tali ambienti. ChaCha20, d'altra parte, è progettato per offrire prestazioni costantemente buone anche senza supporto hardware specializzato, il che lo rende una scelta solida per i dispositivi mobili e i sistemi a basso consumo. Ecco perché ExpressVPN utilizza sia AES-256 che ChaCha20 per il suo protocollo Lightway, passando automaticamente a quello più adatto al tuo dispositivo (puoi anche sceglierne uno o l'altro manualmente).

Un'altra differenza pratica riguarda l'implementazione. AES può essere più complesso da implementare in modo sicuro, poiché può essere vulnerabile agli attacchi timing se non implementato con attenzione. ChaCha20 utilizza semplici operazioni ARX che vengono eseguite naturalmente in tempo costante, contribuendo a ridurre questo rischio.

Entrambi i cifrari sono considerati sicuri se implementati correttamente e i protocolli moderni come TLS 1.3 includono il supporto per ciascuno. La scelta tra i due dipende dall'hardware del dispositivo e dai requisiti di prestazione, piuttosto che da considerazioni di sicurezza.

Funzionalità ChaCha20 AES
Tipo di cifrario Cifrario a flusso Cifrario a blocchi
Accelerazione hardware Veloce su tutti i dispositivi Ottimale con AES‑NI (istruzioni hardware dedicate)
Facilità di implementazione Più semplice, operazioni a tempo costante Più complesso, richiede una programmazione accurata
Velocità senza AES‑NI (istruzioni hardware dedicate) Molto veloce Più lento

ChaCha20 vs. RSA

ChaCha20 e RSA non sono concorrenti diretti: svolgono funzioni diverse nella comunicazione sicura.

RSA è un algoritmo di crittografia asimmetrica, cioè usa una coppia di chiavi: una pubblica e una privata. Viene in genere usato all’inizio di una connessione sicura per scambiare le chiavi di crittografia o verificare le identità. In TLS, l’algoritmo a chiave simmetrica è spesso AES, con lo scambio delle chiavi protetto da RSA.

Poiché RSA implica una matematica più complessa e opera su chiavi di dimensioni maggiori, è più lento e meno efficiente per la crittografia continua dei dati.

ChaCha20, invece, è un cifrario a flusso simmetrico. Usa un’unica chiave condivisa sia per la crittografia sia per la decrittografia, il che lo rende più veloce e più adatto al trasferimento continuo dei dati.

Nella pratica, molti protocolli sicuri combinano entrambi gli approcci: RSA (o un altro algoritmo asimmetrico) per l’handshake iniziale e ChaCha20 o un altro cifrario simmetrico per il resto della sessione.

Vantaggi di ChaCha20

ChaCha20 è popolare non solo perché è sicuro, ma anche perché funziona bene nelle situazioni reali. È veloce su ogni tipo di dispositivo, anche telefoni e gadget con meno potenza. Il suo design è lineare, il che aiuta a evitare errori comuni che possono indebolire la crittografia.

Velocità e prestazioni su dispositivi mobili e a basso consumo

ChaCha20 è progettato per funzionare in modo efficiente su ogni tipo di hardware, non solo sui processori di fascia alta. Sui dispositivi senza accelerazione hardware AES, come molti smartphone, tablet o dispositivi IoT, può risultare sensibilmente più veloce.

Semplicità e resistenza agli attacchi timing

ChaCha20 è basato su semplici operazioni ARX. Queste vengono eseguite in tempo costante, cioè la velocità di esecuzione non cambia in base ai dati elaborati: tutte le operazioni richiedono esattamente lo stesso tempo.

Questo design rende più facile un'implementazione sicura e aiuta a proteggere dagli attacchi timing, che cercano di estrarre informazioni misurando quanto tempo richiedono i passaggi di crittografia.

Quali sono i limiti noti di ChaCha20?

ChaCha20 è stato studiato per anni e non sono stati pubblicati attacchi reali alla versione completa da 20 round. Nel complesso, è l'alternativa ad AES più approfonditamente testata disponibile oggi. Tuttavia, presenta alcuni limiti chiari che gli sviluppatori dovrebbero tenere a mente. Usarlo al di fuori di questi confini può indebolirne la protezione.

  • Il riutilizzo del nonce è un rischio grave: Usare lo stesso nonce con la stessa chiave compromette immediatamente la riservatezza. Ogni coppia nonce–chiave deve essere unica.
  • Nessuna autenticazione integrata: ChaCha20 cifra solo i dati. Per verificare che i dati non siano stati alterati, andrebbe usato insieme a Poly1305.
  • Limite sui dati cifrati per chiave/nonce: ChaCha20 può gestire fino a 2³² blocchi di 64 byte (circa 256 GB) con la stessa chiave e lo stesso nonce. Superare questo limite causerebbe il riutilizzo del keystream e comprometterebbe completamente la sicurezza della crittografia.

ChaCha20-Poly1305 spiegato

ChaCha20‑Poly1305 è l'abbinamento di due componenti crittografici che collaborano per proteggere i dati:

  • ChaCha20 cifra le informazioni con una chiave segreta condivisa, trasformando il testo leggibile in qualcosa che appare come dati casuali a chiunque non possieda la chiave. Tuttavia, non rileva le manomissioni.
  • Poly1305 produce un codice di autenticazione del messaggio (MAC) che consente al destinatario di confermare che i dati non sono stati alterati e che provengono dalla fonte corretta.

Insieme formano ciò che è noto come Authenticated Encryption with Additional Data (AEAD). Ciò significa che il processo di crittografia non solo nasconde il contenuto del messaggio, ma ne verifica anche l'integrità.

Poly1305 non è l'unica opzione, ma è la scelta più comune quando ChaCha20 viene usato nei protocolli moderni. Questo perché ChaCha20‑Poly1305 è stato standardizzato dall'IETF (RFC 8439) ed è ampiamente supportato in TLS, SSH, WireGuard e altri protocolli, quindi è il de facto standard.

ChaCha20 nel 2025: dove viene usato nei sistemi moderni

ChaCha20 è diventato una scelta standard in molte applicazioni orientate alla sicurezza. Nella sicurezza di Internet viene usato nelle connessioni TLS, spesso insieme a Poly1305, per proteggere il traffico HTTPS, soprattutto sui dispositivi che non hanno supporto hardware per AES. I principali browser come Chrome e Firefox, e i server web come nginx e Apache, supportano questa suite di cifratura.

ChaCha20 used in modern systems

È anche ampiamente usato nelle reti private virtuali (VPN). Il protocollo VPN WireGuard, ad esempio, imposta ChaCha20‑Poly1305 come predefinito per proteggere i dati mantenendo prestazioni elevate sui dispositivi mobili ed embedded. Il supporto è inoltre integrato nei principali sistemi operativi, tra cui Linux, Android, iOS e Windows.

Riepilogo

ChaCha20 è un cifrario a flusso moderno e adatto al software, creato da Daniel J. Bernstein come alternativa veloce e sicura ad AES, soprattutto su dispositivi mobili e a basso consumo senza accelerazione hardware. Cifra i dati usando una chiave a 256 bit, un nonce univoco a 96 bit e un contatore di blocchi per generare un keystream pseudo-casuale, che viene combinato con il testo in chiaro tramite XOR. Il suo design ARX (Addition‑Rotation‑XOR) è semplice, efficiente e naturalmente resistente agli attacchi timing. ChaCha20 è simmetrico (la stessa chiave per cifratura e decifratura) e differisce dai cifrari a blocchi come AES e dagli algoritmi asimmetrici come RSA, che in genere vengono usati solo per lo scambio di chiavi o l'autenticazione. Pur essendo considerato altamente sicuro e ampiamente impiegato in TLS, VPN e sulle principali piattaforme, ChaCha20 deve essere usato con una stretta univocità del nonce e un limite di dati per coppia chiave/nonce, e non offre autenticazione integrata: di solito viene quindi combinato con Poly1305 nella costruzione AEAD standardizzata ChaCha20‑Poly1305 per garantire sia la riservatezza sia l'integrità.

FAQ: domande comuni su ChaCha20

Google usa ChaCha20?

Sì. Google ha adottato ChaCha20 con Poly1305 nel 2014 come parte dei suoi protocolli Transport Layer Security (TLS) / Secure Sockets Layer (SSL). L'obiettivo era migliorare le prestazioni e la sicurezza per i dispositivi mobili e i server privi di accelerazione hardware Advanced Encryption Standard (AES), rendendo le connessioni sicure più veloci e più efficienti in tali ambienti.

ChaCha20 è resistente ai computer quantistici?

Sì. I cifrari simmetrici, come ChaCha20, sono generalmente considerati sicuri contro i computer quantistici, purché utilizzino chiavi sufficientemente lunghe (ad es. 256 bit).

ChaCha20 può essere usato per la crittografia dei file?

Sì. ChaCha20 può essere utilizzato negli strumenti di crittografia dei file per proteggere i dati sensibili memorizzati sui dispositivi. La sua velocità ed efficienza lo rendono adatto sia per file di grandi dimensioni sia per dispositivi con potenza di elaborazione limitata.

ChaCha20 può essere violato?

Non esistono attacchi reali pubblicati in grado di violare il cifrario ChaCha20 completo a 20 round. Gli esperti di sicurezza continuano a studiarlo e, se usato correttamente entro i suoi limiti, è considerato sicuro per le esigenze di crittografia moderne.