Crittografia
di Giancarlo Bongiovanni
SOMMARIO: 1. Introduzione e definizioni. ▭ 2. Cenni storici. ▭ 3. Crittografia a chiave segreta: a) l'algoritmo DES; b) l'algoritmo IDEA; c) l'algoritmo AES. ▭ 4. Crittografia a chiave pubblica: a) l'algoritmo RSA; b) funzioni digest e firme digitali. ▭ 5. Protocolli crittografici: a) chiave segreta di sessione; b) certificati digitali; c) il protocollo SSL; d) il protocollo SET. ▭ 6. Problemi aperti e conclusioni. ▭ Bibliografia.
1. Introduzione e definizioni.
La crittografia (o scrittura nascosta, dal greco κρυπτο*ς, nascosto, e γραϕι*α, scrittura) è la disciplina che si occupa di studiare le tecniche per trasformare un messaggio, detto 'testo in chiaro', in un altro messaggio, detto 'testo cifrato', che risulta incomprensibile a chiunque non conosca tutti i dettagli della tecnica usata per la trasformazione. Solo il legittimo destinatario del messaggio è in grado di effettuare con successo l'operazione inversa e di ottenere così dal testo cifrato il testo in chiaro originale.
La trasformazione del testo in chiaro in testo cifrato è detta 'cifratura', mentre la ricostruzione del testo in chiaro a partire dal testo cifrato è detta 'decifratura'.
L'insieme delle operazioni che devono essere effettuate durante la cifratura e la corrispondente decifratura prende il nome di 'codice crittografico', o 'cifrario', o anche semplicemente 'codice'.
Una disciplina strettamente collegata alla crittografia è la 'criptoanalisi', il cui scopo è scoprire modi per decifrare i messaggi pur non conoscendo il metodo utilizzato per la cifratura, ossia per 'attaccare' e, possibilmente, 'rompere' il codice. La sua funzione è importantissima, perché gli studi compiuti dai criptoanalisti possono portare alla luce debolezze che sono sfuggite agli stessi progettisti di un cifrario. Le situazioni in cui si può trovare il criptoanalista variano a seconda delle informazioni di cui dispone: la più difficile è quella in cui egli ha a disposizione il solo testo cifrato, senza magari nemmeno sapere quale tipo di codice sia stato utilizzato (anche se, in generale, si assume che almeno quest'ultima informazione sia in possesso del criptoanalista).
2. Cenni storici.
La crittografia è una disciplina antica (v. Kahn, 19962), nata inizialmente per garantire la segretezza delle comunicazioni in campo militare. Il primo esempio di codice crittografico noto è il 'codice di Cesare', utilizzato da Giulio Cesare per le comunicazioni con i suoi generali. Esso si basa sulla sostituzione di ogni lettera del testo in chiaro con quella che si trova, nell'ordinamento alfabetico, tre posizioni dopo (la A viene sostituita dalla D, la B con la E, e così via). L'alfabeto si considera chiuso circolarmente, cioè la lettera Z viene sostituita con la lettera C. Si noti che utilizzando questo codice uno stesso testo in chiaro produce, tutte le volte che viene cifrato, lo stesso testo cifrato.
Una variante del codice di Cesare è il 'codice di Cesare generalizzato', in cui ogni lettera del testo in chiaro viene sostituita con quella che si trova, nell'ordinamento alfabetico, k posizioni dopo, considerando anche in questo caso l'alfabeto chiuso circolarmente. Il valore di k può essere variato di volta in volta, a ogni operazione di cifratura, e prende il nome di 'chiave di cifratura'. Ovviamente, la stessa chiave deve essere utilizzata nella cifratura e nella corrispondente decifratura di un messaggio. La differenza rispetto al primo codice è che in questo caso uno stesso testo in chiaro, cifrato due volte ma con due chiavi di cifratura diverse, produce due diversi testi cifrati; tuttavia, il lavoro per il criptoanalista è molto semplice: per ottenere il testo in chiaro, egli dovrà provare semplicemente a usare tutti i possibili valori della chiave, che sono in numero limitato come le lettere dell'alfabeto (nel caso dell'alfabeto italiano - quello che per semplicità verrà considerato d'ora in avanti -, ad esempio, i valori sono 21). Questo tipo di attacco è detto 'attacco di forza bruta' e, in linea di principio, può essere utilizzato con qualsiasi codice.
Un ulteriore miglioramento è costituito dal cosiddetto 'cifrario monoalfabetico': anch'esso sostituisce ogni lettera del testo in chiaro con un'altra, ma in modo meno regolare. Infatti qualsiasi lettera può essere sostituita da qualunque altra, purché in una operazione di cifratura ciascuna lettera, ogni volta che appare, sia sempre sostituita dalla stessa lettera. La chiave di cifratura, in questo caso, è molto più articolata che nel caso precedente, perché è costituita dalla sequenza che definisce la sostituzione da applicare per ciascuna lettera del testo in chiaro. Ad esempio:
Lettera del testo in chiaro: abcdefghilmnopqrstuvz
Lettera del testo cifrato: mnbvczasdfghlpoiurteq
In questo caso un attacco di forza bruta è molto più oneroso, perché ci sono 21! (circa 5 × 1019) possibili valori della chiave da applicare. Contro un codice di questo tipo è possibile però un altro tipo di attacco: se il criptoanalista conosce il linguaggio in cui è scritto il messaggio originale può sfruttare le regolarità di tale linguaggio. Ad esempio, se sa che si tratta di un testo scritto in italiano, può misurare le frequenze di occorrenza delle varie lettere nel testo cifrato e, confrontandole con quelle note per la lingua italiana, dedurre quali siano le corrispondenti lettere del testo in chiaro.
Circa quattro secoli or sono fu introdotto un nuovo metodo, quello del 'cifrario polialfabetico' (noto anche come 'cifrario di Vigenère'), basato sull'uso di più cifrari monoalfabetici in una singola operazione di cifratura e nella corrispondente decifratura. L'innovazione principale è data dal fatto che una stessa lettera, la quale appare in differenti posizioni del testo in chiaro, può essere sostituita di volta in volta da lettere diverse.
Un esempio di semplice cifrario polialfabetico è il seguente. Si scelgono tre diversi cifrari di Cesare generalizzati C1, C2 e C3, il primo con k = 10, il secondo con k = 4, il terzo con k = 18 (per inciso, si noti che anche tali cifrari sono monoalfabetici), e poi si definisce una sequenza di applicazione dei cifrari, ad esempio C3 C1 C2 C2 C1. Le lettere del testo in chiaro si trasformano a gruppi di 5, applicando alla prima lettera di ogni gruppo il terzo dei tre cifrari scelti (C3), alla seconda lettera il primo cifrario (C1), alla terza e alla quarta lettera il secondo cifrario (C2), alla quinta lettera il primo cifrario (C1).
Rompere un cifrario polialfabetico è sicuramente molto più difficile, perché le regolarità del linguaggio sottostante vengono offuscate dal fatto che una stessa lettera viene cifrata di volta in volta con lettere diverse. Se però il criptoanalista riesce a dedurre la lunghezza della sequenza di applicazione dei cifrari, ossia il 'periodo' del codice (5 nel nostro esempio), può sfruttare le regolarità del linguaggio esaminando le lettere che distano 5 posizioni fra loro, dato che esse sono state cifrate tutte con lo stesso codice monoalfabetico.
Si noti che in tutti i codici esaminati finora si applica al testo in chiaro una sola fase di trasformazione per produrre il corrispondente testo cifrato. Una scoperta che ha permesso lo sviluppo della moderna crittografia è stata l'applicazione di diverse fasi di cifratura (anziché una sola) a uno stesso testo in chiaro per ottenere il testo cifrato; ciò rende enormemente più difficile il tentativo di ricostruire il testo in chiaro senza conoscere la chiave di cifratura e decifratura.
Un esempio di applicazione di questa idea è dato dalle macchine a rotori, largamente utilizzate durante la seconda guerra mondiale per cifrare le comunicazioni militari (v. Kohnheim, 1981). Un rotore è un disco con 21 ingressi e 21 uscite, dotato di un cablaggio interno che collega ogni ingresso con una uscita secondo una permutazione fissata. Di fatto, un singolo rotore, se rimane immobile, realizza un cifrario monoalfabetico. Una ipotetica macchina a rotori composta di un solo rotore funziona nel modo seguente. A ogni pressione di un tasto da parte dell'operatore, la lettera corrispondente al tasto premuto, che è elettricamente collegato a uno dei 21 ingressi del rotore, viene codificata con la lettera corrispondente all'uscita cui quell'ingresso è collegato. Contestualmente il cilindro ruota di una posizione, definendo quindi un nuovo cifrario monoalfabetico, che sarà usato per cifrare la lettera successiva, e così via. Dunque, una macchina con un singolo rotore realizza un cifrario polialfabetico con periodo 21, che di per sé non rappresenta, come abbiamo visto, un ostacolo insormontabile. Ma la vera potenza di queste macchine risiede nel fatto che vengono usati vari rotori, ciascuno cablato con una differente permutazione fra ingressi e uscite. Le uscite di ogni rotore sono collegate agli ingressi del rotore successivo (v. fig. 1). Inoltre, per ogni giro completo del primo rotore il secondo rotore avanza di uno scatto, per ogni giro completo del secondo rotore il terzo rotore avanza di uno scatto, e così via. Una macchina siffatta e munita di tre cilindri definisce un codice polialfabetico con periodo 21 × 21 × 21 = 9.261; con quattro rotori il periodo sale a 194.481, e con cinque rotori a 4.084.101. Periodi di tale lunghezza rendono impossibile al criptoanalista applicare lo studio delle regolarità del linguaggio, a meno che egli non disponga di messaggi di dimensioni veramente enormi. L'importanza storica di queste macchine risiede nel fatto che esse, usando tecnologie elettromeccaniche, riuscivano a sfruttare gli stessi principî degli attuali cifrari basati sull'uso di elaboratori elettronici.
L'odierna, massiccia diffusione dei personal computers e, soprattutto, della rete globale Internet ha allargato enormemente il campo di applicazione della crittografia contemporanea (v. Schneier, 19962; v. Stinson, 20022), che oggi riveste interesse non solamente per organizzazioni militari o, comunque, governative, ma anche per i singoli individui che vogliano, ad esempio, avvalersi della possibilità di effettuare transazioni commerciali via rete.
I problemi che devono essere risolti in relazione alla sicurezza delle moderne comunicazioni sono molteplici, e possono essere ricondotti ai seguenti aspetti: 1) segretezza: si desidera inviare delle informazioni riservate, in modo che solo il destinatario sia in grado di leggerle; 2) autenticazione del mittente: si vuole essere sicuri che colui col quale si dialoga sia veramente chi dice di essere; 3) integrità del messaggio: si vuole esseri sicuri che il messaggio che arriva non sia stato manomesso durante il viaggio.
Nel campo dell'informatica e delle reti - dove, da un lato, è possibile creare copie (e anche modificarle) di documenti e, dall'altro, non si può escludere che un intruso (che d'ora in poi chiameremo T) intercetti le informazioni in transito sulla rete e cerchi di sfruttarle a proprio vantaggio - soddisfare queste esigenze risulta più difficile che nella vita quotidiana, nella quale esistono a tal fine meccanismi consolidati (buste sigillate, documenti di identità, autenticazione dei documenti). E ciò è soprattutto vero in una rete globale come Internet, in cui esiste la necessità di dialogare con entità precedentemente sconosciute e dove ci sono potenzialmente in ogni momento molti T in ascolto, pronti a rubare informazioni e a sfruttarle a proprio vantaggio agendo sia passivamente (solo ascoltando) sia attivamente (ascoltando e alterando i messaggi che riescono a intercettare, o addirittura creando e inviando propri messaggi).
3. Crittografia a chiave segreta.
In questo tipo di crittografia, il mittente e il destinatario (che chiameremo rispettivamente A e B) si accordano, ad esempio incontrandosi di persona e lontano da occhi indiscreti, su una chiave k che verrà usata sia in fase di cifratura che di decifratura. Il metodo di cifratura è una funzione, E, che accetta in ingresso il testo in chiaro P e la chiave k, producendo il testo cifrato C:
C = Ek (P).
Il metodo di decifratura è un'altra funzione D (ovviamente collegata alla prima), che accetta in ingresso il testo cifrato C, la stessa chiave k utilizzata per la cifratura e restituisce il testo in chiaro originale P:
P = Dk (C).
Ovviamente, si ha che:
Dk[Ek(P)] = P.
Tutti i moderni cifrari a chiave segreta condividono alcune caratteristiche di fondo (v. Simmons, 1992). Essi operano su un blocco di bit alla volta ('cifratura a blocchi') e sono costituiti da un certo numero di stadi, ciascuno dei quali riceve in ingresso i valori prodotti in uscita dallo stadio precedente e in uscita fornisce i valori allo stadio successivo. In molti di tali stadi la trasformazione operata sui bit è basata sull'uso di raffinati meccanismi di calcolo, detti 'reti di sostituzione e permutazione' (substitution-permutation networks) che, ricevendo in ingresso i bit da elaborare e la chiave di cifratura (o un sottoinsieme dei suoi bit) producono i bit in uscita. È soprattutto la struttura delle reti di sostituzione e permutazione (spesso chiamate S-box) che costituisce il cuore del progetto di un codice e ne caratterizza la robustezza rispetto a due moderni tipi di criptoanalisi: la criptoanalisi lineare (v. Biham e Shamir, 1993) e la criptoanalisi differenziale (v. Matsui, 1994), che cercano di ricostruire la struttura del codice indagando matematicamente le regolarità e correlazioni che si dovessero riscontrare nel testo cifrato.
a) L'algoritmo DES.
L'algoritmo più diffuso in questa categoria è il DES (Data Encryption Standard), inventato dall'IBM e adottato nel 1977 dal governo degli Stati Uniti per la protezione di informazioni non classificate. Il testo in chiaro è codificato in blocchi di 64 bit, che producono ciascuno 64 bit di testo cifrato. L'algoritmo prevede l'uso di chiavi di 56 bit e consiste di ben 19 stadi, in ciascuno dei quali si opera una trasformazione dell'output dello stadio precedente. Tale trasformazione in 16 dei 19 stadi è funzionalmente identica: è basata sull'uso di S-box accuratamente progettati ed è parametrizzata da un diverso sottoinsieme di 48 dei bit della chiave.
Il DES è stato al centro di controversie sin dal giorno in cui è nato. Il progetto originario dell'IBM prevedeva chiavi da 128 bit invece che da 56 bit, ma il governo degli Stati Uniti richiese tale riduzione, motivata, secondo molti studiosi del settore, dall'esigenza di preservare la possibilità di rompere (con opportune, potenti macchine) il codice. Inoltre, dato che i criteri di progetto degli S-box non furono mai divulgati, molti ricercatori sospettarono che essi contenessero delle regolarità nascoste per consentire la decifratura dei messaggi da parte di enti governativi americani. Questa ipotesi non fu mai né provata né dimostrata falsa, anche se il tempo ormai trascorso fa ritenere che essa non fosse vera: infatti, l'intenso studio effettuato per anni dalla comunità scientifica internazionale sulle caratteristiche degli S-box non ha portato alla luce alcuna di tali presunte regolarità. Al proposito è interessante notare che la criptoanalisi differenziale, che fu elaborata dalla comunità scientifica nei primi anni novanta, era già nota ai progettisti del DES, i quali non la divulgarono ma la tennero in considerazione nel progetto degli S-box (v. Coppersmith, 1994). Attualmente, comunque, il DES non è più considerato sicuro per due ragioni. In primo luogo, uno spazio di ricerca di 256 chiavi è considerato ormai troppo modesto per proteggere da attacchi di forza bruta compiuti con potenti elaboratori multiprocessore o con sistemi costituiti da un grande numero di elaboratori cooperanti e collegati fra loro (v. Wiener, 1993). In effetti, in occasione del DES-Challenge II, un concorso mondiale per la rottura del DES indetto nel 1998 dalla RSA Laboratories, un elaboratore appositamente progettato a tale scopo, il DES Cracker, del costo stimato di 250.000 dollari, vinse la gara trovando la chiave di cifratura in sole 56 ore; nel corso del DES-Challenge III, il DES Cracker, coadiuvato da circa 100.000 elaboratori connessi mediante Internet, trovò la chiave di cifratura in 22 ore e 15 minuti, esaminando più di 245 miliardi di chiavi al secondo. La seconda ragione di debolezza del DES, di interesse più teorico che pratico, risiede nel fatto che, come è stato dimostrato con tecniche di criptoanalisi lineare e differenziale, lo spazio di ricerca per gli attacchi di forza bruta può essere ridotto a sole 247 possibilità.
Una variante del DES, il DES triplo, è però ancora considerata sicura, in quanto non si conosce alcun modo di romperla se non con un attacco di forza bruta. Il meccanismo della cifratura DES tripla è semplice: a una prima fase di cifratura DES, effettuata con una chiave k1, segue una fase di decifratura DES effettuata con una chiave k2, quindi un'ulteriore fase di cifratura DES di nuovo mediante la chiave k1. La decifratura DES tripla compie i passi inversi: decifratura DES con k1, cifratura DES con k2, decifratura DES con k1 (v. fig. 2). Questo schema, ponendo k1 = k2, garantisce la compatibilità all'indietro col normale DES.
Effettivamente il DES triplo costituisce un codice per il quale l'approccio della forza bruta richiede 2112 tentativi: anche con un miliardo di chips che effettuano un miliardo di operazioni al secondo, ci vorrebbero 100 milioni di anni per un attacco di forza bruta.
b) L'algoritmo IDEA.
Un altro importante algoritmo a chiave segreta è IDEA (International Data Encryption Algorithm). Esso fu progettato nel 1990 in Svizzera (v. Lai e Massey, 1991), e per questa ragione non è soggetto alle restrizioni sull'uso e sull'esportazione che esistono negli Stati Uniti (dove gli algoritmi di cifratura sono a tutti gli effetti di legge considerati armi da guerra).
Come il DES, IDEA effettua una cifratura a blocchi (di 64 bit), ma usa una chiave di 128 bit e consiste in otto stadi, nei quali ogni bit di output dipende da tutti i bit in input (il che non vale per il DES, nel quale metà dei bit in ingresso a uno stadio vengono presentati, inalterati, all'uscita di quello stadio).
Non sono noti risultati di criptoanalisi che riescano a indebolirlo, e dunque rimane solo la possibilità di un attacco di forza bruta, che però richiede ben 2128 tentativi.
c) L'algoritmo AES.
Il 2 gennaio 1997 l'ente americano NIST (National Institute of Standards and Technology) iniziò il procedimento per designare il successore del DES, denominato AES (Advanced Encryption Standard). Tale procedimento si sviluppò attraverso varie fasi, tutte gestite all'insegna della massima diffusione internazionale e della circolazione delle idee e delle proposte (v. Nechvatal e altri, 2000), e si concluse il 4 dicembre 2001 con la scelta del cifrario Rijndael, il cui nome deriva da quello dei due autori, i belgi Joan Daemen e Vincent Rijmen (v. Daemen e Rijmen, 2000; v. NIST, 2001).
AES (ossia il cifrario Rijndael) effettua la cifratura su blocchi di 128 bit, e può utilizzare chiavi di 128, 192 oppure 256 bit. Il numero di stadi dipende dalla lunghezza della chiave usata: si impiegano 10 stadi con chiavi da 128 bit, 12 stadi con chiavi da 192 bit e 14 stadi con chiavi da 256 bit.
Gli S-box sono stati progettati con grande attenzione e sono stati oggetto di approfondite indagini da parte della comunità scientifica internazionale. Come per IDEA, non sono noti risultati di criptoanalisi che indeboliscano AES, e la lunghezza delle chiavi utilizzabili (soprattutto nel caso del valore 256) rende privo di speranze un attacco di forza bruta.
4. Crittografia a chiave pubblica.
Nella seconda metà degli anni settanta, un tipo di crittografia radicalmente nuovo, detto 'a chiave pubblica' (o 'asimmetrica'), fu introdotto dai ricercatori Whitfield Diffie e Martin E. Hellman (v. Diffie, 1988; v. Nechvatal, 1992), della Stanford University. Questo nuovo tipo di crittografia è basato sul fatto che esistono due chiavi, legate l'una all'altra: una è la 'chiave privata', nota solo al proprietario; l'altra è la 'chiave pubblica', nota a tutti. Ciò che viene cifrato con una delle due chiavi può essere decifrato con l'altra. In pratica, il messaggio viene cifrato da A con la chiave pubblica di B (che è nota a tutti); B decifra il messaggio con la propria chiave privata (che è nota solo a lui). Naturalmente, deve essere praticamente impossibile, perché estremamente oneroso dal punto di vista computazionale, derivare la chiave privata conoscendo quella pubblica.
La crittografia a chiave pubblica fornisce anche un meccanismo per garantire l'autenticazione del mittente (cioè la garanzia che il documento ricevuto provenga veramente dall'autore e non da qualcun altro) e l'integrità del messaggio (cioè la garanzia che il messaggio non sia stato alterato). In questo caso si opera alla rovescia: A cifra il messaggio con la propria chiave privata, e B lo decifra con la chiave pubblica di A. In questo caso non c'è segretezza, dato che chiunque può decifrare il messaggio, ma nessuno se non A avrebbe potuto produrlo, e inoltre nessuno può averlo alterato (altrimenti la decifratura non produrrebbe un documento comprensibile).
a) L'algoritmo RSA.
L'algoritmo a chiave pubblica più noto e di gran lunga più utilizzato attualmente è l'algoritmo RSA, dalle iniziali degli autori Ronald L. Rivest, Adi Shamir e Leonard M. Adleman, sviluppato nel 1978 (v. Rivest e altri, 1978). La sua sicurezza (v. Kaliski e Robshaw, 1995) si basa sulla enorme difficoltà di trovare i fattori primi di (ossia di fattorizzare) un grande numero: si stima che serva un miliardo di anni di tempo macchina per fattorizzare un numero di 200 cifre, e 1025 anni per un numero di 500 cifre.
Schematicamente, l'algoritmo funziona nel modo seguente: 1) si scelgono due grandi numeri primi p e q (tipicamente maggiori di 10100); 2) si calcola n = p • q e z = (p - 1) • (q - 1); 3) si sceglie un numero d primo relativamente a z; 4) si trova il numero e tale che e • d = 1 mod z. A questo punto si pone: a) chiave pubblica = la coppia (e, n); b) chiave privata = la coppia (d, n).
La cifratura e la decifratura vengono effettuate nel seguente modo: 1) il testo da cifrare (che, pur apparendo come costituito da caratteri alfabetici, in realtà all'interno dell'elaboratore è rappresentato da una sequenza di bit) è suddiviso in blocchi; ogni blocco è costituito da un numero di bit tale per cui il blocco stesso, interpretato come un numero in base 2 (cioè un numero binario) ha un valore compreso fra zero e (n - 1); 2) per calcolare il testo cifrato C relativo a un blocco di valore P si eleva P alla potenza e, si divide (utilizzando la divisione intera) il valore risultante per n e si assegna a C il valore del resto di tale divisione: più formalmente si calcola C = Pe modulo n; 3) per decifrare un blocco C, si calcola P = Cd modulo n.
È dimostrato che le due funzioni sono inverse, quindi si può cifrare con una qualunque delle due chiavi e decifrare con l'altra.
Nel 1994, dopo che gli autori avevano pubblicato sulla rivista "Scientific American" una sfida, l'RSA fu rotto. Il procedimento si riferiva a una chiave di 129 cifre (426 bit), e furono impiegati 1.600 elaboratori su Internet per 8 mesi, corrispondenti a un totale di 5.000 anni di tempo-calcolo di un singolo elaboratore capace di milioni di istruzioni al secondo. D'altronde, poiché RSA lavora con i numeri, la dimensione della chiave è variabile e può essere aumentata a piacere, per controbilanciare gli effetti derivanti dal miglioramento delle prestazioni degli elaboratori.
C'è però una considerazione interessante da fare in merito alla sicurezza di RSA: la sua robustezza deriva, come già detto, dalla enorme difficoltà di fattorizzare un grande numero primo. Ebbene, per il problema della fattorizzazione non esiste, allo stato attuale delle conoscenze scientifiche, né una soluzione efficiente (cioè praticabile) né la dimostrazione che non sia possibile trovare in futuro tale soluzione efficiente. Nel momento in cui tale soluzione dovesse venire alla luce, RSA cesserebbe istantaneamente di essere un cifrario utilizzabile in pratica, perché non sarebbe più sicuro.
b) Funzioni digest e firme digitali.
Come si è detto, la crittografia a chiave pubblica può essere usata per autenticare l'origine di un messaggio e per garantirne l'integrità, ossia di fatto per 'firmare' un messaggio. Tuttavia, a causa dell'elevato costo computazionale, questo approccio sembra inadatto: cifrare tutto il messaggio solo per firmarlo è poco efficiente. Inoltre, è scomodo rendere l'intero documento illeggibile ove solo una firma sia richiesta. Ambedue i problemi si possono risolvere con una tecnica diversa e più efficiente.
La tecnica in questione si basa sull'uso delle cosiddette 'funzioni riassunto' (funzioni digest), che vengono applicate al messaggio e producono un valore numerico che viene detto, appunto, 'riassunto del messaggio' (MD, message digest; v. Menezes e altri, 1997). Tale valore numerico è rappresentabile tipicamente con una quantità di byte che varia tra 10 e 20, indipendentemente dalla lunghezza del messaggio originario.
Per essere adatta allo scopo, una funzione riassunto MD deve possedere i seguenti requisiti: 1) deve essere computazionalmente poco oneroso calcolare MD(P); 2) dato MD(P), deve essere praticamente impossibile risalire a P; 3) deve risultare praticamente impossibile trovare due documenti diversi P1 e P2 tali che MD(P1) = MD(P2). Per soddisfare l'ultimo requisito il riassunto deve essere piuttosto lungo, almeno 128 bit. Si noti che dal punto di vista teorico non è possibile garantire che il terzo requisito sia sempre soddisfatto, poiché in generale il numero dei possibili messaggi è molto superiore a quello dei possibili riassunti. A ogni modo, dato che nei messaggi in chiaro è contenuta un'elevata ridondanza (non tutte le sequenze possibili di lettere dell'alfabeto costituiscono testi corretti in una data lingua) il problema in pratica può essere ignorato.
Gli algoritmi più diffusi per la generazione del riassunto sono MD5 (Message Digest 5, il quinto di una serie; v. Rivest, 1992) e SHA (Secure Hash Algorithm; v. NIST, 1995). Il primo produce riassunti di 128 bit, il secondo di 160 bit.
Un primo e semplice schema di utilizzo del message digest è il seguente, volto a garantire l'integrità del messaggio: A invia il messaggio corredato del riassunto; quando B riceve il tutto, ricalcola il riassunto del messaggio e lo confronta con quello ricevuto.
Ovviamente, questa semplice modalità è esposta all'attacco di eventuali intrusi, T, che potrebbero intercettare il messaggio, sostituirlo con uno diverso correlato del relativo riassunto, e inviarlo a B come se fosse quello proveniente da A. Per risolvere questo problema si ricorre a uno schema leggermente più complesso, che fa uso anche della crittografia a chiave pubblica: il riassunto, prima di essere spedito, viene cifrato dal mittente con la propria chiave privata e decifrato dal destinatario con la chiave pubblica del mittente. Un riassunto cifrato in questo modo è chiamato 'firma digitale' del mittente, perché assicura sia l'integrità del messaggio che l'autenticità del mittente, proprio come una firma apposta (in originale) in calce a un documento cartaceo (v. Akl, 1983).
5. Protocolli crittografici.
Quello visto sopra è un esempio di 'protocollo crittografico', ossia di una serie di regole che le parti debbono seguire per assicurarsi una conversazione conforme ai requisiti desiderati. Un protocollo crittografico in generale non specifica gli algoritmi da usare nei vari passi, ma piuttosto le tecniche da adottare (ad esempio, crittografia a chiave pubblica e/o privata, riassunti dei messaggi, ecc.), la successione di passi da seguire, e la tecnica da impiegare a ogni passo.
Esistono vari protocolli crittografici, che si differenziano per il contesto iniziale (ad esempio, i due partecipanti possono avere o meno una chiave segreta in comune; possono conoscere o meno le rispettive chiavi pubbliche) e gli scopi da raggiungere (autenticazione, segretezza, o entrambe le cose). Verranno ora descritti brevemente alcuni protocolli molto utilizzati in un contesto come quello della rete Internet e in particolare del World Wide Web (WWW), dove è possibile aver bisogno di autenticazione e segretezza nel dialogo con entità mai conosciute prima e per di più i canali sono insicuri e soggetti all'attacco da parte di intrusi.
a) Chiave segreta di sessione.
Un primo problema da affrontare e risolvere mediante un protocollo crittografico è legato al fatto che nel corso della comunicazione da portare avanti è più opportuno utilizzare la crittografia a chiave segreta, in quanto essa è computazionalmente meno onerosa di quella a chiave pubblica. Tuttavia, in un contesto distribuito come il WWW, è impensabile che ogni potenziale coppia di utenti disponga di una chiave segreta. Dunque, occorre trovare un protocollo per concordare, all'inizio della sessione, la chiave segreta da usare durante il resto della sessione, detta per questo 'chiave segreta di sessione'.
Un primo protocollo molto semplice sfrutta la crittografia a chiave pubblica: 1) B invia la sua chiave pubblica ad A; 2) A genera una chiave segreta (diversa da tutte quelle precedentemente generate), la cifra con la chiave pubblica di B e la invia a quest'ultimo; 3) B riceve la chiave segreta (cifrata) e la decifra con la propria chiave privata; 4) A e B a questo punto condividono la chiave segreta di sessione per mezzo della quale possono comunicare in tutta sicurezza (v. fig. 3).
Per evitare problemi derivanti dalla possibilità che un intruso T esegua un replay attack (cioè invii duplicati di tutto ciò che intercetta), la chiave segreta di sessione deve essere ogni volta diversa. Di norma, tale chiave viene calcolata per mezzo di un generatore di numeri casuali; quest'ultimo deve essere progettato molto accuratamente per evitare che un qualsiasi intruso T che disponga delle chiavi generate in precedenza possa derivare la chiave che verrà utilizzata la volta successiva.
b) Certificati digitali.
Il protocollo precedente presenta però un problema di fondo molto serio. Infatti, un intruso T può riuscire a fare in modo che A riceva, al posto della chiave pubblica di B, quella di T, e quindi a interporsi nella successiva comunicazione e a decifrare tutto (man in the middle attack; v. fig. 4).
Per risolvere questo problema si introduce una nuova entità, la 'autorità di certificazione' (Certificate Authority, CA). Si tratta di un ente, di norma governativo o comunque dotato di credibilità internazionale, con le seguenti caratteristiche: 1) possiede adeguati meccanismi di sicurezza (anche fisica) per garantire l'integrità dei propri sistemi di calcolo e dei dati in proprio possesso; 2) ha una coppia di chiavi (pubblica e privata) e provvede periodicamente a confermare ufficialmente la propria chiave pubblica, ad esempio con la pubblicazione su siti Internet di grande visibilità; 3) crea, per ciascuno dei clienti registrati (cioè coloro i quali hanno richiesto e ottenuto il servizio di certificazione della propria chiave pubblica) un 'certificato digitale', ossia un documento che contiene: a) le informazioni pertinenti relative al cliente (identità, autorizzazioni varie, altre informazioni a seconda dei tipi di certificati); b) la chiave pubblica del cliente; c) una data di scadenza del certificato stesso; d) un riassunto cifrato con la chiave privata del centro, ossia siglato con la firma digitale del centro.
In generale il software usato da A ha inserita al suo interno la chiave pubblica dell'autorità di certificazione, per cui può verificare la firma dei certificati provenienti da essa e quindi essere sicuro della loro autenticità e integrità.
Il protocollo visto precedentemente per stabilire la chiave segreta di sessione viene quindi modificato nel senso che la chiave pubblica di B viene consegnata ad A sotto forma di un certificato rilasciato a B da un'autorità di certificazione; in questo modo A ha la garanzia che si tratta proprio della chiave di B e non di quella di T.
Esiste uno standard ormai largamente diffuso, lo standard X.509 della International Telecommunication Union (ITU), che definisce le caratteristiche delle autorità di certificazione nonché la sintassi dei certificati (v. ITU, 1993).
c) Il protocollo SSL.
I certificati prodotti da un'autorità di certificazione possono essere conservati dove si desidera. Ad esempio, B può mantenere una copia del proprio certificato, e A può chiederlo direttamente a B anziché all'autorità di certificazione. Questo è precisamente quanto avviene nel WWW quando, ad esempio, si invia il proprio numero di carta di credito per effettuare un acquisto via Internet. In questo caso entra in gioco il protocollo SSL (Secure Sockets Layer), sviluppato in origine da Netscape Communications Corporation (v., 1982), il quale prevede che venga negoziata una chiave segreta di sessione fra il cliente e il fornitore del servizio, previa ricezione da parte del cliente del certificato digitale del fornitore del servizio. Mediante tale chiave segreta il numero di carta di credito del cliente viene quindi cifrato prima di essere inviato sulla rete.
Ad esempio, supponiamo che la pagina https://www.server.com/order.html consenta di effettuare un ordine di acquisto di beni fornendo il numero della propria carta di credito. Quando il cliente decide di accedere a tale pagina, si sviluppa la catena di eventi illustrata nella fig. 5.
d) Il protocollo SET.
Il protocollo SET (Secure Electronic Transaction) è un complesso protocollo crittografico progettato appositamente per gestire in modo sicuro tutte le fasi di un acquisto effettuato via Internet per mezzo di carte di credito (v. Macgregor e altri, 1997). Esso fu sviluppato inizialmente da Visa International e MasterCard International a partire dal 1996, e nel 1997 fu istituita la società SET LLC, detta anche SET Company, il cui scopo è gestire e promuovere l'adozione generalizzata del SET.
Il SET coinvolge i tre componenti che partecipano a una transazione: l'acquirente, il venditore e la banca del rivenditore. Tutte e tre le parti devono essere in possesso di un adeguato certificato. I certificati dell'acquirente e del venditore vengono rilasciati dalle loro banche, che quindi svolgono per essi anche la funzione di CA. Il certificato della banca è rilasciato da una CA esterna riconosciuta da tutte e tre le parti. Il certificato del cliente offre al venditore la garanzia che la transazione non sarà rifiutata con frode, quello del rivenditore assicura il cliente che il venditore è autorizzato ad accettare acquisti con carta di credito. Tutte le comunicazioni fra le parti sono cifrate, ed è degno di nota il fatto che durante una transazione il numero della carta di credito dell'acquirente viene trasferito alla banca del venditore senza che quest'ultimo lo possa vedere come testo in chiaro: ciò garantisce il cliente da possibili abusi da parte di un venditore poco corretto o poco attento, il quale potrebbe riutilizzare fraudolentemente il numero di carta di credito oppure custodirlo senza adeguate misure di sicurezza.
6. Problemi aperti e conclusioni.
Il settore della crittografia è in continua evoluzione. Innanzitutto va sottolineato il fatto che esso pone problemi alquanto delicati, in quanto il suo impatto sociale è decisamente considerevole: da un lato c'è la legittima esigenza dei privati cittadini e delle organizzazioni che operano nella piena legalità di garantirsi la necessaria privacy nelle comunicazioni riservate; dall'altro c'è la altrettanto legittima aspirazione dei governi a impedire che organizzazioni di stampo criminale possano disporre di strumenti che consentano loro di portare avanti azioni illegali scambiandosi informazioni che non possono essere intercettate. Di conseguenza, è da anni in corso un acceso dibattito, che non pare avviarsi a conclusione, su quale sia il giusto compromesso fra queste due esigenze (v. Electronic Privacy Information Center, 2000).
Un altro aspetto caratteristico di questo settore è la continua gara fra crittografia e criptoanalisi: per ogni nuova proposta della crittografia, la criptoanalisi si ingegna a trovarne possibili punti di debolezza, che, ove scoperti, vengono a loro volta presi in considerazione dalla crittografia per progettare nuove tecniche che ne siano immuni. Un esempio, come già detto, è il cifrario RSA: se in futuro dovesse venir trovato un metodo per fattorizzare velocemente grandi numeri, RSA diverrebbe inutilizzabile. Al proposito è interessante notare che esiste un modello teorico di calcolo detto 'computazione quantistica' (v. Steane, 1998), basato sullo sfruttamento delle proprietà quantistiche della materia, nell'ambito del quale è stato già progettato un metodo veloce per la fattorizzazione (v. Shor, 1994; v. calcolatori: Calcolo quantistico, vol. XII). Dunque, se venisse costruito un elaboratore conforme a tale modello, esso potrebbe facilmente rompere RSA.
Va detto infine che un cifrario incondizionatamente sicuro, cioè che non possa in alcun modo essere violato, in pratica non esiste. Oggi viene considerato adeguato un cifrario che sia computazionalmente sicuro, ossia un cifrario che soddisfi le seguenti due proprietà: 1) il costo da affrontare, in termini di risorse impiegate, per rompere un codice deve superare il valore delle informazioni cifrate mediante tale codice; 2) il tempo di calcolo necessario per rompere un codice deve essere superiore al tempo di vita utile delle informazioni cifrate mediante tale codice.
Tutti i cifrari attualmente diffusi, con la sola eccezione del DES singolo, sono considerati computazionalmente sicuri, ma naturalmente non si può avere la certezza che rimarranno tali per sempre, dato che la criptoanalisi potrebbe in futuro portarne alla luce debolezze allo stato attuale sconosciute.
Bibliografia.
Akl, S. G., Digital signatures: a tutorial survey, in "Computer", 1983, XVI, 2, pp. 15-24.
Biham, E., Shamir, A., Differential cryptanalysis of the Data Encryption Standard, New York: Springer-Verlag, 1993.
Coppersmith, D., The Data Encryption Standard (DES) and its strength against attacks, in "IBM Journal of research and development", 1994, XXXVIII, 3, pp. 243-250.
Daemen, J., Rijmen, V., The block cipher Rijndael, in Smart card research and applications. Third international conference - CARDIS '98, Louvain-la-Neuve, Belgium, September 14-16, 1998. Proceedings (a cura di J.-J. Quisquater e B. Schneier), Berlin-Heidelberg: Springer-Verlag, 2000, pp. 288-296.
Diffie, W., The first ten years in public-key cryptography, in "Proceedings of the IEEE", 1988, LXXVI, 5, pp. 560-577.
Electronic Privacy Information Center, Cryptography and liberty 2000. An international survey of encryption policy, http://www2.epic.org/reports/crypto2000/
ITU (International Telecommunication Union), Information technology-Open systems interconnection-The directory: authentication framework, ITU-T Recommendation X.509 (11/93), Geneva: ITU, 1993.
Kahn, D., The codebreakers: the story of secret writing, New York: Scribner, 1967, 19962 (tr. it.: La guerra dei codici: la storia dei codici segreti, Milano: Mondadori, 1969).
Kaliski, B. S. Jr., Robshaw, M. J. B., The secure use of RSA, in "CryptoBytes", 1995, I, 3, pp. 7-13.
Konheim, A., Cryptography: a primer, New York: Wiley & Sons, 1981.
Lai, X., Massey, J. L., A proposal for a new Block Encryption Standard, in Advances in cryptology - EUROCRYPT '90. Workshop on the theory and application of cryptographic techniques, Aarhus, Denmark, May 1990. Proceedings (a cura di I. B. Damgård), Berlin-Heidelberg: Springer-Verlag, 1991, pp. 389-404.
Macgregor, R. e altri, Secure electronic transactions: credit card payment on the web in theory and practice, Research Triangle Park, N.C.: International Technical Support Organization, 1997.
Matsui, M., Linear cryptanalysis for DES cipher, in Advances in cryptology - EUROCRYPT '93. Workshop on the theory and application of cryptographic techniques. Lofthus, Norway, May 1993. Proceedings (a cura di T. Helleseth), Berlin-Heidelberg: Springer-Verlag, 1994, pp. 386-397.
Menezes, A. J., Oorschot, P. C. van, Vanstone, S., Handbook of applied cryptography, Boca Raton, Fl.: CRC Press, 1997.
Nechvatal, J., Public key cryptography, in Contemporary cryptology: the science of information integrity (a cura di G. J. Simmons), New York: IEEE Press, 1992, pp. 179-195.
Nechvatal, J. e altri, Report on the development of the Advanced Encryption Standard (AES), Washington: National Institute of Standards and Technology, 2000.
Netscape Communications Corporation, Introduction to SSL (Secure Sockets Layer) protocol, http://developer.netscape.com/docs/manuals/security/sslin/contents.htm
NIST (National Institute of Standards and Technology), Secure Hash Standard (SHA-1), Federal Information Processing Standards Publication 180-1, Washington: NIST, 1995.
NIST (National Institute of Standards and Technology), Advanced Encryption Standard (AES), Federal Information Processing Standards Publication 197, Washington: NIST, 2001.
Rivest, R. (a cura di), The MD5 Message-Digest algorithm, Internet Requests for Comments (RFC) n. 1321, April 1992, http://www.faqs.org/rfcs/rfc1321.html
Rivest, R., Shamir, A., Adleman, L., A method for obtaining digital signatures and public key cryptosystems, in "Communications of the ACM", 1978, XXI, 2, pp. 120-126.
Schneier, B., Applied cryptography: protocols, algorithms and source code in C, New York: Wiley & Sons, 19962.
Shor, P. W., Algorithms for quantum computation: discrete logarithms and factoring, in Proceedings of the 35th Annual IEEE Symposium on Foundations of Computer Science, November 20-22, 1994, Santa Fe, New Mexico (a cura di S. Goldwasser), Los Alamitos, Cal.: IEEE Computer Society Press, 1994, pp. 129-134.
Simmons, G. J. (a cura di), Contemporary cryptology: the science of information integrity, New York: IEEE Press, 1992.
Steane, A., Quantum computing, in "Reports on progress in physics", 1998, LXI, pp. 117-163.
Stinson, D., Cryptography: theory and practice, Boca Raton, Fl.: CRC Press, 20022.
Wiener, M. J., Efficient DES key search (1993), in Practical cryptography for data internetworks (a cura di W. Stallings), Los Alamitos, Cal.: IEEE Computer Society Press, 1996, pp. 31-79.