La crittografia moderna tra esempi e pratica: i cifrari a chiave privata
Eccoci al secondo episodio di questa prima serie di articoli dedicati alla sicurezza informatica ed, in questo caso particolare, alla crittografia.
Nell’articolo precedente abbiamo definito i termini necessari ed inquadrato il contesto anche grazie ai primi esempi storici, alcuni davvero semplici ma efficaci per condurre i primi passi. Con questo articolo entriamo nel vivo, introducendo concetti e cifrari che sono anche oggi adoperati per assicurare confidenzialità ed integrità delle nostre comunicazioni.
La crittografia militare
Nel 1883 Auguste Kerckhoffs nell’articolo intitolato ““La cryptographie militaire” enunciò i principi che definirono per lungo tempo il modello di riferimento per chi avesse voluto cimentarsi nella definizione di un sistema crittografico.
Tra questi principi, uno in particolare è ancora oggi ritenuto valido ed è stato ripreso e riproposto anche da Claude Shannon che lo definì come “il nemico conosce il sistema”: in pratica, anche ipotizzando che il nemico entri in possesso dell’intero meccanismo e di ogni dettaglio dell’algoritmo di cifratura, i messaggi cifrati con esso devono continuare a risultare inviolati a meno che anche la chiave di cifratura adoperata non cada nelle mani del nemico.
Questo principio è opposto all’approccio della “sicurezza attraverso l’oscurità” (security through obscurity): un principio, di sicuro meno lungimirante del precedente, ma che molto spesso oggi si vede adottare nei sistemi di sicurezza.
“L’approccio della Security Through Obscurity è molto spesso adottato nei sistemi di sicurezza”
La verità è che, per definire e comprendere algoritmi crittografici aperti, robusti nonostante il nemico possa conoscere tutto di essi, è necessario sfidare una classe particolare di problemi matematici, molto complessi, in cui ricadono i one-way problems. Si tratta di problemi che sono invertibili, ossia che è possibile formulare in due modi, chiedendo, nel primo caso, come ricavare da un input il suo output e, nell’altro caso, come risalire all’input partendo da un determinato output. La caratteristica fondamentale di questi problemi è che, mentre in una direzione calcolare la risposta risulta ‘facile’, nell’altra direzione risulta estremamente complesso dal punto di vista computazionale.
Un esempio di one-way problem è il problema della fattorizzazione: data una fattorizzazione, ossia una sequenza di fattori primi ciascuno con il suo esponente, è facile trovare il numero ‘fattorizzato’: basta moltiplicare tutti i fattori. D’altra parte però, calcolare tutti i fattori di numeri molto grandi è un’impresa complessa: ad oggi non è stato ancora trovato un algoritmo efficiente che risolva questo problema. Per chi ha rudimenti di teoria della complessità, questo problema è attualmente classificato come NP, ed è alla base di un sistema crittografico oggi diffusissimo su Internet e che vedremo nel prossimo articolo, l’algoritmo RSA. Nella pratica cosa significa? Semplice, nel 2009 come risultato di uno sforzo congiunto di vari gruppi di ricerca, si concluse il calcolo della fattorizzazione di un numero composto da 232 cifre decimali, il famoso RSA-768 (si compone di 768 cifre binarie).
Ecco una foto del famoso RSA-768 espresso nel sistema decimale:
RSA-768 = 12301866845301177551304949583849627207728535695953347921973224521517264005 07263657518745202199786469389956474942774063845925192557326303453731548268 50791702612214291346167042921431160222124047927473779408066535141959745985 6902143413
Quanto hanno impiegato per fattorizzarlo? 2 anni adoperando centinaia di computer in parallelo!
Gli stessi scienziati hanno poi stimato che, per fattorizzare un numero di 1024 bit, ci vorrebbe un tempo almeno mille volte maggiore, per cui, al momento, dovremmo attendere 2 mila anni per fattorizzare RSA-1024!
La crittografia a chiave simmetrica, nota anche come crittografia a chiave privata, adopera una chiave singola sia per cifrare che per decifrare. La chiave deve quindi essere nota sia a chi cifra il messaggio che a chi deve decifrarlo per cui presuppone una fase in cui il mittente ed il destinatario si scambiano la chiave. Il problema dello scambio sicuro della chiave rappresenta un ulteriore problema di sicurezza cui accenneremo nel prossimo articolo.
L’aspetto debole della crittografia a chiave simmetrica, ossia a chiave singola, è appunto la necessità di stabilire una chiave per ogni coppia mittente-destinatario: il numero delle chiavi cresce quindi come il quadrato del numero di chi intende comunicare.
Se la fase del passaggio della chiave tra due persone risultasse compromessa e, quindi, se la chiave risultasse esposta ad un terzo ‘giocatore’, quest’ultimo potrebbe, una volta intercettato il messaggio del mittente, decifrarlo, modificarlo ed inoltrarlo modificato al destinatario: con il solo strumento offerto da un algoritmo a chiave simmetrica il destinatario potrebbe non accorgersi della ‘contraffazione’ del messaggio. In questo senso, gli algoritmi a chiave simmetrica non affrontano e non garantiscono l’aspetto dell’integrità dei messaggi, oggi molto importante per garantire una comunicazione sicura.
I sistemi crittografici simmetrici si dividono in grosse due categorie: cifrari a blocchi e cifrari su flussi di bit (stream). I primi lavorano cifrando e decifrando sezioni di dimensione fissa del testo in chiaro o cifrato, ciascuna sezione è appunto detta blocco. Normalmente i blocchi sono di 64 bit ma vi possono essere varianti più grandi o più piccole: nel caso in cui il blocco sia di un solo bit ecco che ricadiamo nella categoria dei cifrari su flussi di bit, ossia lavorano cifrando e decifrando un singolo bit alla volta. Vi sono aspetti positivi e negativi per ciascuna delle due categorie, in generale:
- i cifrari a blocchi tendono a richiedere più risorse di memoria, lavorando su quantità maggiori di dati ad ogni passo, sebbene risultino più efficienti
- i cifrari su flussi in genere risultato più veloci e meno sensibili ad errori: mentre un errore di trasmissione da un cifrario a blocchi può compromettere interi blocchi di dati, un errore in un flusso di bit compromette solo un singolo bit.
A seconda dei casi conviene adottare l’uno o l’altro: ad esempio, nel caso si sappia a priori quale sia la dimensione di un pacchetto di informazioni, è possibile sfruttare l’efficienza offerta da un cifrario a blocchi, mentre nel caso di trasmissioni di flussi di bit (live streaming o altro) è più adatto far leva sulle caratteristiche dei cifrari su flussi.
I cifrari e gli standard moderni
Alcuni dei sistemi crittografici più noti e diffusi al mondo sono basati su algoritmi di tipo simmetrico. Alcuni di essi, come il DES (Data Encryption Algorithm), il 3DES e l’AES (Advanced Encryption Standard), sono stati o sono ancora oggi adoperati dal governo USA e fanno parte di standard di mercato.
L’algoritmo DES venne introdotto nel 1976 ed è un cifrario a blocchi simmetrico che adopera chiavi a 56-bit. DES è stato considerato sicuro per un lungo periodo di tempo ossia fino al 1999, quando i risultati di un progetto di calcolo distribuito si dimostrò che era possibile trovare una chiave DES in poco più di 22 ore.
Il meccanismo generale alla base dell’algoritmo DES è illustrato nella seguente figura. Se paragonassimo il DES ad una casa, i mattoni su cui è costruito sono rappresentati dagli XOR. Lo XOR, che si indica con un simbolo di somma all’interno di un cerchio, è una semplicissima operazione binaria che ha la proprietà di essere invertibile: se opero uno XOR tra A e B ed al risultato riapplico uno XOR ulteriore con B, ottengo nuovamente A. IL DES adopera anche altri meccanismi invertibili, come la permutazione e lo slittamento circolare di blocchi di bit.
Seguendo il flusso operativo descritto in figura, vediamo come un blocco di testo in chiaro attraversi una sequenza di 16 fasi di trasformazione. In ciascuna fase, il blocco in ingresso, di 64 bit, viene prima suddiviso in due parti da 32 bit e, mentre una delle due prende il posto dell’altra per la fase successiva, l’altra attraversa un’operazione di XOR applicata al risultato di una funzione F che ha come input la seconda parte, da 32 bit, del blocco.
La funzione F è detta funzione di Feistel ed opera, a grandi linee, come mostrato nello schema seguente.
Il blocchetto da 32 bit in ingresso, in alto a sinistra nell’immagine, viene prima espanso in 48 bit, duplicandone alcuni bit, e poi sottoposto a XOR con una sottochiave di 48 bit selezionati all’interno della chiave di 56 bit. I risultato di 48 bit viene suddiviso in 8 blocchetti da 6 bit, ciascuno dei quali va in input a ciascuna delle 8 S-Box indicate in giallo: le S-Box operano una funzione non-lineare restituendo, ciascuna di esse, 4 bit di risultato. Le S-Box rappresentano il cuore della sicurezza del DES aggiungendo ‘confusione e diffusione’ nelle operazioni effettuate. Dal punto di vista informazionale non si perde nulla, poiché all’input di 32 bit corrisponde un output di 32 bit, avendo aggiunto solo temporaneamente ridondanza per attivare le 8 S-Box.
Forza e debolezza del DES
Proprio sulla scelta delle S-Box, per molti anni si è sospettato che la NSA le avesse “addomesticate” affinché non fossero troppo efficaci allo scopo di poter decifrare le comunicazioni in DES, conoscendone in segreto i punti deboli. Questi dubbi vennero poi dissipati nel 1990 quando Eli Biham ed Adi Shamir mostrarono come le S-Box del DES fossero molto più resistenti agli attacchi di quanto non potessero esserlo se fossero state scelte a caso.
Nonostante questo, il DES venne violato alla fine degli anni ’90 e la sua debolezza è poi stata parzialmente alleviata introducendo l’algoritmo 3DES (triple DES) che semplicemente cifrava uno stesso blocco con DES 3 volte di seguito, ciascuna volta con una chiave differente.
Lo standard AES
Nel 2001 il NIST, ossia il National Institute of Standards and Technology degli USA, ha introdotto lo standard AES: si tratta di un insieme di cifrari simmetrici a blocchi. AES utilizza tre differenti cifrari: uno con una chiave a 128 bit, uno con chiave a 192 bit ed uno con chiave a 256 bit.
Da allora moti attacchi sono stati tentati contro l’AES, la maggior parte contro il cifrario con chiave a 128 bit, quello più semplice, la maggior parte di essi senza successo o con successi parziali.
Nonostante ciò, ancora oggi, il governo USA ritiene sicuro l’AES.
Per una semplice introduzione all’AES è possibile vedere i molti video di simulazione online, alcuni davvero suggestivi con rappresentazioni 3d delle trasformazioni applicate ai blocchi, come il seguente.
AES Simulator from Laura Devendorf on Vimeo.
Oltre ai cifrari AES, oggi sono diffusi e molto adoperati cifrari a blocchi come Twofish, Serpent, Blowfish, CAST5, RC6 e il cifrario IDEA, oltre ai cifrari simmetrici su flussi come RC4, ORYX, and SEAL.
Conclusioni
In questo articolo ho voluto introdurre le basi della crittografia moderna attraverso argomenti ed esempi, attraversando i principi di Kerckhoffs ed i cifrari a chiave simmetrica, oggi molto adoperati perché garantiscono una buona efficenza rendendo particolarmente sicure le comunicazioni in rete.
Nel prossimo articolo esploreremo il mondo dei cifrari asimmetrici, a partire dalle ricerche di Diffie ed Hellmann ed arrivando all’RSA, su cui oggi basiamo buona parte della nostra sicurezza online. Come sempre, se hai curiosità o commenti, non esitare a scrivermi contattandomi sui canali social o via email, se preferisci.
Grazie e alla prossima!
Related Posts
