Processi crittografici: una panoramica

Per crittografia, o cifratura, si intende un procedimento, secondo il quale un testo in chiaro viene convertito in una sequenza incomprensibile tramite l’utilizzo di una chiave. Nel migliore dei casi il contenuto del testo segreto è accessibile solo se la cifratura viene resa nulla grazie all’utilizzo della chiave in questione. I termini “testo in chiaro” e “testo segreto” hanno radici antiche. Oggigiorno i cifrari, ovvero gli algoritmi utilizzati per determinati processi di cifratura o decifratura, vanno però oltre alla codifica di mere comunicazioni testuali, e vengono utilizzati anche per altre informazioni elettroniche come messaggi vocali, immagini o codici di programmazione.

La crittografia viene utilizzata per proteggere file, drive e directory vari da accessi indesiderati o per garantire una trasmissione dati sicura. Già nell’antichità venivano utilizzati dei cifrari, sebbene ben più semplici di quelli attuali, i quali si limitavano alla codifica delle informazioni da proteggere. In questi casi, dei singoli simboli, parole o intere frasi del testo in chiaro venivano dislocati all’interno del messaggio, tecnica chiamata cifrario a trasposizione, o sostituiti tramite delle combinazioni alternative dei simboli, cifrario a sostituzione.

Per poter decodificare un testo criptato in questo modo, il destinatario doveva solitamente conoscere la regola, con la quale il testo era stato criptato in primo luogo. Le permutazioni riguardanti il cifrario a trasposizione avvenivano solitamente grazie all’utilizzo di una matrice, ovvero al fine di rielaborare un testo segreto a trasposizione nel testo in chiaro, deve dunque essere conosciuta o ricostruita la matrice utilizzata per la trasposizione. Il cifrario a sostituzione si basa invece su un ordine tabellare delle cifre e dei simboli del testo in chiaro sotto forma di un libro codice segreto.

Uno dei primi e più semplici cifrari di questo tipo risale all’epoca di Giulio Cesare. Il cosiddetto cifrario di Cesare si basa su di un cifrario con sostituzione monoalfabetica. Per fare in modo che la sua corrispondenza militare fosse protetta dalle spie nemiche, l’esperto generale spostava le lettere delle sue parole di tre posizioni nell’alfabeto. Il risultato era il seguente:

Il numero degli spostamenti, secondo il quale venivano spostati i simboli, possono essere intesi in questo caso come la chiave della cifratura. Questo non veniva indicato in numeri, bensì con la lettera corrispondente dell’alfabeto. Uno spostamento di tre posizioni, corrispondeva dunque alla chiave “C”.

Mentre il principio dietro al cifrario di Cesare è relativamente facile da intuire, le cifrature moderne si basano oggi su funzioni matematiche complesse, i cosiddetti algoritmi, che combinano più sostituzioni e trasmutazioni e che vengono parametrizzate tramite la chiave sotto forma di password o codici binari. Questi procedimenti rappresentano chiaramente grossi ostacoli per i crittografi. Molti dei sistemi crittografici stabiliti risultano indecifrabili con i mezzi disponibili al giorno d’oggi.

Come funziona la crittografia?

Qualunque procedimento crittografico si basa su due componenti: un algoritmo crittografico e almeno una chiave segreta. Mentre l’algoritmo descrive la metodologia crittografica, come ad esempio lo “spostamento delle lettere lungo l’ordine di successione dell’alfabeto”, la chiave definisce il parametro, ad esempio “C = tre posizioni”. Una crittografia può dunque essere definita come procedura quando un algoritmo crittografico fornisce il testo in chiaro ed una chiave, e come risultato finale si ottiene un testo segreto.

Chiave digitale

Nei processi crittografici moderni le chiavi digitali vengono utilizzate sotto forma di stringhe di bit. Un criterio essenziale per la sicurezza della crittografia è la lunghezza in bit della chiave. Questa determina la misura logaritmica per il numero delle possibili combinazioni di chiavi; a questo proposito si parla anche di spazio delle chiavi. Maggiore è lo spazio delle chiavi, più resistente sarà la cifratura contro gli attacchi di forza bruta; ovvero una metodologia di decifratura che si basa sul tentare tutte le possibili combinazioni.

Con il cifrario di Cesare ad esempio, dove lo spazio di chiavi è di 25 possibilità, gli attacchi di forza bruta hanno vita facile, essendo la lunghezza della chiave minore di 5 bit. Chiunque voglia dunque decodificare tale crittografia dovrà solamente tentare un massimo di 25 combinazioni per venire in possesso del testo in chiaro. Perciò il cifrario di Cesare non rappresenta realmente un ostacolo. I cifrari moderni al contrario utilizzano chiavi che offrono invece molte più combinazioni. L’Advanced Encryption Standard (AES) ad esempio dà la possibilità di scegliere tra chiavi di lunghezza di 128, 192 o 256 bit; lo spazio di chiavi del procedimento scelto sarà quindi proporzionalmente grande.

Già con una crittografia a 128 bit si avranno 2128 possibilità, che corrispondono a più di 340 sestilioni di possibili combinazioni. Se invece si utilizza la crittografia AES a 256 bit, il numero delle possibili chiavi sarà di più di 115 dodiciliardi. Anche disponendo dell’attrezzatura tecnica adatta, ci vorrebbe un’eternità per provare tutte le possibili combinazioni. Con la tecnologia a disposizione gli attacchi di forza bruta risulterebbero impraticabili nello spazio di chiavi AES. Sarebbe infatti necessario un computer cluster di un bilione di computer, dei quali ognuno dovrebbe provare un bilione di chiavi al secondo, e nonostante ciò servirebbero ancora 10 milioni di anni per mettere alla prova tutte le possibili combinazioni e riuscire così a decodificare una cifratura a 128 bit.

Il principio di Kerckhoffs

Dato le lunghezze delle chiavi comunemente utilizzate oggi, gli attacchi di forza bruta non rappresentano una minaccia seria per i moderni processi crittografici. Infatti i crittografi cercano oggigiorno delle vulnerabilità nell’algoritmo, le quali consentirebbero di ridurre i tempi di calcolo per la decodifica di dati cifrati. Un altro approccio è quello di concentrarsi sui cosiddetti canali laterali, che prendono di mira l’implementazione di un sistema crittografico in un dispositivo o in un software. La segretezza di un cifrario diventa dunque controproducente per la sua stessa sicurezza.

Perciò il principio di Kerckhoffs, invece che basare la sicurezza di un sistema crittografico sulla segretezza dell’algoritmo, si basa su quella della chiave utilizzata. Auguste Kerckhoffs, già nel 1883, formulò uno dei principi fondamentali della moderna crittografia: per codificare in maniera affidabile un testo in chiaro, basterà corredare un procedimento conosciuto e ben definito con dei parametri segreti. Questa ipotesi è sostanzialmente rimasta immutata fino ad oggi.

Come tanti altri settori dell’ingegneria del software, anche alla base dello sviluppo dei meccanismi di codifica vi è l’ipotesi che l’open source non vada a discapito della sicurezza. L’utilizzo del principio di Kerckhoffs porta con sé tanti altri benefici, ovvero permette di scoprire più velocemente le falle negli algoritmi crittografici, poiché appositi processi hanno sempre addosso l’occhio critico degli esperti.

Espansione della chiave: dalla password alla chiave

Gli utenti finali che vogliono cifrare o decifrare dei dati, non vengono solitamente a contatto con le chiavi, bensì utilizzano una stringa di più facile gestione: la password. Le password sicure hanno tra gli 8 e i 12 caratteri, formano una combinazione di cifre, numeri e caratteri speciali e hanno, al contrario delle stringhe di bit, un vantaggio decisivo, cioè quello che le password possono essere tenute a mente, senza eccessiva fatica, anche dagli uomini.

In quanto chiavi, le password sono inadatte all’utilizzo nell’ambito della cifratura, a causa della loro lunghezza insufficiente. Molti cifrari contengono perciò una tappa intermedia: la password della lunghezza che si preferisce viene convertita a seconda del sistema crittografico in una stringa di bit corrispondente. Altrimenti esistono anche procedimenti tramite i quali vengono generate chiavi in maniera del tutto casuale a seconda delle possibilità tecniche a disposizione.

Un metodo comunemente utilizzato per ottenere delle chiavi da password, è rappresentato dalla PBKDF2 (Password-Based Key Derivation Function 2). Nell’ambito di questo procedimento le password vengono integrate con una stringa pseudocasuale, il cosiddetto sale, e tramite una funzione crittografica di hash, vengono conseguentemente commutate in stringhe di bit della lunghezza desiderata.

Le funzioni di hash sono una funzione unidirezionale, ovvero calcoli comparabilmente facili da effettuare, ma che presentano non poche difficoltà per essere ripercorsi nel verso opposto. In crittografia un processo viene definito sicuro, quando a diversi documenti vengono assegnati diversi hash. Le password che vengono commutate in chiavi grazie all’utilizzo di funzioni unidirezionali, e sono dunque ricostruibili (se lo sono) solo con un considerevole processo di calcolo. Un paragone calzante potrebbe essere quello della ricerca in una rubrica telefonica: mentre risulta semplice trovare un determinato numero di telefono se si conosce il nome dell’intestatario, può risultare un problema irrisolvibile la ricerca di un nome avendo a disposizione solamente il numero di telefono.

La computazione matematica nel caso dell’utilizzo del PBKDF2 viene effettuata in numerose iterazioni, ovvero ripetizioni, al fine di proteggere la chiave generata in questo modo dagli attacchi di forza bruta. Il sale aumenta l’impegno necessario per la ricostruzione di una password sulla base di tabelle arcobaleno. La tabella arcobaleno è uno schema di attacco, tramite il quale i crittografi riescono ad ottenere una password sconosciuta partendo dai valori hash salvati.

Ulteriori procedimenti password-hashing sono scrypt, bcrypt e LM-Hash. Quest’ultimo tuttavia è da considerarsi obsoleto e poco sicuro.

Il problema della trasmissione della chiave

Un problema centrale della crittografia è la questione su come far sì che delle informazioni possano essere codificate in un luogo e decodificate in un altro luogo differente. Giulio Cesare, già all’epoca, dovette confrontarsi con il problema della trasmissione delle chiavi. Ogni qualvolta il generale desiderasse inviare una comunicazione criptata da Roma al fronte germanico, egli doveva assicurarsi che il destinatario fosse nella condizione di decifrare il messaggio segreto. L’unica soluzione possibile era la seguente, cioè che sia il testo segreto, sia la chiave per decifrarlo fossero comunicate tramite un messaggero. Ma come fare in modo che la trasmissione della chiave potesse avvenire senza il rischio che andasse a finire nelle mani di terzi?

La medesima domanda mette alla prova i crittografi ancora oggi nell’ambito della trasmissione di dati cifrati in Internet. Le proposte per la soluzione di questo problema sono confluite nello sviluppo di diversi sistemi crittografici e protocolli di scambio delle chiavi. Il problema di trasmissione delle chiavi di sistemi crittografici simmetrici può essere inteso come la motivazione principale per lo sviluppo di cifrari asimmetrici.

Classificazione dei procedimenti crittografici

Nella crittografia moderna si distingue generalmente tra cifrari simmetrici e asimmetrici. La classificazione dipende dall’utilizzo che viene fatto delle chiavi.

Nei sistemi crittografici simmetrici, la stessa chiave viene utilizzata sia per la codifica che per la decodifica di dati cifrati. Se due parti in comunicazione vogliono scambiarsi dei dati cifrati, dev’essere trovato un modo per trasmettere la chiave segreta comune senza comprometterne la segretezza. Al contrario, nei sistemi crittografici asimmetrici, ognuna delle due parti produce la propria coppia di chiavi: una chiave pubblica, chiamata Public Key, e una privata, Private Key.

Se invece viene utilizzata una combinazioni di cifrari simmetrici ed asimmetrici, allora si parlerà di un cifrario ibrido.

Cifrari simmetrici

Fino agli anni settanta, la cifratura di informazioni si basava su sistemi crittografici simmetrici, le cui origini risalivano agli antichi procedimenti, come quello utilizzato da Giulio Cesare. Il principio alla base della cifratura simmetrica è che la cifratura e la decifratura avvengono entrambi grazie ad una stessa chiave. Se due parti vogliono comunicare in maniera cifrata, sia il mittente sia il destinatario devono disporre di una copia della chiave comune. Al fine di proteggere informazioni cifrate dagli attacchi di terzi, la chiave simmetrica va tenuta segreta. Si parla perciò di una crittografia a chiave privata.

Mentre i cifrari simmetrici classici lavorano sul livello delle lettere per trasformare il testo in chiaro in testo segreto, la cifratura dei sistemi crittografici assistiti da computer lavora sul livello dei bit. Si differenziano in questo caso due diversi tipi di cifrari: il cifrario a flusso, anche riferito come cifrario a caratteri, e il cifrario a blocchi.

  • Cifrario a flusso o a caratteri: ogni carattere, ovvero bit, del testo in chiaro viene collegato ad un carattere o bit differente, derivante dal flusso di chiavi in uso; viene così convertito in un carattere cifrato.
  • Cifrario a blocchi: i simboli o bit da cifrare vengono raggruppati in blocchi di lunghezza fissa e trasformati perciò in un testo cifrato, ugualmente di lunghezza fissa.

I comuni metodi di cifratura dei sistemi crittografici simmetrici sono operazione di facilità comparabile a quella dei cifrari a sostituzione e a trasposizione, i quali vengono utilizzati in combinazione e in cicli consecutivi (iterazioni), per i moderni procedimenti di cifratura dei testi in chiaro. Nei moderni algoritmi di cifratura simmetrici viene inoltre integrata l’aritmetica modulare assieme ad addizioni, moltiplicazioni e alle operazioni bit a bit XOR.

Tra i cifrari simmetrici più conosciuti vi sono anche il già superato Data Encryption Standard (DES) e il suo successore Advanced Encryption Standard (AES).

Data Encryption Standard (DES)

DES è un cifrario simmetrico sviluppato negli anni settanta dall’IBM e standardizzato nel 1977 tramite il National Institute of Standards and Technology (NIST) americano. In quanto primo cifrario sufficientemente sicuro, secondo i criteri di allora, e assistito da computer, DES ha praticamente dato vita alla crittografia moderna. Questo standard è privo di brevetto, ma al giorno d’oggi, basandosi su una lunghezza di chiavi di 64 bit, di cui solamente 56 effettivi, risulta superato. Già nel 1994, tramite l’utilizzo di dodici HP-9735 e un processo di calcolo di 50 giorni, questo cifrario è stato decriptato. Con i mezzi tecnici disponibili al giorno d’oggi una chiave DES potrebbe essere decifrata già in poche ore tramite degli attacchi di forza bruta.

L’algoritmo simmetrico lavora con cifratura a blocchi sul livello dei bit. Il testo in chiaro viene scomposto in blocchi di 64 bit, ognuno dei quali viene cifrato con una chiave a 64 bit. In questo modo 64 bit di testo in chiaro vengono commutati in 64 bit di testo segreto. Poiché ogni ottavo bit della chiave funge da bit di parità, alla fine dei conti vengono utilizzati solo 56 bit effettivi per la codifica.

L’algoritmo crittografico DES rappresenta una cosiddetta rete di Feistel e si basa su una combinazione di sostituzioni e trasposizioni, che vengono realizzate tramite 16 iterazioni. Questo procedimento, il cui nome deriva da Horst Feistel dell’IBM, è descrivile in quattro passaggi:

1. Permutazione d’entrata: l’intero blocco di testo in chiaro della lunghezza di 64 bit viene sottoposto ad una permutazione d’entrata, che serve a modificare la sequenza dei bit. Il risultato di questa permutazione viene trascritto in due registri di 32 bit ciascuno. Vengono dunque a crearsi due metà blocchi, uno a sinistra, riferito come L, e uno a destra, R.

2. Permutazione delle chiavi: i 56 bit della chiave rilevante per la cifratura vengono anch’essi sottoposti ad una permutazione, e divisi conseguentemente in due grandi blocchi da 28 bit ciascuno, i blocchi C e D. Per ognuna delle 16 iterazioni viene generata una chiave di sessione da entrambi i blocchi di chiavi C e D. Inoltre i bit di entrambi le metà dei blocchi vengono spostati ciclicamente verso sinistra di uno o due bit. Questo dovrebbe assicurare che in ogni ciclo di cifratura venga generato un’altra chiave di sessione. Successivamente entrambe le metà dei blocchi C e D vengono trasformati in una chiave di sessione di 48 bit.

3. Ciclo di cifratura: ogni ciclo di codifica segue i passaggi da a) a d). Le chiavi di sessione si incrociano quindi con i bit nella metà blocco R, mentre per il momento il blocco L rimane fuori dal processo.

  • Espansione: il blocco R viene ampliato a 48 bit a seguito di un’espansione. Inoltre i 32 bit del blocco vengono divisi in gruppi di 4 bit ciascuno durante l’espansione e, secondo lo schema seguente, in parte duplicati e permutati.
  • Miscelazione con la chiave tramite operazione XOR: in ogni ciclo il blocco R, espanso a 48 bit, viene collegato ad una delle 48 sottochiavi tramite un’operazione XOR. Il risultato di questo collegamento è nuovamente un blocco di 48 bit.
  • Sostituzione: in seguito alla fase di miscelazione tramite XOR, il blocco a 48 bit viene suddiviso in otto blocchi da 6 bit ciascuno, questi blocchi vengono a loro volta ripartiti in blocchi di 4 bit ciascuno, in maniera non lineare, grazie alle scatole di sostituzione, dall’inglese substitution box. Il risultato quindi è un blocco di 32 bit, il quale verrà nuovamente sottoposto ad un’ulteriore permutazione.
  • Permutazione: a seguito di ogni ciclo il risultato delle scatole di sostituzione verrà combinato, tramite un’operazione di XOR, con il blocco L, finora rimasto inutilizzato. Il risultato è un blocco di 32 bit, che verrà utilizzato nel secondo ciclo al posto del precedente blocco R, mentre il blocco R del primo ciclo andrà a sostituire il blocco L del secondo ciclo.

4. Permutazione finale: una volta terminati tutti e 16 i cicli, i blocchi L e R vengono raggruppati in un unico blocco da 64 bit il quale verrà poi sottoposto alla permutazione finale, che effettua sostanzialmente il processo inverso di quella iniziale. A questo punto il testo in chiaro è stato cifrato.

La decifratura di un testo segreto cifrato tramite DES avviene seguendo lo stesso schema al contrario.

Un punto critico principale del procedimento DES è la lunghezza limitata delle chiavi, 56 bit, che risulta in uno spazio di chiavi in proporzione piccolo. Per questo motivo il DES non è più in grado di resistere agli attacchi di forza bruta sferrati con i potenti computer disponibili al giorno d’oggi. Inoltre il procedimento di permutazione delle chiavi, che include 16 cicli praticamente identici, viene ritenuto troppo debole.

Con il Triple DES (3DES) è stata sviluppata una variante del DES, il cui processo di criptazione avviene in tre cicli consecutivi. Però la lunghezza di chiave effettiva del 3DES è solamente di 112 bit, il che la rende comunque inferiore agli standard minimi odierni, che si attestano sui 128 bit. In aggiunta 3DES risulta chiaramente più impegnativo, in termini di calcolo, rispetto al DES. Tuttavia il Data Encryption Standard è stato largamente superato dal suo successore che è l’Advanced Encryption Standard, un algoritmo di crittografia simmetrica.

Advanced Encryption Standard (AES)

Negli anni novanta divenne palese che lo standard crittografico più utilizzato fino a quel momento, il DES, non era più all’altezza dello sviluppo tecnico; un nuovo standard era dunque necessario. Per questo motivo si stabilì come successore l’algoritmo Rijndael, il cui nome deriva dai suoi sviluppatori Vincent Rijmen e Joan Daemen. Questo algoritmo è un procedimento, che per via della sicurezza, flessibilità e performance venne utilizzato per un bando pubblico e successivamente, alla fine del 2000, certificato dal NIST come Advanced Encryption Standard (AES).

Anche AES suddivide il testo in chiaro da cifrare in blocchi, dunque entrambi questi due sistemi crittografici sono basati su un cifrario a blocchi. Lo standard AES supporta le chiavi a 128, 192 e a 256 bit. Invece che blocchi da 64 bit, con AES, i blocchi sono chiaramente più grandi, difatti vengono utilizzati i blocchi a 128 bit, i quali vengono cifrati secondo cicli consecutivi, grazie all’aiuto di una rete a sostituzione e permutazione (SPN). Anche il successore del DES utilizza una nuova chiave ad ogni ciclo, che deriva ricorsivamente dalla chiave in uscita, la quale viene collegata al blocco di dati da cifrare con un’operazione di XOR. Lo svolgimento della cifratura può essere grossolanamente riportato nei seguenti quattro passaggi: 

1. Espansione della chiave: come con DES, AES utilizza una nuova chiave di sessione ad ogni combinazione. Questa viene derivata dalla chiave in uscita tramite la ricorsività. In questo modo la chiave in uscita viene espansa in lunghezza, permettendo così di portare il numero delle sottochiavi a 128 bit. Ogni chiave di sessione si basa su di un segmento della chiave in uscita espansa. Il numero delle sottochiavi necessarie ammonta al numero dei cicli di cifratura (R) più una chiave di sessione per il preciclo (numero delle chiavi = R + 1).

2. Preciclo: nel preciclo viene riportato il blocco di partenza a 128 bit in una tabella bidimensionale (array) e viene connesso con la chiave di sessione tramite un’operazione di XOR (KeyAddition). La tabella si compone di 4 righe e 4 colonne, ed ogni cella contiene un byte (unità di misura corrispondente ad 8 bit) del blocco da criptare.

3. Cicli di cifratura: il numero dei cicli dipende dalla lunghezza di chiavi utilizzata: 10 cicli con l’AES128, 12 cicli con l’AES192 e 14 cicli con l’AES256. In ogni ciclo vengono compiute le seguenti operazioni:

  • SubBytes: i SubBytes si trovano nella fase in cui avviene una sostituzione monoalfabetica. Ogni byte del blocco da criptare viene sostituito con un equivalente tramite le scatole di sostituzione.
  • ShiftRows: la ShiftRow è invece una fase di trasformazione nella quale i byte vengono spostati ciclicamente verso sinistra nelle celle dell’array (vedi preciclo).
  • MixColumns: anche questa è una fase di trasformazione; i dati all’interno delle colonne dell’Array vengono mescolati. Questo passaggio si basa su un nuovo conteggio di ogni singola cella. Inoltre le colonne dell’array vengono moltiplicati per la matrice e il risultato collegato tramite XOR.
  • KeyAddition: Alla fine di ogni ciclo avviene un’ulteriore KeyAddition (espansione). Questo, come nel preciclo, si basa su un collegamento XOR del blocco dati con la chiave di sessione.

4. Ciclo finale: si tratta dell’ultimo ciclo crittografico. Diversamente dai cicli precedenti, l’ultimo ciclo salta la fase di mescolamento delle colonne (MixColumns). Al termine di questo ciclo si ottiene il testo segreto.

La decodifica dei dati cifrati secondo lo standard AES avviene tramite l’utilizzo dello stesso algoritmo di cifratura e fa riferimento sia ai vari passaggi sopra indicati sia alle operazioni ShiftRow, MixColumns e SubBytes, la cui direzione viene però invertita.

AES, grazie al suo algoritmo, garantisce un’elevata sicurezza. Tutt’ora non è conosciuto alcun attacco capace di decifrare i dati cifrati con questo procedimento. Gli attacchi di forza bruta risultano del tutto inefficaci a partire da una lunghezza delle chiavi di 128 bit. Dunque le operazioni ShiftRows e MixColumns offrono un mix di bit ottimale: alla fine dei conti ogni bit è dipendente dalla chiave. Questo sistema crittografico risulta quindi convincente per la sua facile implementazione e per l’alta velocità di criptazione. L’AES viene utilizzato nei cifrari delle WPA2, SSH e IPSec, oltre ad altri. In aggiunta a questi, l’algoritmo viene usato per la crittografia di archivi di file quali 7-Zip e RAR.

Tuttavia la sicurezza dei dati cifrati con lo standard AES è mantenuta fin quando la chiave rimane segreta. Venendo utilizzata la medesima chiave sia in fase di codifica sia in fase di decodifica, il sistema crittografico AES, così come qualunque altro cifrario simmetrico, è soggetto al problema di trasmissione della chiave. L’utilizzo sicuro dell’AES si limita dunque ai campi di utilizzo che non richiedono alcuna trasmissione di chiave o che permettono la trasmissione di quest’ultima tramite un canale sicuro.

Ad ogni modo le comunicazioni cifrate in Internet richiedono che i dati siano criptati su di un computer e decriptati su un computer differente. È per questo che vengono solitamente utilizzati sistemi crittografici asimmetrici, i quali permettono lo scambio in totale sicurezza delle chiavi simmetriche o che funzionano anche senza dover trasmettere alcuna chiave comune.

Come alternativa ad AES vi sono altri cifrari simmetrici a blocchi, come MARS, RC6, Serpent e Twofish; tutti questi erano i finalisti del bando per diventare il nuovo AES, al fianco dell’algoritmo Rijndael. Anche Blowfish, il predecessore di Twofish, è tuttora in uso. Merita considerazione anche il cifrario a flusso Salsa20, sviluppato nel 2005 da Daniel J. Bernstein, e finalista del progetto europeo eSTREAM.

Cifrari asimmetrici

Mentre nei cifrari simmetrici viene utilizzata la stessa chiave da entrambe le parti della comunicazione cifrata, nel caso di una comunicazione cifrata asimmetricamente, tutte e due le parti generano una coppia di chiavi a testa. Così facendo ogni partecipante alla comunicazione dispone di due chiavi: una pubblica e una privata. Per poter comunicare, i due interlocutori dovranno rendere nota la propria chiave pubblica, cosa che solitamente avviene tramite un Key Server; in questi casi si parlerà di processo a chiave pubblica. Al contrario, la chiave privata deve rimanere segreta. Questo è proprio il punto di forza della crittografia asimmetrica rispetto a quella simmetrica, ovvero che in nessun caso e in nessuna fase del processo deve essere trasmessa la propria chiave privata.

All’interno del processo crittografico asimmetrico la chiave pubblica serve per la cifratura, e anche per permettere di controllare l’autenticità delle firme digitali e quindi per verificare gli utenti. Le chiavi private, invece, vengono utilizzate per la decifrazione e rendono possibile la creazione di firme digitali o di autentificarsi agli altri utenti.

Un esempio:

L’utente A desidera inviare un messaggio cifrato all’utente B, per fare ciò l’utente A necessita della chiave pubblica di B. La chiave pubblica di B permette ad A di cifrare un messaggio, il quale potrà poi essere decifrato solo con la chiave privata di B. All’infuori di B nessuno è in grado di leggere il messaggio. Lo stesso A, dopo la cifratura, non avrà più la possibilità di decifrare il messaggio.

Il vantaggio della cifratura asimmetrica sta dunque nel fatto che, dal punto di vista teorico tutti possono utilizzare la chiave pubblica dell’utente B per decifrare le proprie comunicazioni, le quali però saranno poi decifrabili solo ed unicamente dall’utente B con la sua chiave privata. Poiché viene dunque scambiata solo ed unicamente la chiave pubblica, si può fare a meno di limitare le proprie comunicazioni ai soli canali a prova di intercettazioni e protetti da eventuali tentativi di manipolazione.

Uno svantaggio di questo processo crittografico è tuttavia che B non può avere la certezza matematica che la comunicazione ricevuta provenga realmente da A. Perciò, ipoteticamente potrebbe essere una terza persona, C, ad utilizzare la chiave pubblica di B per cifrare dei messaggi e magari avere come scopo quello di diffondere un malware. Inoltre, anche A non ha la certezza che la chiave pubblica di cui dispone sia effettivamente quella di B; anche C potrebbe creare una chiave pubblica e spacciarla come quella di B, così da riuscire ad intercettare le comunicazioni che A invia, o crede di inviare, a B. Quindi è necessario un meccanismo per la crittografia asimmetrica, che renda possibile verificare la autenticità del proprio interlocutore.

Questo problema è risolvibile con i certificati e le firme digitali.

  • Certificati digitali: per poter gestire in maniera sicura i processi crittografici, gli interlocutori hanno la possibilità di confermare la genuinità della propria chiave pubblica tramite il Certificate Authority (CA), ovvero un ente pubblico o privato che dispone dell’abilitazione a rilasciare certificati digitali. Uno standard comune per i certificati digitali è quello X.509. L’applicazione di tali certificati avviene ad esempio con la trasmissione dati TLS/SSL tramite HTTPS o nella cifratura di e-mail con S/MIME.
  • Firme digitali: mentre i certificati digitali vengono utilizzati per verificare le chiavi pubbliche, le firme digitali servono ad inviare comunicazioni criptate ad un destinatario così che egli possa identificare il mittente senza problemi. Per fare ciò, ovvero creare una firma digitale, va utilizzata la propria chiave privata. Successivamente, il ricevente sarà in grado di verificare la firma grazie alla chiave pubblica del mittente. L’autenticità delle firme digitali è comprovabile tramite la struttura gerarchica chiamata infrastruttura a chiave pubblica, o in inglese Public Key Infrastructure (PKI). Un’alternativa alla struttura gerarchica del PKI è il cosiddetto Web of Trust (WOT), una rete dove gli utenti si possono verificare a vicenda sia in maniera diretta che indiretta.

La prima pubblicazione scientifica di un processo crittografico asimmetrico è avvenuta nel 1977 da parte dei matematici Rivest, Shamir e Adleman, dai quali prende appunto il nome l’algoritmo RSA. Tale algoritmo si basa su cosiddette funzioni unidirezionali a trabocchetto ed è utilizzabile per la codifica sia dei dati sia della firma.

Rivest, Shamir, Adleman (RSA)

L’algoritmo RSA vale come uno dei processi a chiave pubblica più sicuri e meglio definiti. L’idea di realizzare una codifica tramite una chiave di cifratura pubblica e una chiave di decifratura segreta è da attribuirsi ai crittografi Whitfield Diffie e Martin Hellman. Questo processo, pubblicato nel 1976 con il nome di scambio di chiavi Diffie-Hellman, permette a due interlocutori di accordarsi su una chiave segreta tramite un canale non sicuro. Per poterlo realizzare, hanno usato l’algoritmo del puzzle come base di partenza, sviluppato da Ralph Merkle. Infatti questo processo può anche essere identificato come lo scambio di chiavi Diffie-Hellman-Merkle (DHM).

Per questo algoritmo i crittografi utilizzarono funzioni unidirezionali matematiche, che sebbene siano semplici da utilizzare, sono invertibili solo con un considerevole sforzo di calcolo computistico. Questo processo per lo scambio delle chiavi è tutt’ora in utilizzo per l’intercambio di chiavi nell’ambito dei sistemi crittografici simmetrici. Un ulteriore merito del duo di ricercatori è rappresentato dal concetto di trabocchetto. Già dalla pubblicazione dello scambio di chiavi Diffie-Hellman erano state incluse delle scorciatoie nascoste, con lo scopo di rendere possibile l’inversione delle funzioni unidirezionali in minor tempo. Al tempo Diffie e Hellman non diedero indicazioni concrete, ma con la teoria del trabocchetto hanno spinto molti altri crittografi ad indagare sulle sue possibilità.

Gli stessi Rivest, Shamir e Adleman si misero alla ricerca di scorciatoie per le funzioni unidirezionali, originariamente spinti dalla motivazione di confutare la teoria del trabocchetto. Ma com’è chiaro, la loro ricerca si sviluppò in un’altra direzione e sfociò in quello che poi diventò il processo crittografico che prende appunto il loro nome. Ad oggi RSA è considerato il primo algoritmo scientificamente pubblicato che consente la trasmissione di dati cifrati senza che avvenga lo scambio di una chiave segreta.

Con RSA viene impiegato un algoritmo che si basa sulla moltiplicazione di numeri primi di grandi dimensioni. Mentre in generale la moltiplicazione di due numeri primi con 100, 200 o 300 cifre non presenta grandi problemi, non esiste ancora alcun algoritmo funzionale, capace di ripercorrere un’operazione di questo tipo al contrario, ovvero di individuare i numeri primi che moltiplicati diano il risultato di partenza. La fattorizzazione dei numeri primi è spiegabile con un esempio:

Se si moltiplicano i numeri primi 14.629 e 30.491, si otterrà il prodotto 446.052.839. Questo numero ottenuto ha solamente quattro possibili divisori: 1; se stesso, ovvero 446.052.839; e i due numeri primi che moltiplicati lo danno come risultato. Escludendo i primi due, poiché qualunque numero è divisibile per uno e per se stesso, si ottengono dunque unicamente i valori 14.629 e 30.491.

Questo schema è alla base della produzione delle chiavi per l’algoritmo RSA. Sia la chiave pubblica sia la chiave privata sono una coppia di numeri:

Chiave pubblica: (e, N)

Chiave privata: (d, N)

N corrisponde al cosiddetto modulo RSA, che è contenuto in entrambe le chiavi e deriva dal prodotto di due numeri primi scelti e molto grandi: p e q (N = p x q).

Al fine di generare la chiave pubblica, è inoltre necessaria e, un numero scelto casualmente con delle date limitazioni. Se si combinano N ed e si otterrà la chiave pubblica, la quale sarà presente nel testo in chiaro di entrambi gli interlocutori.

Per generare invece la chiave privata, oltre ad N si necessita d. d corrisponde ad un valore derivante dai numeri primi, casualmente generati, p e q, così come dal numero casuale e, i quali vengono calcolati gli uni con gli altri sulla base della funzione phi di Eulero (φ).

Per poter garantire la sicurezza della codifica RSA è necessario che i numeri primi che vengono utilizzati nel calcolo della chiave privata, rimangano segreti. Il prodotto di entrambi i numeri primi, al contrario, può essere utilizzato nella chiave pubblica all’interno del testo in chiaro, questo poiché si dà per certo che oggigiorno non esista alcun algoritmo capace di scomporre, in tempo rilevante, il prodotto di numeri primi nei vari fattori; risulta quindi impossibile rintracciare p e q partendo da N. Alla luce di ciò è possibile abbreviare il calcolo: il trabocchetto rappresenta il valore d, il quale è noto solamente al proprietario della chiave privata.

La sicurezza dell’algoritmo RSA è in gran parte dipendente dall’avanzamento tecnico. La capacità di calcolo dei computer raddoppia all’incirca ogni due anni. Non è quindi da escludere che nel prossimo futuro sarà disponibile un efficiente processo per la scomposizione dei fattori primi nell’ordine di grandezza comunemente utilizzato attualmente. In questo caso RSA offre la possibilità di adattare l’algoritmo allo sviluppo tecnico, utilizzando per il calcolo numeri primi di grandezza ancora maggiore.

Crittografia a chiave privata basata su ID

La vulnerabilità principale dei sistemi crittografici asimmetrici è l’autentificazione utente. Nei processi crittografici classici a chiave privata la chiave pubblica non è in nessun modo legata all’identità del suo utilizzatore. Dovesse una terza persona riuscire a spacciarsi come uno dei partecipanti di una trasmissione dati criptata grazie alla propria chiave pubblica, l’intero sistema crittografico verrebbe scardinato, senza neanche che l’algoritmo o una delle chiavi private di decifrazione vengano attaccati direttamente. Già nel 1984 Adi Shamir, co-sviluppatore dell’algoritmo RSA, propose perciò un cifrario asimmetrico basato su ID, in modo da tentare di compensare questa sua vulnerabilità.

Riguardo alla crittografia basata sull’identità, che in inglese sta per identity-based encryption (IBE), la produzione della chiave pubblica degli interlocutori non dipende dalla chiave privata, bensì deriva da un ID univoco. In base al contesto di utilizzo è possibile utilizzare a questo scopo un indirizzo e-mail o un dominio. In questo modo viene meno l’autentificazione delle chiavi pubbliche tramite il Certificate Authority, il cui posto viene preso dal Private Key Generator (PKG), il cosiddetto generatore di chiavi private. Si tratta di un algoritmo centrale, che mette il destinatario di un messaggio criptato nella condizione di esporre la chiave per la decifrazione legata alla propria identità.

La teoria del cifrario basato su ID risolve in questo modo un problema fondamentale dei sistemi crittografici asimmetrici, ma porta con sé due ulteriori falle di sicurezza. Il primo punto critico sorge dal quesito riguardante la trasmissione della chiave privata per la decifrazione dal generatore di chiavi private al destinatario della comunicazione crittografata, ovvero su come debba avvenire tale trasmissione. Si ripresenta così ancora una volta il problema relativo alla trasmissione delle chiavi.

L’altro ulteriore svantaggio del processo basato su ID è rappresentato dal fatto che il destinatario della comunicazione cifrata non sia l’unico ad essere a conoscenza della chiave di decriptazione; il che rende la chiave privata utilizzabile abusivamente e perciò tutt’altro che privata. Teoricamente il generatore di chiavi private è in grado di decifrare senza autorizzazione tutte le comunicazioni. Questo problema può agevolmente essere aggirato generando la coppia di chiavi direttamente sul proprio computer, tramite l’utilizzo di un software open source.

Il processo basato su ID più conosciuto è quello sviluppato da Dan Boneh e Matthew K. Franklin.

Cifrario ibrido

Per crittografia ibrida si intende la combinazioni di cifrari simmetrici e asimmetrici nell’ambito della trasmissione dati su Internet. L’obiettivo di questa combinazione è quello di compensare le vulnerabilità presenti in un sistema con i punti di forza dell’altro sistema.

I cifrari simmetrici come AES risultano sicuri secondo gli standard tecnici odierni e permettono anche l’elaborazione di grandi quantitativi di dati in maniera rapida ed efficiente. Il design dell’algoritmo su base di una chiave privata comune, la quale deve essere scambiata in assoluta sicurezza tra il mittente e il destinatario di una comunicazione cifrata, pone tuttavia gli utilizzatori dei processi simmetrici dinanzi al problema della trasmissione delle chiavi, il quale può però essere risolto attraverso i sistemi asimmetrici. I processi come RSA si basano su una separazione netta delle chiavi pubbliche e private, permettendo così di aggirare alla base il problema della trasmissione.

Una protezione affidabile contro le crittoanalisi viene offerta dall’algoritmo RSA, ma solamente nel caso in cui la lunghezza delle chiavi sia di almeno 1.976bit. Questo risulta in lunghi processi di calcolo, che disqualificano l’algoritmo per la codifica e decodifica di grandi quantità di dati. Inoltre le dimensioni del testo segreto da trasmettere, codificato tramite l’algoritmo RSA, sono decisamente maggiori rispetto al testo in chiaro originale.

Per ciò che riguarda i processi di codifica ibridi, gli algoritmi asimmetrici non vengono utilizzati per la codifica di dati utenti, bensì per la trasmissione di una chiave di sessione simmetrica, al fine di assicurarne la trasmissione protetta tramite un canale pubblico. Così facendo ci si assicura la possibilità di decifrare un testo segreto efficientemente codificato tramite algoritmi simmetrici.

Il procedimento di una codifica ibrida è suddivisibile nei tre seguenti passaggi:

1. Amministrazione della chiave: nei processi ibridi la codifica simmetrica di una comunicazione viene inclusa all’interno di un processo asimmetrico. In tali processi è necessario generare sia chiavi simmetriche che asimmetriche:

  • Prima di giungere al passaggio della trasmissione dei dati, entrambi gli interlocutori producono innanzitutto una coppia di chiavi asimmetriche: una chiave pubblica ed una privata. Successivamente avviene lo scambio delle chiavi pubbliche, nel migliore dei casi reso sicuro grazie ad un meccanismo di autentificazione. La coppia di chiavi asimmetriche serve per la codifica e la decodifica di una chiave di sessione simmetrica e viene normalmente utilizzata più volte.
  • La codifica e decodifica di un testo in chiaro avviene sulla base di una chiave di sessione simmetrica. Questa viene generata nuovamente dal mittente ad ogni processo di codifica.

2. Codifica: nel caso in cui una comunicazione debba essere trasmessa tramite Internet in maniera sicura, il mittente emette innanzitutto una chiave di sessione simmetrica, con la quale saranno poi cifrati i dati in questione. Una volta terminato questo passaggio, entra in gioco la chiave pubblica del destinatario. Questa serve alla codifica asimmetrica della chiave di sessione. Sia i dati utente sia la chiave simmetrica saranno a questo punto cifrati e potranno essere inviati senza preoccupazioni.

3. Decodifica: una volta arrivato al destinatario il testo segreto e la chiave di sessione cifrata, il destinatario userà la propria chiave privata per decifrare asimmetricamente la chiave di sessione. Questa verrà in seguito utilizzata per decifrare i dati utenti simmetricamente codificati.

Seguendo questo schema è possibile realizzare un efficace processo di crittografia, con il quale è possibile codificare e decodificare autonomamente grandi quantità di dati utente in modo rapido e sicuro. Dato che solamente una chiave di sessione viene cifrata asimmetricamente, la complessità di calcolo e la derivante lentezza di codifica degli algoritmi asimmetrici non è un fattore rilevante nella cifratura ibrida. Il problema della trasmissione della chiave dei cifrari simmetrici viene invece ridotto, grazie alla cifratura asimmetrica della chiave di sessione, al problema relativo all’autentificazione dell’utente, che a sua volta è risolvibile attraverso l’utilizzo di cifrari asimmetrici puri, utilizzando firme e certificati digitali.

I processi ibridi vengono utilizzati sotto forma di IPSec, con il quale è possibile trasmettere comunicazioni in totale sicurezza anche tramite reti IP non sicure. Anche l’Hypertext Transfer Protocol Secure (HTTPS) punta con il TLS/SSL su un protocollo crittografico ibrido, il quale combina cifrari simmetrici ed asimmetrici. Inoltre una conversione del processo ibrido serve anche da base per altri standard crittografici come Pretty Good Privacy (PGP), GnuPG e S/MIME, i quali vengono utilizzati nel campo della codifica delle e-mail.

Una combinazione comune ritrovabile tra i processi ibridi è la crittografia simmetrica dei dati utente tramite AES e la conseguente codifica asimmetrica della chiave di sessione tramite RSA. Alternativamente la chiave di sessione può essere usata anche in relazione al processo Diffie-Hellman. In tal caso ci si riferisce al processo Diffie-Hellman in versione effimera e serve a fornire la Forward Secrecy, che può essere però soggetta agli attacchi Man in the Middle. Un sostituto dell’algoritmo RSA è rappresentato dal sistema di cifratura Elgamal: un processo a chiave pubblica sviluppato nel 1985 da Taher Elgamal, che si basa ugualmente sull’idea dello scambio di chiavi Diffie-Hellman e che viene utilizzato nella versione attuale del programma di cifratura PGP.

Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.