In origine, lo scopo della crittografia era quello di consentire a due interlocutori (tradizionalmente chiamati Alice e Bob) di scambiarsi messaggi senza che un terzo (tradizionalmente chiamato Eva) fosse in grado di leggerli. Alice e Bob concorderanno quindi un metodo per scambiare ogni messaggio M in una forma cifrata C. Eva può osservare il mezzo attraverso il quale transitano i cifrari C e conoscere ciascuno di essi, ma non trovare le informazioni scambiate senza conoscere il segreto appropriato, generalmente chiamata chiave.
È un esercizio molto antico, poiché si parla ad esempio del “cifrario di Giulio Cesare”. Tuttavia, è diventato molto importante negli ultimi anni, a causa della crescente necessità di scambiare informazioni. La crittografia è così diventata una parte essenziale della nostra vita quotidiana. Oltre allo scambio di messaggi, i meccanismi crittografici sono utilizzati in molti oggetti di uso quotidiano, per identificare e autenticare gli utenti e le loro transazioni. Questi meccanismi si trovano nei telefoni, per crittografare e autenticare le comunicazioni tra il telefono e le antenne radio, o nelle chiavi delle auto, nelle carte bancarie, ecc.
Internet ha anche reso popolare il lucchetto nei browser, per indicare che le comunicazioni tra il browser e il server sono protette da meccanismi crittografici. Per funzionare correttamente, questi meccanismi richiedono l’uso di numeri casuali, la cui qualità (più precisamente la loro non prevedibilità) contribuisce alla sicurezza dei protocolli.
Algoritmi crittografici
Per trasformare un messaggio M in C crittografato mediante un algoritmo A, vengono utilizzate le chiavi. Nei cosiddetti algoritmi simmetrici si parla di chiavi segrete (Ks), che sono condivise e mantenute segrete da Alice e Bob. Nell’ambito degli algoritmi asimmetrici, esistono coppie di chiavi pubbliche (KPu) e private (KPr). Per ogni utente, KPu è noto a tutti, mentre KPr deve essere custodito con cura dal suo proprietario. Anche l’algoritmo A è pubblico, il che significa che la segretezza della comunicazione si basa esclusivamente sulla segretezza delle chiavi (segrete o private).
A volte il messaggio M trasmesso non è importante di per sé e lo scopo della crittografia di un determinato messaggio M è verificare che il suo corrispondente possa decrittografarlo. Questa prova del possesso di Ks o KPr può essere utilizzata in alcuni schemi di autenticazione. In questo caso, è importante non utilizzare mai più volte lo stesso messaggio M, poiché ciò consentirebbe a Eva di conoscere le informazioni relative alle chiavi. È quindi necessario generare un messaggio casuale NA, che cambierà ogni volta che Alice e Bob vorranno comunicare.
L’esempio più noto e probabilmente il più utilizzato di questo meccanismo è l’algoritmo di Diffie-Helman. Questo algoritmo permette ad un browser (Alice) e ad un sito web (Bob) di ottenere una chiave segreta Ks identica, diversa ad ogni connessione, avendo preventivamente scambiato le rispettive KPu. Questo processo viene eseguito ad esempio quando ci si connette a un sito di un commerciante. Ciò consente al browser e al sito Web di scambiare messaggi crittografati con una chiave che verrà distrutta al termine di ogni sessione. Ciò significa che non è necessario conservarlo (facilità d’uso, sicurezza perché ci sono meno possibilità di perdere questa chiave). Ciò implica anche che non crittograferemo molto traffico con la stessa chiave, il che rende gli attacchi di crittoanalisi più difficili rispetto a quando usiamo sempre la stessa chiave.
La generazione di numeri casuali
Affinché Eva non possa ottenere la chiave segreta, è molto importante che non possa indovinare il messaggio di NA. In pratica, questo messaggio è spesso un grande numero casuale utilizzato nei calcoli definiti dall’algoritmo scelto.
Inizialmente, la generazione casuale è stata utilizzata per molti lavori di simulazione. Per ottenere risultati rilevanti, è importante non ripetere la simulazione con sempre gli stessi parametri, ma ripetere la simulazione con parametri diversi, centinaia o addirittura migliaia di volte. Si cerca quindi di generare numeri che rispettino determinate proprietà statistiche e che non consentano di differenziare la sequenza di numeri da una sequenza che si otterrebbe, ad esempio, estraendo dadi.
Per generare un numero casuale NA utilizzabile in queste simulazioni, si utilizzano generalmente i cosiddetti generatori pseudo-casuali, che applicano un algoritmo di rielaborazione ad un valore iniziale, chiamato “seed”. Questi generatori pseudo-casuali mirano a produrre una sequenza di numeri che sembra una sequenza casuale, secondo questi criteri statistici. Tuttavia, usando lo stesso seme due volte, otteniamo la stessa sequenza due volte.
L’algoritmo del generatore pseudo-casuale è generalmente pubblico. Se un attaccante è in grado di indovinare il seme, è in grado di generare la sequenza casuale, e quindi ottenere i numeri casuali utilizzati dagli algoritmi crittografici. Nel caso specifico della crittografia, l’attaccante non ha nemmeno necessariamente bisogno di conoscere il valore esatto del seme. Se è in grado di indovinare un insieme di valori, è sufficiente per calcolare rapidamente tutte le chiavi possibili e rompere la cifra.
Negli anni 2000, i programmatori utilizzavano semi che potevano essere facilmente intuiti, ad esempio in base al tempo, rendendo i sistemi vulnerabili. Poiché, per evitare questa capacità di indovinare il seme (o un insieme di valori di quel seme), i sistemi operativi si basano su un mix di elementi fisici del sistema (temperatura CPU, connessioni sul bus, ecc.). Questi elementi fisici sono impossibili da osservare per un attaccante, variano frequentemente e quindi costituiscono una buona fonte di seed per generatori pseudo-casuali.
E le vulnerabilità?
Sebbene il campo sia ora ben compreso, i generatori di numeri casuali a volte sono ancora soggetti a vulnerabilità. Pertanto, tra il 2017 e il 2021, i ricercatori di sicurezza informatica hanno rilevato 53 di questi difetti (CWE-338). Ciò rappresenta solo un piccolo numero di vulnerabilità del software (meno di 1 su 1000). Molte di queste vulnerabilità, tuttavia, sono elevate o critiche, il che indica che possono essere utilizzate abbastanza facilmente dagli aggressori e che sono diffuse.
Un esempio emblematico nel 2010 è stato l’errore di Sony nel sistema di firma del software della PS3. In questo caso, il riutilizzo di un azzardo per due firme distinte ha consentito a un utente malintenzionato di trovare la chiave privata del produttore: diventa quindi possibile installare qualsiasi software sulla console, compresi quelli piratati o malware.
Nel periodo 2017-2021, i difetti hanno interessato anche i componenti fisici: processori Intel Xeon, chip Broadcom utilizzati per le comunicazioni e processori Qualcom SnapDragon integrati in particolare nei telefoni cellulari. Questi difetti influiscono sulla qualità della generazione di numeri casuali. Ad esempio, CVE-2018-5871 e CVE-2018-11290 riguardano un generatore di semi la cui periodicità è troppo breve, cioè che ripete rapidamente la stessa serie di semi. Queste vulnerabilità sono state corrette e interessano solo alcune funzioni dell’hardware, il che limita il rischio.
La qualità della generazione di numeri casuali è quindi effettivamente un problema di sicurezza. I sistemi operativi in esecuzione su processori recenti (meno di 10 anni) hanno meccanismi di generazione di numeri casuali basati su hardware. Ciò consente generalmente di garantire una buona qualità di questi e quindi un corretto funzionamento degli algoritmi crittografici, anche se possono verificarsi vulnerabilità occasionali. La difficoltà è invece particolarmente marcata sul lato degli oggetti connessi, le cui capacità hardware non consentono l’implementazione di generatori casuali potenti come quelli disponibili su computer e smartphone, e che spesso si dimostrano più vulnerabili.
Autore
Hervé Debar, Olivier Levillain, Telecom SudParis – Institut Mines-Télécom