Che materia stai cercando?

Anteprima

ESTRATTO DOCUMENTO

3.7.4 Output FeedBack (OFB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.7.5 Counter (CTR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.7.6 Considerazioni finali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

3.8 RC4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

3.9 Cifratura Asimmetrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

3.9.1 Scambio di chiavi Diffie-Hellman . . . . . . . . . . . . . . . . . . . . . . . 53

3.10 RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

3.10.1 Descrizione dell’algoritmo RSA . . . . . . . . . . . . . . . . . . . . . . . . 55

3.11 ElGamal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

3.12 Autenticazione dei messaggi e funzioni HASH . . . . . . . . . . . . . . . . . . . . 62

3.12.1 Crittografia dei messaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

3.12.2 Message Authentication Code (MAC) . . . . . . . . . . . . . . . . . . . . . 63

3.12.3 Funzioni Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

3.13 Firma digitale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

3.13.1 Firma digitale con RSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

3.13.2 Firma digitale con ElGamal . . . . . . . . . . . . . . . . . . . . . . . . . . 69

4 Gestione delle chiavi e certificati digitali 71

4.1 Scambio di chiavi classico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

4.1.1 Protocollo Needham-Schroeder . . . . . . . . . . . . . . . . . . . . . . . . 72

4.2 Scambio di chiavi a chiave pubblica . . . . . . . . . . . . . . . . . . . . . . . . . . 75

4.3 Soluzione per la distribuzione delle chiavi . . . . . . . . . . . . . . . . . . . . . . . 75

4.4 Salvataggio delle chiavi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

4.5 Revocazione della chiave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

4.6 Certificati digitali ed autorità di certificazione . . . . . . . . . . . . . . . . . . . . 77

4.7 Standard X.509 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

4.7.1 Revocazione del certificato . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

4.7.2 Procedure di Autenticazione . . . . . . . . . . . . . . . . . . . . . . . . . . 82

5 Identificazione ed autenticazione 84

5.1 Password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

5.1.1 Challenge-Response . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

5.2 Attaccare un sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

5.2.1 Attacco a dizionario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

5.2.2 Formula di Anderson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

5.3 Salt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

5.4 One-Time Password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

5.5 Aspetti Biometrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

6 Access Control Matrix 93

6.1 Operazioni primitive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

6.1.1 Create Subject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

6.1.2 Create Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

6.1.3 Add Right . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

6.1.4 Delete Right . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

6.1.5 Destroy Subject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

6.1.6 Destroy Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

6.2 Comandi sulla ACM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

6.3 Implementazione della ACM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

6.3.1 Access Control Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

6.3.2 Capability List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

2

6.3.3 Locks and Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

6.4 Il problema della Safety . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

6.4.1 Modello Take-Grant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.4.2 Modello Access Control Matrix Tipizzata . . . . . . . . . . . . . . . . . . . 116

7 Politica e Meccanismi 118

7.1 Politica di confidenzialità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

7.1.1 Modello Bell-LaPadula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

7.2 Politica di Integrità . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

7.2.1 Modello Biba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

7.2.2 Modello Clark-Wilson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

7.3 Politiche Ibride . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

7.3.1 Modello Chinese Wall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

7.3.2 Modello Role-Based Access Control . . . . . . . . . . . . . . . . . . . . . . 135

8 Principi di Secure Design 141

8.1 Least Privilege (Minimo Privilegio) . . . . . . . . . . . . . . . . . . . . . . . . . . 141

8.2 Fail-Safe Default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

8.3 Economy of Mechanism (Economia del Meccanismo) . . . . . . . . . . . . . . . . 141

8.4 Complete Mediation (Completa Meditazione) . . . . . . . . . . . . . . . . . . . . 141

8.5 Open Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

8.6 Separation of Privilege (Separazione dei Privilegi) . . . . . . . . . . . . . . . . . . 141

8.7 Least Common Mechanism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

8.8 Psychological Acceptability (Accettabilità Psicologica) . . . . . . . . . . . . . . . 141

9 Protocollo Kerberos 142

9.1 Idee alla base del protocollo Kerberos . . . . . . . . . . . . . . . . . . . . . . . . . 142

9.2 Funzionamento del protocollo Kerberos . . . . . . . . . . . . . . . . . . . . . . . . 144

9.3 Kerberos Versione 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

9.4 Funzionamento della versione 5 di Kerberos . . . . . . . . . . . . . . . . . . . . . 148

10 Protocollo di sicurezza per le reti TCP/IP 151

10.1 Protocollo SSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

10.1.1 Record Layer Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

10.1.2 Change Cipher Spec Protocol . . . . . . . . . . . . . . . . . . . . . . . . . 157

10.1.3 Alert Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

10.1.4 Handshake Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

10.2 Protocollo IPSec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

10.2.1 Security Association (SA) . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

10.2.2 Authentication Header (AH) . . . . . . . . . . . . . . . . . . . . . . . . . . 166

10.2.3 Encapsulating Security Payload (ESP) . . . . . . . . . . . . . . . . . . . . 168

3

1 Introduzione alla Sicurezza

Nella nostra trattazione, parleremo dei servizi relativi alla sicurezza di base che proteggono dalle

minacce il nostro sistema. Verranno mostrate le politiche di sicurezza che identificano le minacce

e definiscono i requisiti per garantire che un sistema sia effettivamente sicuro, ed inoltre i mec-

canismi di sicurezza per rilevare e prevenire gli attacchi. Quindi per analizzare la sicurezza di

un sistema bisogna comprendere i meccanismi che fanno rispettare le politiche di sicurezza. Gli

esseri umani sono l’anello più debole nei meccanismi di sicurezza di qualsiasi sistema, pertanto,

le politiche e le procedure devono prendere in considerazione anche la persona. Concludiamo la

nostra breve introduzione dicendo che la sicurezza è dinamica: cambiano le tecnlogie, cambiano i

problemi e cambiano le soluzioni che bisogna adottare!

C’è sempre un compromesso tra utilità e sicurezza: più volete fare con il vostro sistema e più

aumentano i problemi di sicurezza Arrivo ad un certo punto in cui voglio un sistema sicuro, ma

i meccanismi di sicurezza che dobbiamo aggiungere sono talmente tanti o talmente pesanti, dal

punto di vista della macchina, di tempo o dell’utente, che non vale la pena implementarli. Ad

esempio un mio prodotto potrebbe avere un problema, ma ripararlo farebbe si che l’utente non lo

voglia più acquistare. Questo perchè nel volerlo rendere più sicuro, dovrei aggiungere meccanismi

di sicurezza che aumenterebbero l’interazione che il cliente dovrebbe avere con la nostra applica-

zione e quindi, dal suo punto di vista, non ne varrebbe più la pena.

Ma viceversa, la mancata implementazione di sufficienti meccanismi di sicurezza al mio siste-

ma, potrebbe far si che l’attaccante abbia vita facile nel violarlo. Dobbiamo aggiungere quindi

sufficienti meccanismi di sicurezza da rendere l’attacco non più conveniente: se io rendo diffici-

le l’attacco a sufficienza da creare problemi all’attaccante portandolo ad abbandonare l’attacco,

allora ho praticamente risolto il problema. 4

2 Cosa significa ”Sicurezza”?

Il termine sicurezza non ha un suo significato preciso. Forse potremmo dire che la sicurezza è

un processo (senza fine) per migliorare la probabilità che il sistema rispetti i vincoli di una certa

politica. Per decidere se un sistema informatico è ”sicuro”, è necessario, innanzitutto, capire cosa

significhi per noi la parola ”sicurezza” e quindi quali minacce sono una preoccupazione:

1. Per un banchiere il problema è l’integrità dei dati.

Nssuno deve poter accedere al sistema e modificare i dati che riguardano le transazioni o il

saldo dell’utente.

2. Per una persona che gestisce una lotteria online, il problema è la confidenzialità.

Egli vuole che nessuno sappia quali sono i numeri che saranno estratti o il meccanismo

utilizzato per l’estrazione, finché numerosi clienti non abbiano partecipato a questa lotteria.

3. Per una persona che gestisce un sito di scommesse, il problema è la disponibilità.

Egli vuole che il sito rimanga sempre online.

La sicurezza informatica si basa sulla confidenzialità, l’integrità e la disponibilità. Le inter-

pretazioni di questi tre aspetti variano a seconda dei contesti in cui sorgono.

• →

Confidenzialità La confidenzialità (o riservatezza) è l’occultamento di informazioni

o risorse. La necessità di mantenere segrete queste informazioni, sorge visto l’utilizzo di

computer in settori sensibili come il governo e l’industria. Ad esempio, le istituzioni militari

e quelle civili nel governo, spesso impediscono che arrivino informazioni a persone che non

sono autorizzate a riceverle.

• →

Integrità L’integrità si riferisce all’attendibilità dei dati o delle risorse. Inoltre man-

tenere l’integrità significa impedire che i dati vengano modificati da persone che non sono

autorizzate a farlo.

• →

Disponibilità La disponibilità si riferisce alla capacità di poter utilizzare in ogni momen-

to le informazioni o le risorse desiderate. La diisponibilità è un aspetto molto importante

per la progettazione del sistema informatico, poiché un sistema disponibile è più efficiente di

un altro sistema. Gli attacchi chiamati Denial of Service (DoS), possono destabilizzare un

sistema e renderlo non più disponibile, pertanto c’è bisogno di un servizio di disponibilità

che risolva questi problemi.

Oltre questi tre aspetti, potremmo aggiungerne un quarto, che molto spesso viene considerato

secondario. Stiamo parlando di:

• →

Autenticità/Imputabilità Avere la certezza che una data informazione appartenga

a chi dice di averla generata. Io per poter stabilire e per assicurarmi che la politica sia

rispettata devo sapere chi sono le persone o l’entità che vogliono accedere questi dati.

Deve essere sempre possibile risalire all’entità che ha eseguito una specifica azione (Non-

Repudiation). Il sistema deve provvedere alla registrazione degli eventi significativi e

proteggere le registrazioni dalle manomissioni.

5

2.1 Politica, Meccanismo e Certezza

Tre sono gli aspetti coinvolti per arrivare ad un punto accettabile di sicurezza.

È fondamentale distinguere questi tre aspetti:

1. Politica

La sicurezza dei sistemi informatici si occupa solitamente di garantire i permessi di accesso

ai dati e alle risorse di un sistema, attuando dei meccanismi di controllo che definiscono ciò

che è permesso o non è permesso fare. Ad esempio, in una base di dati, il manager deve

poter leggere i dati mentre il dipendente non deve poterlo fare. La sicurezza informatica

deve essere studiata quindi in modo tale da non impedire agli utenti di sviluppare gli usi

che sono loro necessari, e di fare in modo che essi possano utilizzare il sistema in piena

fiducia. Questa è la ragione per cui è necessario definire in un primo tempo una politica di

sicurezza.

Per descrivere una politica di sicurezza possono essere utilizzati differenti linguaggi:

• →

Linguaggio naturale Genera diversi problemi. Difficilmente il linguaggio naturale è

in grado di descrivere perfettamente una politica senza creare ambiguità. Inoltre può

essere difficile verificare che tutto quello che si voleva descrivere è stato effettivamente

descritto.

• →

Linguaggio formale Si può usare anche un linguaggio più formale che presenta però

vantaggi e svantaggi: è più facile verificare che nella descrizione vi siano incongruenze o

contraddizioni, ma è più difficile da leggere poichè serve qualcuno che ha competenze.

• →

Linguaggio ad-hoc È un particolare linguaggio utilizzato ad esempio per far si che

un pacchetto riesca ad attraversare un firewall.

2. Meccanismo

Un meccanismo di sicurezza è un metodo, uno strumento o una procedura per far rispet-

tare una politica di sicurezza. Il loro compito è di impedire al sistema di passare da uno

ad uno stato non accettabile della politica. Ad esempio, si supponga che il

stato accettabile

laboratorio di informatica di un’università ha una politica di sicurezza che vieta a qualsiasi

studente di copiare i file dei compiti per casa di un altro studente. Il sistema informatico

prevede meccanismi per impedire ad altri di leggere i file di un utente. Anna non riesce

a utilizzare questi meccanismi per proteggere i suoi file, pertanto Bill riesce a copiarli. Si

verifica quindi una violazione, perché Bill ha violato la politica di sicurezza prestabilita. In

questo esempio, Anna avrebbe potuto facilmente proteggere i suoi file, ma in altri ambienti,

tale protezione può non essere facile. Internet, ad esempio, fornisce solo i meccanismi di sicu-

rezza più elementari, non sempre adeguati a proteggere le informazioni inviate al suo interno.

I meccanismi possono suddividersi in due classi:

• →

Meccanismi procedurali Ad esempio un meccanismo procedurale potrebbe essere

applicato in un azienda. Un utente che vuole accedere ad una determinata macchina

deve superare dapprima una serie di controlli per identificarsi. Il fatto che qualcuno

controlli il suo tesserino all’ingresso è un esempio lampante di meccanismo procedurale.

• →

Meccanismi tecnici Ad esempio un meccanismo tecnico è applicato in ambito mili-

tare. Ai dati, in base alla loro sensibilità, viene applicata una certa etichetta. Anche

ad ogni grado militare è associato lo stesso tipo di etichettatura. Quando una persona

con un certo grado e quindi una certa etichetta, vuole consultare alcuni dati, il mec-

canismo tecnico utilizzato confronterà l’etichetta dell’utente e l’etichetta dei dati per

capire, tramite regole prestabilite, se l’utente può o non può leggere quei dati.

6

3. Affidabilità

Come facciamo ad essere sicuri che ciò che abbiamo messo in piedi riflette quello che è stato

specificato dalla politica? C’è un modo per verificare che il sistema risponde ai requisiti

originali della politica? Questo è spesso difficile, ma vedremo più avanti che ci sono vari

aspetti da prendere in considerazione per rispondere a queste domande.

2.2 Fiducia ed ipotesi

Come determiniamo se la politica descrive correttamente il livello richiesto e il tipo di protezione

per il sito? Questa domanda è al centro di tutto la sicurezza informatica. La sicurezza poggia su

presupposti specifici che sono il tipo di sicurezza richiesto e l’ambiente in cui deve essere impiegato.

Alla base della sicurezza informatica troviamo il processo di fiducia ed ipotesi.

È importante, in qualunque contesto, sapere quali sono le ipotesi sulle quali si basa il nostro

ragionamento, il nostro meccanismo e la nostra politica. La maggior parte degli attacchi che ha

successo è perche si rende non valida l’ipotesi sulla quale si è costruito il nostro meccanismo.

Quindi bisogna sempre verificare quali sono le ipotesi e di cosa vi fidate per far si che queste siano

valide. L’ideale sarebbe non fidarsi di niente, ma è impossibile.

Esempio 1

In un sistema di autenticazione, lo scopo è inserire user e password per autenticarci. Quindi

per prima cosa ci colleghiamo e successivamente inseririamo l’identificativo e la password.

A questo punto il sistema va nel file delle password e recupera il record corrispondente al

nostro identificativo. Successivamente, prende la password da noi inserita, la manipola e la

confronta con una parte del record che precedentemente aveva recuperato.

Quali sono le ipotesi che abbiamo appena fatto? Ci sono molti ”se”! Ad esempio,

stiamo dando per scontato che nel momento in cui il sistema preveleva la nostra password

e la manipola, il meccanismo che la modifica sia corretto! Ovviamente non è detto che

lo sia, pertanto questa è un ipotesi! Noi fidandoci che questo algoritmo funzioni, stiamo

assumendo che sia corretto.

Esempio 2

Due persone vogliono comunicare in maniera sicura e mettono su un meccanismo per farlo,

basato sullo scambio di messaggi cifrati. Chiunque sia in ascolto, anche riuscendo ad

intercettare i messaggi, non potrebbe leggerli poiché cifrati. Quando un utente decide di

inviare un messaggio all’altro utente, dapprima stabilisce una connessione SSL che cifra il

messaggio e successivamente lo spedisce. A destinazione il messaggio verra decifrato sempre

da SSL per poi consegnarlo al destinatario.

Ci sono ipotesi? Si, molte! La meno ovvia, ad esempio, è che il primo utente con-

segna un messaggio da cifrare ad un certo algoritmo, ma non può sapere se la cifratura

funziona correttamente. Quindi dà per scontata questa ipotesi! Nell’utilizzare questo

meccanismo, il mittente si è fidato del corretto funzionamento dell’algoritmo di cifratura.

Ci sono molte più ipotesi di quanto uno possa immaginare. Sono proprio questi i punti che

l’attaccante cercherà di sfruttare per penetrare il sistema.

7

Le ipotesi sono un po’ dappertutto:

• Nelle politiche

Siamo sicuri che una politica scritta con un linguaggio naturale non presenti ambiguita?

Siamo sicuri che tale politica descriva ciò che effettivamente era stato richiesto?

Sono ipotesi che potremmo formulare.

• Nei meccanismi

Come facciamo ad essere sicuri che il meccanismo scelto è adeguato alla politica stabilita?

Come facciamo ad essere sicuri che il meccanismo scelto funzioni correttamente?

Non è affatto semplice avere risposte a queste ipotesi. Tutti i meccanismi si basano su

meccanismi di basso livello, per cui quest’ultimi devono essere affidabili.

Quanto possiamo fidarci sul fatto che il sistema sia corretto?

La fiducia non può essere quantificata con precisione, pertanto esistono tre punti chiave in grado

di stabilire ”quanto” ci si può fidare di un sistema. Questo aspetto si chiama affidabilità.

Come abbiamo detto, l’affidabilità del sistema viene misurata in tre punti chiave, che sono:

1. Specifica

Una specifica è una dichiarazione (formale o informale) del funzionamento del sistema. Ti-

picamente, in questo punto, vengono analizzati i requisiti che deve avere il sistema e le

funzionalità desiderate. Inoltre, si analizza come vogliamo implementare ciò che ci viene

richiesto: migliore sarà il meccanismo utilizzato per specificare la politica e maggior fiducia

avremo sul fatto che quello che ne uscirà sarà ciò che volevamo.

Esempio (1)

Una società deve acquistare un nuovo computer per uso interno, che sia invulnerabile

agli attacchi di Internet. La compagnia ha quindi bisogno di un sistema che abbia

i requisiti e le funzionalità desiderate. Una specifica, che indurrebbe la società ad

acquistare il computer, è ad esempio: ”Il sistema è immune ad attacchi di rete”.

2. Design

Il design traduce le specifiche in componenti da implementare per il corretto funzionamento

del sistema. Inoltre il design non deve permettere al sistema di violare le specifiche richieste.

Un analista può determinare se il design soddisfa le specifiche in diversi modi. Se le specifi-

che e il design sono espressi in linguaggio matematico, l’analista deve dimostrare che quanto

è stato progettato sia coerente con le specifiche. Se, al contrario, le specifiche e il design non

usano un linguaggio matematico, l’analista deve comunque ricercare un argomento convin-

cente il quale assicuri che le specifiche vengano rispettate. Anche se gran parte del lavoro

può essere fatto meccanicamente, un essere umano deve comunque eseguire alcune analisi e

modificare i componenti del progetto che eventualmente violano i requisiti richiesti.

Esempio (2)

Riprendendo l’esempio precedente, un design corretto per il sistema informatico che

l’azienda voleva acquistare, potrebbe essere la rimozione di schede di interfaccia di rete.

Questa progettazione soddisfa le specifiche, poiché il sistema è in grado di connettersi

ad Internet e di conseguenza è immune agli attacchi di rete.

3. Implementazione

Dato il design, l’implementazione crea un sistema che lo soddisfi. Se il design soddisfa le

8

specifiche, per transitività l’implementazione è anch’essa in grado di soddisfarle. La diffi-

coltà in questa fase è la complessità nel dimostrare che un programma implementi corret-

tamente la progettazione e, a sua volta, le specifiche. Un programma si dice corretto se

l’implementazione rispetta le specifiche.

2.3 Obiettivi e strategie di sicurezza

Dopo aver descritto una politica di sicurezza e i relativi meccanismi da utilizzare per renderla ef-

fettiva, come facciamo ad essere sicuri che il sistema non raggiunga mai uno stato non accettabile?

Le strategie che vengono utilizzate sono:

• Prevenzione

Adottare misure che impediscano il verificarsi di una situazione che non è accettata dalla

politica. Ad esempio, per prevenire che un attaccante entri nel nostro computer attraverso

Internet, scollegarlo dalla rete è un metodo efficace di impedire l’attacco.

In genere, la prevenzione riguarda l’esecuzione di meccanismi che gli utenti non possono

modificare e che siamo sicuri siano stati implementati in maniera corretta. In questo modo

l’attaccante non può sconfiggere il meccanismo modificandolo. Spesso però, i meccanismi

di prevenzione, interferiscono con l’uso del sistema a tal punto da ostacolarne il normale

utilizzo, pertanto la prevenzione non è sempre possibile. Alcuni semplici meccanismi di

prevenzione, come ad esempio le password (che hanno lo scopo di impedire agli utenti non

autorizzati di accedere al sistema), sono diventate ampiamente utilizzate.

• Rilevamento

Adottare misure in grado di poter rilevare come e quando una violazione della politica di

sicurezza ha avuto luogo. La rilevazione è più utile quando un attacco non può essere evi-

tato, ma può anche indicare l’efficacia delle misure preventive. I meccanismi di rilevamento

accettano che si verificherà un attacco: il loro obiettivo è quello di determinare e segnalare

se c’è stato o se vi è in corso un attacco.

Un tipico meccanismo di rilevazione è quello che avverte quando un utente inserisce una

password errata per tre volte: il tentativo di accesso continua, ma un messaggio di errore in

un log di sistema segnale l’insolito alto numero di errori nella digitazione.

Come detto nel punto precedente, la prevenzione a volte non può essere applicata. Ad

esempio nello scambio di messaggi tra Alice e Bob, Alice non può impedire che il messaggio

venga modificato durante il viaggio. Qui la prevenzione non può esserci, ma Alice può far si

che Bob esegua delle operazioni per verificare che il messaggio arrivato sia lo stesso spedito,

rilevando eventualmente delle manomissioni.

• Reazione

Adottare misure in grado di fermare l’attacco per riprendersi da eventuali danni che ci sono

stati causati. Il recupero può essere eseguito in due modi:

1. Il primo modo è quello di fermare un attacco per valutare i danni e ripararli. Per

fare un esempio, se l’attaccante elimina un file, un meccanismo di recupero potrebbe

essere quello di ripristinare tale file da un backup. In pratica, il recupero è molto più

complesso, perché la natura di ogni attacco è unico e ciò porta al fatto che eventuali

danni possono essere difficili da riparare completamente. Inoltre la reazione comporta

anche l’identificazione e la riparazione delle vulnerabilità che un attaccante può aver

usato per causare danni al sistema. 9

2. In una seconda forma di recupero, il sistema continua a funzionare correttamente mentre

vi è un attacco in corso. Questo tipo di recupero è abbastanza difficile da attuare a

causa della complessità dei sistemi informatici. Differisce dalla prima forma di recupero

perché il sistema può continuare a funzionare nonostante l’attacco. Ad esempio, nel

caso venga eseguito un attacco DoS contro un sistema, in quest’ultimo vi è una parte

che verrà attivata e sfruttata per mantenerlo online mentre si cerca di mettere fine

all’attacco.

Esempio 1 - Proprietà Privata

• →

Prevenzione Serrature alle porte, Inferiate, Muri intorno alla proprietà

• →

Rilevamento Mancanza di oggetti di valore, Telecamere, Antifurto

• →

Reazione Contattare la polizia, Reclamo assicurativo

Esempio 2 - E-Commerce

• →

Prevenzione Criptare gli ordini, Fare controlli sul commerciante prima di ordinare

• →

Rilevamento Appare una transazione non autorizzata sulla carta di credito

• →

Reazione Lamentarsi, Richiedere una nuova carta di credito

2.4 Aspetti operativi

Qualsiasi politica e qualsiasi meccanismo, devono bilanciare i benefici della protezione contro i

costi di specifica, progettazione ed implementazione. Questo equilibrio può essere determinato

analizzando i rischi di una violazione della sicurezza e la probabilità che si verifichi. A complicare

l’analisi sono i vincoli che le leggi impongono sull’accettabilità delle procedure di sicurezza.

Analisi dei costi e dei benefici - È più conveniente prevenire o recuperare?

I benefici della sicurezza informatica vengono relazionati al loro costo totale.

Ad esempio, vale la pena investire 10.000 euro per un sistema che impedisca la modifica illegale

di un Database, quando con 1.000 euro posso farne un duplicato? No, meglio fare una copia in

modo tale da reinserirla se si verifica un eventuale modifica! In alcuni casi quindi è preferibile un

meccanismo di recupero, dopo la rilevazione perchè la prevenzione non era abbastanza economica.

Analisi dei rischi - Dobbiamo proteggere qualcosa? Quanto impegno va messo?

Per determinare se un’attività deve essere protetta, c’è bisogno di un’analisi delle potenziali minac-

ce. Il livello di protezione è in funzione sia della probabilità di verificarsi di un attacco e sia delle

conseguenze che questo comporta. Se un attacco è improbabile, la protezione contro di questo ha

una priorità inferiore rispetto ad un altro attacco che ha una più alta probabilità di verificarsi.

Leggi e costumi - Sono tenute in considerazione i caratteri legali?

In alcuni casi è la legge ad imporre l’utilizzo dei meccanismi per far si che si protegga la privacy di

una persona. Le leggi che limitano la disponibilità e l’uso della tecnologia, influenzano i controlli

procedurali. Quindi, qualsiasi politica e qualsiasi selezione di meccanismi devono tener conto di

considerazioni di carattere legale. 10

2.5 Security by Obscurity

La sicurezza tramite segretezza (Security by Obscurity) è una tecnica che si basa sul mante-

nere segreta la progettazione e le funzionalità del sistema per garantirne la sicurezza. Un sistema

che utilizza questa tenica, può avere vulnerabilità di sicurezza teoriche o reali, ma i suoi designer

credono che se i difetti non sono noti, per gli attaccanti sarà improbabile trovarli.

Un sistema può utilizzare la sicurezza attraverso l’oscurità come una misura di difesa.

Mentre tutte le vulnerabilità di sicurezza conosciute sarebbero attenuate attraverso altre misure,

la comunicazione al pubblico dei prodotti e delle versioni in uso, li rende obiettivi primari per

le vulnerabilità scoperte di recente in tali prodotti e versioni. Il primo passo di un attaccante è

solitamente la raccolta di informazioni riguardanti il sistema che si vuole colpire. Questo passag-

gio può essere ritardato dalla security by obscurity. Nonostante sembri un meccanismo piuttosto

efficiente, ci sono vari motivi per cui tale tecnica è ancora meno efficace rispetto a 20 anni fa.

2.6 Security by Legislation

La sicurezza tramite normativa (Security by Legislation) dice che se insegniamo ai nostri utenti

su come comportarsi, allora possiamo garantire la sicurezza dei nostri sistemi.

Le regole sono semplici:

• Gli utenti non devono rivelare a nessuno le proprie password

• Gli utenti non dovrebbero scrivere le password su agende, smartphone, post-it ecc..

• Gli utenti non devono digitare la propria password quando qualcuno li sta osservando

• Gli utenti, periodicamente, devono cambiare la propria password rispettando una serie di

paramentri

• E cosi via..

La sensibilizzazione degli utenti e la cooperazione sono importanti, ma non possono essere questi

gli obiettivi principali per il raggiungimento della sicurezza.

11

2.7 Progettazione di un sistema sicuro

Un sistema ”sicuro” viene progettato basandosi su 5 fondamentali decisioni di progettazione.

a

1 fond. decisione di progettazione - Su cosa focalizzare i controlli di sicurezza?

Il primo problema di progettazione, è dove si vogliono focalizzare i controlli di sicurezza.

La scelta tipicamente viene presa a seconda di ciò che si vuole preservare.

Tre sono gli aspetti che vengono presi in considerazione: i dati, le operazioni o gli utenti.

Pertanto devo concentrarmi sui dati veri e propri, sulle operazioni che possono supportare, oppure

mi preoccupo di vincolare chi può accedervi o meno? Queste sono le prime decisioni da prendere

in fase di progettazione. A seconda di quel che si sceglie, politica e meccanismi sono diversi.

a

2 fond. decisione di progettazione - Dove inserire i meccanismi di sicurezza?

Il secondo problema di progettazione, è dove si vogliono inserire i meccanismi di sicurezza.

Anche qui non esiste una risposta esatta, ma varia a seconda di quello che si vuole ottenere.

Più si è vicini all’hardware e più i meccanismi sono generici e semplici da implementare.

Al contrario se vengono posti più vicino al software, i meccanismi sono più specifici e complicati.

Figura 1: Livelli in cui inserire i meccanismi di controllo

a

3 fond. decisione di progettazione - Complessità o Affidabilità?

Il terzo problema di progettazione, è quale aspetto dei meccanismi di sicurezza si vuole prendere

in considerazione. Abbiamo visto che a seconda di dove sono posti, essi variano da generali a

specifici e da semplici a complessi. Quindi Dobbiamo chiederci: vogliamo meccanismi più semplici

e più facili da verificare o meccanismi più complessi, pagandone però il fatto di avere più dubbi

su ciò che abbiamo implementato? 12

a

4 fond. decisione di progettazione - Controlli centralizzati o decentralizzati?

Il quarto problema di progettazione, riguarda la scelta tra meccanismi di controllo centralizzati

o decentralizzati. Se una singola entità è responsabile della sicurezza, allora è facile raggiungere

l’uniformità, ma ci vuole più tempo e può crearsi un collo di bottiglia. Una soluzione distribuita

può essere più efficiente, ma è più difficile raggiungere l’uniformità in quanto ogni entità può avere

una politica valutativa diversa. Quindi, avremo pro e contro a seconda di quello che utilizziamo:

• •

Controlli centralizzati Controlli decentralizzati

Più coerenti, ma meno efficienti Più efficienti, ma meno coerenti

Esempio: Bob deve controllare l’accesso delle persone in un locale. Egli utilizzerà lo stesso criterio

per giudicare ogni singola persona. D’altro canto però, questo creerà delle code all’ingresso in

quanto, Bob, dovrà giudicare una persona per volta. Se invece volessimo evitare che si vengano a

creare delle code, potremmo assegnare questo compito anche ad Alice e Marco. In questo modo

le code diminuiranno, ma non è detto che Alice, Marco e Bob abbiamo lo stesso criterio di valu-

tazione delle persone che devono o non devono entrare nel locale.

a

5 fond. decisione di progettazione - Come bloccare l’accesso al livello inferiore?

Il quinto problema di progettazione, è come bloccare l’accesso al livello inferiore, rispetto a quello

in cui è stato inserito il controllo. Gli aggressori tentano di aggirare i meccanismi di protezione.

Ogni meccanismo di protezione definisce un perimetro di sicurezza (confine). Le parti del sistema

che possono funzionare senza compromettere il meccanismo si trovano al di fuori del perimetro,

mentre le parti del sistema che possono disabilitare il meccanismo sono all’interno del perimetro.

Per comprendere meglio questo punto, analizziamo qualche esempio.

Esempio: In un azienda, c’è un mainframe che filtra le persone che possono accedere ai file.

Questo tipo di controllo è un controllo logico. I dati vengono memorizzati su nastri magnetici per

avere copie di backup. Un attaccante, non essendo in grado di superare il controllo logico effettua-

to dal mainframe, potrebbe pensare di recuperare direttamente i nastri magnetici per accedere ai

dati che vuole. In questo modo egli ha aggirato il meccanismo di sicurezza, passando da un livello

più alto ad un livello più basso. Più precisamente dal livello di OS Kernel al livello Hardware.

Figura 2: Accesso al livello inferiore

13

3 Crittografia

Il termine crittografia nasce dall’unione di due parole greche: kryptós, che significa ”nascosto”,

e graphı́a, che significa ”scrittura”. Essa tratta i metodi per rendere un messaggio ”offuscato” in

modo da non essere comprensibile a persone non autorizzate a leggerlo. Pertanto possiamo da

subito capire che è uno strumento utilizzato per preservare la segretezza e l’integrità dei dati.

Prima di iniziare la nostra trattazione, definiamo alcuni temini:

• Cifratura (codifica)

È il processo di conversione da testo in chiaro a testo crittografato;

• Decifratura (decodifica)

È il processo di conversione da testo crittografato a testo in chiaro;

• Plaintext

È il messaggio originale, anche noto come testo in chiaro;

• Ciphertext

È il messaggio codificato, anche noto come testo cifrato;

• Cryptosystem

È un sistema in grado di crittografare e decrittografare un messaggio;

• Crittoanalisi

Insieme di tecniche matematiche con cui si risale al testo in chiaro senza conoscere la chiave

di cifratura;

Ci sono due tipi di algoritmi di cifratura:

1. Algoritmi ristretti (Restricted )

Dove la sicurezza dell’algoritmo si fonda sulla segretezza della modalità di funzionamento

dell’algoritmo stesso; questa tecnica non è poi cosı̀ efficace in quanto esistono meccanismi

per risalire al funzionamento dell’algoritmo.

2. Algoritmi basati su chiave (Key-based )

Dove l’algoritmo è conosciuto, ma la sicurezza risiede nella segretezza della chiave;

ad esempio algoritmi simmetrici o algoritmi asimmetrici:

• Algoritmi Simmetrici (Chiave Privata)

Gli algoritmi simmetrici sono quelli usati nella crittografia classica e permettono al mit-

tente e dal destinatario di usare la stessa chiave per criptare e decriptare un messaggio;

• Algoritmi Asimmetrici (Chiave Pubblica)

Gli algoritmi asimmetrici, in particolare quelli reversibili, si basano su una coppia di

chiavi: L’una capace di cifrare e l’altra di decifrare l’informazione e viceversa;

Quindi, è immediato concludere che più le chiavi sono lunghe e più è sicuro l’algoritmo di

crittografia, anche se ciò comporta forti limitazioni prestazionali sugli algoritmi.

14

I sistemi crittografici sono caratterizzati da tre punti:

1. Il tipo di operazioni utilizzate per trasformare il plaintext in ciphertext

Tutti gli algoritmi di cifratura sono basati su due principi generali:

• sostituzione, in cui ogni elemento del plaintext (bit, lettera, gruppo di bit o lettere) è

sostituito da un altro elemento;

• trasposizione, in cui gli elementi del plaintext (bit, lettera, gruppo di bit o lettere)

vengono riordinati per formare il ciphertext;

Il requisito fondamentale è che dal ciphertext si possa tornare sempre al plaintext.

2. Il numero di chiavi utilizzate

Se il mittente e il ricevente usano la stessa chiave, il sistema viene definito come simmetrico

o a chiave privata. Se il mittente e il destinatario utilizzano chiavi diverse, il sistema viene

definito come asimmetrico o a chiave pubblica.

3. Il modo in cui il plaintext viene elaborato

Un block cipher elabora un blocco di elementi alla volta, producendo un blocco di uscita per

ogni blocco di ingresso. Un stream cipher elabora un elemento alla volta.

Prima di continuare la nostra trattazione, è bene soffermarci sulla distinzione di chiave:

• Chiave di Sessione

Definita anche come ”chiave temporanea”, questa viene scambiata all’inizio dell’interazione.

La comunicazione delle chiavi di sessione avviene usando chiavi a lungo termine.

• Chiave Permantene

Definita anche come ”chiave a lungo termine”, viene usata ripetutamente per una serie di

scambi. Questo aumenta l’esposizione. Può essere rintracciata e quindi viene utilizzata per

un numero basso di scambi.

3.1 Tipi di Cifrari

Due dei più famosi algoritmi/cifrari che utilizzano una chiave sono:

• •

Stream Cipher (cifrario a flusso) Block Cipher (cifrario a blocchi )

3.1.1 Cifrario a flusso (Stream Cipher)

In crittografia un cifrario a flusso (detto anche cifrario a caratteri) è un cifrario nel quale i simboli

che codificano il testo in chiaro sono cifrati indipendentemente l’uno dall’altro. In poche parole,

questi cifrari, convertono ogni simbolo di plaintext in un simbolo di ciphertext cifrando un carattere

alla volta.

• −→

Pro Sono eseguiti a velocità superiori rispetto a quelle dei cifrari a blocchi.

• −→

Contro Sono suscettibili a seri problemi di sicurezza se non sono utilizzati correttamente.

3.1.2 Cifrario a blocchi (Block Cipher)

In crittografia un cifrario a blocchi è un algoritmo operante su un gruppo simboli di lunghezza

finita organizzati in un blocco. A differenza dei cifrari a flusso, che cifrano un singolo elemento

alla volta, gli algoritmi a blocco cifrano un blocco di elementi contemporaneamente. In poche

parole, suddividono il plaintext in stringhe (chiamati blocchi) di lunghezza fissa e cifrano un

blocco alla volta. La dimensione dei blocchi, tipicamente è di 64 o 128 bit (nonostante alcuni

algoritmi accettino blocchi di dimensione variabile).

15

3.2 Cifratura simmetrica

Uno schema di crittografia simmetrica presenta 5 componenti fondamentali:

−→

1. Plaintext M

È il messaggio originale che viene dato in input all’algoritmo.

−→

2. Chiave Privata K

Anche la chiave è passata in input all’algoritmo di crittazione.

La chiave è un valore indipendente dal plaintext e dall’algoritmo stesso.

Quest’ultimo produce un output diverso a seconda della chiave utilizzata.

−→

3. Ciphertext C

Questo è il messaggio criptato prodotto come output.

Il ciphertext dipende sia dal plaintext e sia dalla chiave privata.

Dato un certo messaggio, due chiavi diverse produrranno due ciphertext diversi.

−→

4. Algoritmo di Crittazione E

Esegue varie operazioni sul testo in chiaro.

−→

5. Algortimo di Decrittazione D

Questo è essenzialmente l’algoritmo di crittazione al contrario.

Prende in input il ciphertext e la chiave segreta, producendo in output il plaintext originale.

Diamo uno sguardo più da vicino agli elementi essenziali di un sistema di crittografia simmetrica,

utilizzando la Figura 3. Bob vuole spedire un messaggio ad Alice e non vuole che qualcuno lo

legga. Per prima cosa si accorda con lei per la scelta di una chiave segreta K che se passata

all’algoritmo di cifratura, cripta il messaggio e lo rende illeggibile. A destinazione, Alice, utilizza

la stessa chiave segreta e l’algoritmo di decifratura per decodificare il messaggio spedito da Bob.

Figura 3: Modello di cifratura a chiave simmetrica

Come possiamo osservare la notazione che useremo per descrivere codifica e decodifica sarà:

• •

C = E(K, M) M = D(K, C)

Dobbiamo aggiungere che la confidenzialità dipende soltanto dalla segretezza della chiave con cui

si cifra. La cifratura a chiave simmetrica non è adatta a grandi sistemi poiché con N entità è

∗(N −1)

N

necessario generare e distribuire chiavi.

2 16

3.3 Crittoanalisi

Tipicamente, l’obiettivo di attaccare un sistema di codifica è di recuperare la chiave che utilizza,

anziché cercare di recuperare il plaintext da un unico ciphertext. L’approccio più utilizzato per

attaccare uno schema di crittografia convenzionale è la crittoanalisi (Cryptoanalysis).

Per crittoanalisi (dal greco kryptós, ”nascosto”, e analýein, ”scomporre”), si intende lo studio dei

metodi per risalire all’informazione originale partendo da quella criptata, senza essere a conoscen-

za della chiave utilizzata per effettuare l’operazione di codifica. Gli attacchi di crittoanalisi si

basano sulla conoscenza dell’algortimo di cifratura o su alcuni esempi di coppie di planintext e

ciphertext. Questo tipo di attacco, spesso, sfrutta le caratteristiche dell’algoritmo per tentare di

risalire al plaintext o alla chiave utilizzata.

Adesso riassumeremo i vari tipi di attacchi di crittoanalisi in base alla quantità di informazio-

ni note al crittanalista. Come base di partenza di solito si assume che, per gli scopi dell’analisi,

l’algoritmo generale è noto: questo è il principio di Kerckhoffs, il quale afferma che il nemico

conosce il sistema. Quindi il crittanalista è a conosceza di (Algoritmo di codifica) e (Algo-

E D

ritmo di decodifica). Il suo obiettivo primario è la ricerca della chiave utilizzata come input

K,

nell’algoritmo, per generare il ciphertext dal plaintext. Vediamo i tipi di attacco:

• Ciphertext Only

L’attaccante conosce e una collezione di ciphertext;

E, D

• Plaintext Only

L’attaccante conosce e un insieme di ciphertext dei quali conosce il corrispondente

E, D

plaintext;

• Chosen Plaintext

L’attaccante conosce e può ottenere i ciphertext corrispondenti ad un insieme arbitrario

E, D

di plaintext di sua scelta;

• Chosen Ciphertext

L’attaccante conosce e può ottenere i plaintext corrispondenti ad un insieme arbitrario

E, D

di ciphertext di sua scelta;

L’attacco Ciphertext Only è il più facile da contrastare, perché l’avversario ha pochissime infor-

mazioni su cui lavorare. In molti casi, tuttavia, l’analista riesce ad ottenere maggiori informazioni.

Ad esempio, l’analista può essere in grado di catturare uno o più plaintext e il loro ciphertext.

Oppure può venir a conoscenza di certi schemi presenti nel plaintext: un file, codificato nel forma-

to Postscript, inizia sempre con la stessa dicitura. Tutti questi sono esempi di attacco Plaintext

Only. Con questa conoscenza, l’analista può essere in grado di dedurre la chiave di codifica.

Uno schema di crittografia è incondizionatamente sicuro se il ciphertext generato non contiene

informazioni sufficienti per determinare univocamente il corrispondente plaintext. Cioè non im-

porta quanto tempo l’attaccante ha a disposizione, ma ciò che importa è che per lui sia impossibile

decifrare il ciphertext, semplicemente perché le informazioni richieste non sono al suo interno. Con

l’eccezione di uno schema noto come One-Time Pad, non vi è alcun algoritmo di cifratura che

è incondizionatamente sicuro. Pertanto, un algortimo di crittografia deve rispettare almeno uno

dei due criteri:

• Il costo per rompere il cifrario deve superare il valore delle informazioni criptate;

• Il tempo necessario per rompere il cifrario deve superare la durata utile delle informazioni;

Uno schema di crittografia si dice computazionalmente sicuro se almeno uno dei precedenti

criteri descritti è pienamente soddifatto. 17

3.4 Tecniche di base per la cifratura

In questa sezione esamineremo quelle che vengono chiamate tecniche di base per la cifratura

di un messaggio. Lo studio di queste tecniche ci consente di illustrare gli approcci di base che la

crittografia simmetrica utilizzata ancora oggi. Queste tecniche riguardano:

• •

la Sostituzione; la Permutazione;

Vedremo più avanti un sistema che combina sia la sostituzione e sia la permutazione.

3.4.1 Sostituzione

Una tecnica di sostituzione è quella in cui le lettere del plaintext sono sostituite da altre lettere,

numeri o simboli.

Cifrario di Cesare

Il più antico e più semplice cifrario a sostituzione venne ideato da Giulio Cesare per le sue comu-

nicazioni private. Il Cifrario di Cesare (Caesar Cipher ) consisteva nel sostituire ogni lettera

dell’alfabeto con la terza lettera più a destra. Quindi la chiave è 3. Vediamo un esempio:

Plaintext: attaccare i galli alla ora sesta

Ciphertext: DZZDFFDUH N LDOON DOOD RUD VHVZD

Si noti che l’alfabeto è ciclico, nel senso che dopo la letter avremo di nuovo la lettera

Z A.

Possiamo definire la trasformazione del plaintext attraverso il seguente schema:

Plaintext: a b c d e f g h i j k l m n o p q r s t u v w x y z

Ciphertext: D E F G H I J K L M N O P Q R S T U V W X Y Z A B C

Possiamo assegnare un’equivalenza numerica a ciascuna lettera dell’alfabeto:

a b c d e f g h i j k l m

0 1 2 3 4 5 6 7 8 9 10 11 12

n o p q r s t u v w x y z

13 14 15 16 17 18 19 20 21 22 23 24 25

Definiamo inoltre con p ogni singola lettera del plaintext e con K la chiave che vogliamo utilizzare

per la sostituzione (nel classico esempio di Cifrario di Cesare, K è uguale a 3).

Cosı̀ facendo l’algoritmo di crittazione può essere espresso come segue:

C = E(K, p) = (p + K) mod 26

Al contrario l’algoritmo di decrittazione è semplicemente:

p = D(K, C) = (C K) mod 26

18

Questo cifrario, vista la sua semplicità, non è per niente sicuro ed affidabile. Se è noto che un certo

ciphertext è stato generato da un cifrario di Cesare, allora per un crittoanalista è facile risalire

al plaintext tramite un attacco brute-force. Semplicemente egli prova tutte le possibili chiavi per

tentare di decodificare il testo cifrato. La Figura 4 ci mostra i risultati dell’applicazione di questa

strategia per un dato ciphertext. In questo caso, il plaintext appare da subito nella terza riga.

Figura 4: Attacco Brute-Force sul Cifrario di Cesare

Tre caratteristiche importanti ci hanno permesso di utilizzare un attacco di crittoanalisi:

1. Sono noti gli algoritmi di crittografia e decrittografia;

2. Ci sono solo 25 chiavi da testare;

3. Il linguaggio del plaintext è noto e facilmente riconoscibile;

La terza caratteristica è molto importante. Se il linguaggio in cui è scritto il plaintext è sco-

nosciuto, quando verrà ottenuto dall’attaccante non sarà riconoscibile. Inoltre, il plaintext può

essere abbreviato o compresso in qualche modo, rendendo il riconoscimento ancora più comples-

so. Ad esempio, la Figura 5 mostra una porzione di un file di testo compresso utilizzando un

algoritmo chiamato ZIP. Se questo file viene quindi crittografato con un semplice cifrario a so-

stituzione (ampliato per includere più di soli 26 caratteri alfabetici), allora il plaintext non può

essere riconosciuto dall’attaccante dopo aver eseguito un attacco di crittoanalisi.

Figura 5: Esempio di un testo compresso con ZIP

19

Cifrario di Vigenère

Abbiamo visto che il Cifrario di Cesare è un cifrario a sostituzione monoalfabetico che però è

piuttosto facile da rompere con attacchi di crittoanalisi. Quindi per migliorare la semplice tecnica

monoalfabetica di cifratura, nacque l’approccio di cifratura a sostituzione polialfabetica.

In crittografia, un cifrario a sostituzione polialfabetica fa uso di un certo numero di alfabeti per

sostituire le lettere del messaggio, usando un determinato ordine che costituisce la chiave.

Il più conosciuto cifrario polialfabetico è il cifrario di Blaise de Vigenère.

Il metodo si può considerare una generalizzazione del Cifrario di Cesare: invece di spostare sem-

pre dello stesso numero di posti la lettera da cifrare, questa viene spostata di un numero di posti

variabile calcolato in base ad una chiave segreta (concordata tra mittente e destinatario), usando

×

una tabella 26 26. In questa tabella, ogni riga contiene tutte le ventisei lettere dell’alfabeto

traslate a sinistra di un valore pari all’indice di riga.

×

Figura 6: Tabella 26 26 - Cifrario di Vigenère

Vediamone un esempio per comprendere meglio il funzionamento:

Plaintext: svaligeremo le banche questa notte

Chiave: furtofurtof ur tofurt ofurto furto

Ciphertext: XPREWLYIXAT FV UOSWYX EZYJMO SIKMS

Abbiamo visto quindi che il procedimento è molto semplice: basta ripetere la chiave più volte (se

×

ovviamente questa è minore del plaintext) e cifrare basandoci sulla tabella 26 26 di Vigenère.

20

Possiamo esprimere il cifrario di Vigenère nel modo seguente:

• definiamo il plaintext come una sequenza di lettere

{p }

P = , p , p , . . . , p

0 1 2 n−1

• definiamo la chiave segreta come una sequenza di lettere

{k },

K = , k , k , . . . , k dove tipicamente m < n

0 1 2 m−1

• definiamo il ciphertext come una sequenza di lettere

{C }

C = , C , C , . . . , C

0 1 2 n−1

Quindi, la prima lettera della chiave codifica la prima lettera del plaintext, la seconda lettera della

chiave codifica la seconda lettera del plaintext, e cosı̀ via. Quando le lettere della chiave finiscono

si ripetono dall’inizio per cifrare le restanti lettere del plaintext. Questo processo continua fino a

quando tutta la sequenza di lettere del plaintext è crittografata. L’equazione generale del processo

di crittazione è la seguente: C = E(K, P ) = (p + K ) mod 26

mod

i i i m

Al contrario, l’equzione del processo di decrittazione è semplicemente:

p = D(K, C) = (C K ) mod 26

mod

i i i m

La forza di questo cifrario è che anche se il plaintext presenta più lettere uguali, nel ciphertext esse

possono apparire diversamente a seconda della lettera della chiave di cifratura che le cripta. Osser-

vando l’esempio precedente, possiamo notare come le lettere ”a” siano cifrata e diano un risultato

differente a seconda del carattere della chiave che viene utilizzato in quel momento per la cifratura.

Questo cifrario ha goduto per tre secoli la fama di essere un cifrario inattaccabile; nel 1863 il

colonnello prussiano Friedrich Kasiski pubblicò un primo metodo di decrittazione; in seguito si

sono trovati diversi altri efficienti metodi per forzare questo cifrario. In realtà il cifrario di Vigenère

fu già forzato da Charles Babbage, ma i risultati della sua ricerca non furono mai pubblicati. La

debolezza del Vigenère sta nell’essere, di fatto, un insieme di n cifrari di Cesare, dove n è la lun-

ghezza della chiave. Se il crittoanalista riesce a determinare la lunghezza della chiave (nel nostro

caso, n) la decrittazione diventa molto semplice. Per far ciò si possono utilizzare metodi statistici

per trovare n, e successivamente applicare l’analisi delle frequenze a ciascun alfabeto cifrante.

La parte più complicata sta dunque nello scoprire la lunghezza della chiave cifrante anche se

la cosa non è impossibile. Nel testo cifrato infatti, se la chiave utilizzata è breve, vi saranno

probabilmente delle serie di lettere ripetute. Queste serie di lettere, se abbastanza lunghe (5-6

caratteri), saranno generate probabilmente dalla stessa parola in chiaro. Basterà allora calcolare

la distanza tra una parola e l’altra e la lunghezza della ripetizione per risalire alla lunghezza n

della chiave. Cosı̀ facendo si può capire quali lettere usano il primo alfabeto cifrante, quali il

secondo, e cosı̀ via procedendo poi con l’analisi delle frequenze per ciascun alfabeto. Per ovviare

a questo problema, si è provato a scegliere chiavi molto lunghe. Cosı̀ facendo, gli alfabeti cifranti

sono molti di più e le probabilità di ripetizioni sono inferiori.

21

Cifrario di Vernham

Il Cifrario di Vernam è un sistema crittografico basato sul Cifrario di Vigenère, al quale aggiunge

il requisito che la chiave sia lunga quanto il testo e non riutilizzabile (per questo viene spesso

chiamato OTP, acronimo per l’inglese One-Time Pad). Il cifrario di Vernam è l’unico sistema

crittografico la cui sicurezza sia comprovata da una dimostrazione matematica e per questo si è

guadagnato il titolo di ”cifrario perfetto”. Si può facilmente capire quanto sia scomodo distribui-

re in modo sicuro chiavi di tali dimensioni. Ciò nonostante il cifrario di Vernam è stato utilizzato

per le comunicazioni con le spie, che venivano equipaggiate di taccuini contenenti una lunga chiave

per ogni pagina, da poter strappare e gettare una volta utilizzata (one time, ovvero ”un solo uso”).

Il Cifrario di Vernham funziona su dati binari (bit) piuttosto che lettere. Definiamo:

• p = i-esima cifra binaria del plaintext;

i

• k = i-esima cifra binaria della chiave;

i

• c = i-esima cifra binaria del ciphertext;

i

• ⊕ = Operazione di OR Esclusivo (XOR);

Quindi il sistema di cifratura può essere espresso sinteticamente come:

c = p K

i i i

Allo stesso modo il sistema di decifratura è espresso:

p = c K

i i i

Figura 7: Cifrario di Vernham

È importante ribadire che la chiave deve essere lunga quanto il messaggio che cifra e può essere

utilizzata una sola volta, pena la perdita della validità delle ipotesi iniziali e la riduzione da sistema

”inattaccabile” a sistema ”facilmente attaccabile”.

22

3.4.2 Permutazione/Trasposizione

Tutte le tecniche esaminate finora coinvolgono la sostituzione, ossia ogni simbolo del plaintext vie-

ne sostituito da un altro simbolo che formerà il ciphertext. Un tipo molto diverso di mappatura

si ottiene eseguendo una sorta di permutazione sulle lettere del plaintext. Questa tecnica viene

definita come Permutazione o Trasposizione. In crittografia un cifrario a trasposizione è un

metodo di cifratura in cui le posizioni occupate dai simboli (lettere, numeri, ecc..) del plaintext,

sono cambiate secondo un determinato schema, cosı̀ che il ciphertext costituisca una permutazione

del plaintext.

Cifrario a Staccionata

Il Cifrario a Staccionata (rail fence) è il più semplice cifrario a trasposizione che deve il suo

nome al modo in cui il plaintext viene cifrato: esso viene trascritto lettera per lettera su righe

ideali, diagonalmente verso il basso per poi, una volta arrivati alla riga più bassa, risalire verso

quella più alta e cosi via. Il messaggio cifrato si ottiene leggendo le lettere cosı̀ posizionate riga per

riga. Ad esempio, utilizzando il cifrario a staccionata con profondità 3, la cifratura del messaggio

”uccidere John Ripper”, sarà la seguente:

Plaintext: uccidere John Ripper

U D J R E

C I E E O N I P R

C R H P

Ciphertext: UDJRECIEEONIPRCRHP

Trasposizione Colonnare

Il genere di cose visto precedentemente sarebbe banale per crittografare. Uno schema più comples-

so è quello di scrivere il messaggio in un rettangolo, riga per riga, e leggerlo colonna per colonna,

ma permutando l’ordine di quest’ultime. Cosı̀ facendo, l’ordine delle colonne diventa la chiave

dell’algoritmo. Questo tecnica si chiama Trasposizione Colonnare. Vediamo un esempio:

Plaintext: uccidere John Ripper

Chiave: 4 2 5 1 3

Tras Col: U C C I D

E R E J O

H N R I P

P E R X Y

Ciphertext: IJIXCRNEDOPYUEHPCERR

Cosı̀, in questo esempio, la chiave è 42513. Per cifrare, si scrive la colonna etichettata 1 (in que-

sto caso colonna 4), poi la colonna etichettata con 2 (in questo caso colonna 2) e cosi via fino

a formare il ciphertext. Un cifrario a trasposizione pura è facilmente riconoscibile perché ha la

stesse frequenze di lettere del plaintext. Dobbiamo far notare che il nostro messaggio era più corto

rispetto allo schema di trasposizione colonnare che abbiamo scelto, pertanto in questi casi vengono

aggiunti dei caratteri random inutili al plaintext originale. Per il tipo di trasposizione colonnare

appena mostrato, la crittoanalisi è abbastanza semplice.

23

Il cifrario a trasposizione colonnare può essere reso molto più sicuro eseguendo più di una volta

la fase di trasposizione. Il risultato è una permutazione più complessa che non è facilmente

ricostrubile. Cosı̀, se il plaintext precedente viene crittografato utilizzando lo stesso algoritmo, ma

applicato due volte, mantenendo la stessa chiave, avremo:

Plaintext: uccidere John Ripper

Chiave: 4 2 5 1 3

Tras Col: U C C I D

E R E J O

H N R I P

P E R X Y

Tras Col: I J I X C

R N E D O

P Y U E H

P C E R R

Ciphertext: XDERJNYCCOHRIRPPIEUE

In questo modo, ciò che verrà fuori, sarà difficilmente ricostrubile poiché una cifratura doppia

mescola ancora di più le lettere del plaintext originale.

24

3.5 DES: Data Encryption Standard

In crittografia il Data Encryption Standard (DES) è un algoritmo di cifratura scelto come

standard dal FIPS per il governo degli Stati Uniti d’America nel 1976 ed in seguito diventato di

utilizzo internazionale. Si basa su un algoritmo a chiave simmetrica con chiave a 64 bit (ma solo

56 utili poiché 8 sono di controllo). Questo algoritmo all’inizio ha suscitato molte discussioni per

via della sua chiave di cifratura corta e per via di alcune scelte progettuali che erano segretate.

Si supponeva che dietro queste scelte vi fosse la National Security Agency (NSA) e l’inserimento

di una backdoor. Di conseguenza il DES è stato oggetto di un’intensa analisi di tipo accademico

che ha contribuito in modo notevole allo sviluppo delle conoscenze che sono alla base dei moderni

algoritmi di cifratura e delle moderne tecniche di crittoanalisi.

Attualmente DES è considerato insicuro per moltissime applicazioni. La sua insicurezza deriva

dalla chiave utilizzata per cifrare i messaggi, che è di soli 56 bit. Nel gennaio del 1999 distribu-

ted.net e Electronic Frontier Foundation collaborarono per rompere pubblicamente una chiave di

crittazione, e ci riuscirono in 22 ore e 15 minuti. Con le potenze di calcolo disponibili oggi, si

può forzare una chiave DES in poche ore esaminando tutte le possibili combinazioni. In alcuni

documenti parlando del DES si utilizza anche la sigla DEA (Data Encryption Algorithm), ossia il

nome originale dell’algoritmo cosı̀ come fu ideato da IBM.

3.5.1 Algoritmo di crittazione DES

Lo schema generale per l’algoritmo di crittazione DES è illustrato in Figura 8. Come per

qualsiasi schema di crittografia, ci sono due input per la funzione di codifica: il plaintext da

cifrare e la chiave. In questo caso, il plaintext deve essere di lunghezza pari a 64 bit la chiave di

lunghezza pari a 56 bit (poiché 8 sono di controllo).

Figura 8: Rappresentazione generale dell’algoritmo di crittazione DES

25

Il lato sinistro della Figura ci mostra come l’elaborazione del plaintext procede in tre fasi:

• Prima Fase

Innanzitutto, il plaintext di 64 bit passa attraverso una permutazione iniziale (indicata

con IP - Initial Permutation) che riorganizza i bit producendo l’input permutato.

• Seconda Fase

Successivamente, vi è una fase costituita da 16 applicazioni della stessa funzione, che coin-

volge entrambe le funzioni di permutazione e sostituzione. L’output al termine dei 16 cicli di

funzione, consiste di 64 bit che sono in funzione del plaintext iniziale e della chiave. La metà

sinistra e la metà destra dell’output vengono poi scambiate producendo cosı̀ un pre-output.

• Terza Fase

Infine, il pre-output viene fatto passare attraverso una permutazione che è l’inversa della per-

mutazione iniziale IP, producendo il ciphertext di 64 bit. Tale permutazione viene chiamata

−1

permutazione finale (indicata con FP o IP - Final Permutation).

La parte destra della Figura invece, mostra il modo in cui viene utilizzata la chiave da 56 bit.

Inizialmente, la chiave viene fatto passare attraverso una funzione di permutazione. Successiva-

mente, per ciascuno dei 16 cicli di funzione, viene prodtta una sottochiave (K ) generata dalla

i

combinazione di uno spostamento circolare verso sinistra e da una permutazione. Facciamo

notare che la permutazione iniziale è diversa dalla permutazione che viene poi applicata durante i

16 cicli di funzione. Quest’ultima è la stessa per ogni ciclo, ma le sottochiavi prodotte sono diverse

a causa degli spostamenti ripetuti dei bit della chiave.

Permutazione Iniziale e Finale - IP e FP

La permutazione iniziale e la permutazione finale sono definiti da tabelle, come mostrato nel-

la Figura 9. Le tabelle devono essere interpretate nel modo seguente. L’input per una tabella

consiste di 64 bit numerati da 1 a 64. Le 64 voci nella tabella di permutazione contengono una

permutazione dei numeri da 1 a 64. Ogni voce nella tabella di permutazione indica la posizione

numerata dei bit dell’input nell’output, che consiste anche questo di 64 bit.

Figura 9: Tabelle di Permutazione Iniziale e Finale (IP e FP)

26

Dettagli di un singolo ciclo

La figura 10, mostra la struttura interna di uno dei 16 cicli della stessa funzione. Partiamo

dall’analizzare il lato sinistro della Figura. La metà destra e la metà sinistra, di ogni valore

intermedio a 64 bit, sono trattate come entità separate a 32 bit, etichettate rispettivamente con

L (quella di sinistra) ed R (quella di destra). L’intero processo che avviene in ciascun ciclo, può

essere riassunto con le seguenti formule: L = R

i i−1

R = L F (R , K )

i i−1 i−1 i

Figura 10: Uno dei 16 cicli di funzione dell’algoritmo DES

La chiave del ciclo K , è di 48 bit, mentre l’input R è di 32 bit. Inizialmente R viene esteso a

i

48 bit utilizzando una tabella (Figura 11a) che definisce una funzione di permutazione con

espansione, la quale comporta la duplicazione di 16 bit di R. Successivamente, i risultanti 48

bit sono sottoposti ad una funzione di OR Esclusivo (XOR) con K . Questo risultato, sempre di

i

48 bit, passa attraverso una funzione di sostituzione che produce un output di 32 bit, i quali

vengono elaborati da una funzione di permutazione descritta da un’altra tabella (Figura 11b).

Figura 11: Tabelle di permutazione con espansione (E) e permutazione (P)

27

Il ruolo delle S-Box nella funzione F , è illustrato nella Figura 12. La sostituzione consiste di un

insieme di otto S-box, ognuno dei quali accetta 6 bit come input e produce 4 bit come output.

Queste trasformazioni sono definite nella tabella in Figura 13, che va interpretata come segue:

il primo e l’ultimo bit dei 6 dati in input al box S , formano un numero binario di 2 bit. Tale

i

numero binario verrà utilizzato per selezionare una delle quattro sostituzioni definite dalle quattro

righe nella tabella per S (Figura 13). Invece, la parte centrale, formata dai quattro bit rimanenti,

i

è utilizzata per selezionare una delle sedici colonne. Il valore nella cella, selezionata dalla riga e

dalla colonna, è poi convertito in una rappresentazione binaria di 4 bit per produrre l’output.

Ad esempio, in S1, dato come input il valore 011001, avremo che:

• la riga sarà data dai bit 01 (011001)

In decimale avremo che 01 = 1, quindi indica la RIGA 1;

• la colonna sarà data dai bit 1100 (011001)

In decimale avremo che 1100 = 12, quindi indica la COLONNA 12;

Trasformando in decimale questi due valori, otterremo rispettivamente la riga 1 e la colonna

12. Ricordiamo che le colonne vanno da 0 ad m mentre le righe da 0 ad n. Il valore decimale

contenuto nella cella identificata da questi due paramentri è 9, quindi l’output sarà 1001.

Figura 12: Panoramica del funzionamento di S-Box

28

Figura 13: S-Box

3.5.2 Algoritmo di decrittazione DES

La decrittazione in DES avviene attraverso lo stesso algoritmo utilizzato per la crittazione, ad

eccezione che l’applicazione delle sottochiavi (chiavi di ciclo) è invertita.

29

3.5.3 Problematiche del DES

Come abbiamo detto nella nostra trattazione iniziale, DES si basa su un algoritmo che vuole in

input blocchi di 64 bit e una chiave simmetrica di 56 bit. Questo algoritmo, viste le caratteristiche,

ha suscitato molte discussioni per via della sua chiave di cifratura corta e per via di alcune scelte

progettuali che erano segretate. Furono molti gli esperti che investirono denaro per la costruzione

di macchine potenti in grado di provare che l’algoritmo DES poteva essere violato. Come abbia-

mo detto, nel gennaio del 1999 due società importanti collaborarono per rompere pubblicamente

una chiave di crittazione, e ci riuscirono in 22 ore e 15 minuti. Ad oggi, con una moderna bot-

net, una chiave di crittazione DES può essere rotta in poche ore. Possiamo quindi affermare che

la lunghezza delle chiavi DES di soli 56 bit è piuttosto inadeguata, infatti banche e altre insti-

tuzioni, da vari anni stanno aggiornando i loro sistemi di pagamento con chiavi sempre più lunghe.

Date le vulnerabilità di DES per un attacco a forza bruta, c’è stato un considerevole interesse

a trovare un’alternativa. Per preservare l’investimento che era stato fatto fino a quel momento in

apparecchiature specifiche in grado di utilizzare l’algortimo in questione, si è pensato di ricorrere

alla crittografia multipla con DES.

3.5.4 Doppio DES

L’esempio più semplice di crittografia multipla con DES è il Doppio DES. Nacque l’idea di pro-

gettare un cifrario a blocchi alternativo al DES singolo: si è pensato, infatti, di cifrare due volte

il messaggio in chiaro con due chiavi diverse (una per ogni passo di cifratura). Il cifrario a bloc-

chi che si ottiene apportando tali modifiche al DES originario, viene quindi definito Doppio DES.

Cifratura Doppio DES

Il Doppio DES prevede due fasi di cifratura del plaintext, utilizzando due chiavi diverse.

Dato il plaintext P e 2 chiavi K e K a 56 bit:

1 2

• prima cifriamo P con la chiave K , ottendo un pre-output X;

1

• poi cifriamo X con la chiave K , ottenendo il ciphertext C;

2

Quindi, il testo cifrato viene generato cosı̀ come segue:

C = E(K , E(K , P ))

2 1

Figura 14: Cifratura con Doppio DES

30

Decifratura Doppio DES

La decifratura è analoga alla cifratura, ma richiede che le chiavi siano applicate nell’ordine inverso.

In particolare, dato il ciphertext C e le 2 chiavi utilizzate in precedenza per la cifratura, K e K ,

1 2

a 56 bit:

• prima decifriamo C con la chiave K , ottenendo il pre-output X;

2

• poi decifriamo X con la chiave K , ottenendo il plaintext P ;

1

Quindi, il testo in chiaro viene generato cosı̀ come segue:

P = E(K , E(K , C))

1 2

Figura 15: Decifratura con Doppio DES

Cifrare due volte con chiavi diverse, rende il DES effettivamente sicuro?

NO! Sebbene qualcuno potrebbe pensare che l’utilizzo di due chiavi a 56 bit crei una robustezza

pari all’utilizzo di una chiave a 112 bit, questo non è cosı̀! In genere, questo schema, presenterebbe

una robustezza pari all’utilizzo di una chiave a 57 bit. Uno schema di questo tipo è comunque

vulnerabile ad un attacco di tipo ”meet-in-the-middle”.

Meet-in-the-middle

L’attacco meet-in-the-middle è un attacco crittografico.

Assumendo che l’attaccante conosca una serie di plaintext P e ciphertext C, abbiamo che :

C = E(K , E(K , P ))

2 1

dove E è la funzione di cifratura e K e K sono le due chiavi.

1 2 56

Dati una serie di P , l’attaccante li cifra con tutte le 2 K chiavi possibili e ne memorizza i

1 56

corrispondenti C in una tabella. Dati una serie di C, l’attaccante li decifra con tutte le 2

K chiavi possibili, cercando valori di P già presenti nella tabella. Per ogni corrispondenza, si

2

provano le relative chiavi K e K su un’altra coppia (P , C ) per vedere se sono corrette. Se c’è

1 2 i i

corrispondenza anche con l’altra coppia allora l’attacco è riuscito e l’attaccante ha scoperto le

due chiavi.

Vogliamo comunque indicare al lettore che l’attacco ”meet-in-the-middle” è un problema

che riguarda anche altri cifrari a blocchi e non solo il DES in particolare.

31

3.5.5 TDES o Triple-DES

La soluzione definitiva arriva quando si pensa di eseguire una cifratura ripetendo 3 volte le ope-

razioni del DES: nasce cosı̀ il TDES o Triple-DES Il controtacco più ovvio per l’attacco meet-

in-the-middle è quello di utilizzare tre fasi di cifratura con tre chiavi diverse. Questo, solleva il

costo dell’attacco meet-in-the-middle, rendendolo inutilizzabile. Tuttavia, questa nuovo metodo,

·

ha l’inconveniente di richiedere una lunghezza di chiave di 56 3 = 168 bit, rendendola alquanto

ingombrante.

TDES a due chiavi

Per ovviare a questo inconveniente, Tuchman, ha proposto un metodo di crittografia tripla che

utilizza solo due chiavi. L’alternativa da lui proposta utilizza una sequenza di:

• cifratura-decifratura-cifratura (EDE) per la criptazione del plaintext;

• decifratura-cifratura-decifratura (DED) per la decriptazione del ciphertext;

Le espressioni matematiche che spiegano le due sequenze sono:

−→

Codifica C = E(K , D(K , E(K , P )))

1 2 1

Figura 16: Codifica con Tiple-DES a 2 chiavi

−→

Decodifica P = D(K , E(K , D(K , C)))

1 2 1

Figura 17: Decodifica con Tiple-DES a 2 chiavi

TDES con due chiavi è un’alternativa al DES molto utilizzata, poiché non ci sono attacchi di

crittoanalisi efficaci. Vale la pena però, (se siete interessati), dare un’occhiata alle diverse idee di

attacco proposte per ”bucare” il Triple-DES. Pur non essendo praticabili, questi possono venir

presi in considerazione per costruire futuri attacchi di successo.

32

TDES a tre chiavi

Anche se quindi il TDES con due chiavi è piuttosto sicuro, poiche gli attacchi ideati appaiono

impraticabili, chiunque utilizzi questo tipo di algoritmo potrebbe sentire qualche preoccupazione.

Pertanto, per essere sicuri di non incappare in problematiche, molti persone utilizzano il Triple

DES a tre chiavi distinte. −→

Codifica C = E(K , D(K , E(K , P )))

3 2 1

Figura 18: Codifica con Tiple-DES a 3 chiavi

−→

Decodifica P = D(K , E(K , D(K , C)))

1 2 3

Figura 19: Decodifica con Tiple-DES a 3 chiavi

33

3.6 AES: Advanced Encryption System

Il 2 gennaio 1997 il National Institute of Standards and Technology (NIST) lanciò un concorso

per un nuovo cifrario simmetrico (a chiave segreta) denominato Advanced Encryption System

che potesse prendere il posto del DES e avesse una sicurezza almeno pari al Triplo DES. Dopo

aver esaminato molti cifrari proposti da crittologi di tutto il mondo, il 2 ottobre del 2000 il NIST

annunciò di aver scelto il cifrario Rijndael progettato da due crittologi belgi Daemen e Rijmen.

Nacque cosı̀ nel 2001 l’AES, un nuovo standard di cifratura il quale è una specifica implementa-

zione del cifrario Rijndael. Data la sua sicurezza e le sue specifiche pubbliche si presume che in

un prossimo futuro venga utilizzato in tutto il mondo come è successo al suo predecessore, il DES,

che ha poi perso efficacia per vulnerabilità intrinseche.

Formalmente AES non è equivalente al Rijndael (sebbene nella pratica siano intercambiabili)

dato che il Rijndael gestisce differenti dimensioni di blocchi e di chiavi. L’AES specifica che il

blocco ha dimensione fissa a 128 bit e la lunghezza della chiave può essere di 128, 192 o 256 bit,

mentre il Rijndael specifica solo che il blocco e la chiave devono essere un multiplo di 32 bit con

un minimo di 128 bit e un massimo di 256 bit. A seconda della lunghezza della chiave utilizza,

l’algoritmo prende il nome di AES-128, AES-192 o AES-256.

Figura 20: Processo di crittazione con AES

34

Possiamo osservare lo schema di funzionamento dell’AES in Figura 20. Abbiamo detto che l’input

per gli algoritmi di crittografia e decrittografia AES è un singolo blocco di 128 bit. Ogni blocco è

×

diviso in 16 bytes da 8 bit, che dobbiamo immaginare disposti su una matrice 4 4.

×

AES opera utilizzando matrici di 4 4 byte, chiamate Stati (States). Il blocco di input viene

quindi copiato nella matrice Stato, per poi essere modificato ad ogni passo in fase di crittografia o

decrittografia. Al termine dell’esecuzione, la matrice Stato viene copiata su una matrice di uscita.

Figura 21: Input, Matrice Stato, Output

Allo stesso modo, la chiave è raffigurata come una matrice quadrata di byte. Quest’ultima è poi

espansa in una serie di word. Ogni word è di quattro byte e l’espansione di una chiave a 128 bit

è di 44 word. Figura 22: Chiave, Espansione della Chiave

Si noti che l’ordinamento di byte all’interno di una matrice è colonnare. Cioè, ad esempio, i primi

quattro byte del plaintext in input a 128 bit, occupano la prima colonna della matrice, i secondi

quattro byte occupano la seconda colonna, e cosı̀ via. Allo stesso modo, i primi quattro byte della

chiave espansa, che formano una word, occupano la prima colonna della matrice.

Il cifrario AES è costituito da N Round. Il numero di Round dipende dalla lunghezza della chiave:

• 10 Round per una chiave a 128 bit (16 Byte)

• 12 Round per una chiave a 192 bit (24 Byte)

• 14 Round per una chiave a 256 bit (32 Byte)

35

I primi N 1 Round sono composti da quattro distinte funzioni di trasformazione:

• •

SubBytes MixColumns

• •

ShiftRows AddRoundKey

Va detto inoltre, che l’ultimo Round consiste soltanto di tre funzioni di trasformazione (non viene

effettuata la MixColumns), e c’è una singola funzione di trasformazione iniziale (AddRoundKey)

prima del primo Round, che possiamo considerare Round 0. Ogni funzione di trasformazione

× ×

richiede una o più matrici 4 4 come input e produce una matrice 4 4 come output. La Figura

×

21 mostra che l’output di ciascun Round è una matrice 4 4, mentre l’output del Round finale

è il blocco di ciphertext. Infine, dobbiamo dire che la funzione di espansione della chiave genera

×

N + 1 Round Key, ognuna delle quali è una distinta matrice 4 4. Ogni Round Key è un input

per la funzione di trasformazione AddRoundKey contenuta in ogni round.

3.6.1 Sruttura dettagliata dell’AES

La Figura 23 mostra il cifrario AES più in dettaglio, indicando la sequenza in cui avvengono

le trasformazioni in ogni Round. Mostra sia il funzionamento dell’algortimo durante la fase di

crittazione del blocco di testo in chiaro e sia il funzionamento dell’algortimo durante la fase di

decrittazione del blocco di testo cifrato.

Figura 23: AES: Codifica e Decodifica

36

Prima di addentrarci nei dettagli di funzionamento dell’algoritmo, potremo fare diverse osserva-

zioni circa la struttura generale dell’AES. Vediamole:

1. Una caratteristica degna di nota di questa struttura è che non è una struttura Feistel. Nella

classica struttura di Feistel, la metà del blocco dati viene utilizzata per modificare l’altra

metà del blocco dati e successivamente le due metà vengono scambiate. AES elabora invece

l’intero blocco dati come una matrice durante ogni turno usando sostituzioni e permutazione.

2. La chiave che viene fornita come input viene espansa in un array unidimensionale di 44

word. Ogni word, indicata con è di 4 byte ossia 32 bit. Quattro word distinte vengono

w[i],

utilizzate come Round Key ad ogni Round. Esempio mostrato nella Figura 22.

3. Sono utilizzate quattro diverse funzioni di trasformazione (1 permutazione e 3 sostituzioni):

• SubBytes = usa una S-Box per effettuare la sostituzione per ogni byte del blocco

• ShiftRows = esegue una semplice permutazione per spostare i byte dalle loro posizioni

• MixColumns = esegue una sostituzione dei byte attraverso un’operazione lineare

• AddRoundKey = un semplice XOR bit a bit del blocco corrente con una RoundKey

4. La struttura è abbastanza semplice. Per entrambi gli algoritmi (crittografia e decrittografia),

il cifrario inizia con la funzione di trasformazione AddRoundKey, seguita poi da nove Round

contenenti tutte e quattro le funzioni di trasformazione, ed infine dal decimo Round che

contiene solamente tre delle funzioni di trasformazione (non viene effettuata la MixColumns).

5. Soltanto la funzione AddRoundKey fa uso della chiave. La funzione non è quindi reversibile

senza conoscere la chiave. Per questo motivo il cifrario inizia e finisce con una funzione

AddRoundKey. Qualsiasi altra funzione sarebbe reversibile.

6. Le altre funzioni di trasformazione, eseguite insieme, forniscono la confusione, la diffusione,

e la non linearità, ma di per sé non sarebbero in grado di fornire alcuna sicurezza poiché

non utilizzano nessuna chiave. Possiamo vedere il cifrario come l’alternanza di operazione

di cifratura attraverso lo XOR e rimescolamento del blocco.

La funzione AddRoundKey esegue la cifratura attraverso l’operazione di XOR e le altre tre

funzioni (SubBytes, ShiftRows, MixColumns) eseguono il rimescolamento del blocco.

Questo schema è efficiente ed estremamente sicuro.

7. Ogni funzione è facilmente reversibile. Per quanto riguarda SubBytes, ShiftRows e MixCo-

lumns, le loro funzioni inverse vengono impiegate nell’algoritmo di decodifica. Per la fase

AddRoundKey, l’inverso si ottiene eseguendo l’operazione di XOR con la stessa RoundKey.

−→ ⊕ ⊕

Esempio in cui A è il blocco e B la chiave A B B = A

8. Come con la maggior parte dei cifrari a blocchi, l’algoritmo di decrittazione fa uso della

chiave espansa nell’ordine inverso. Tuttavia, l’algoritmo di decrittazione non è identico a

quallo di crittazione. Questa è una conseguenza della struttura particolare di AES.

9. Una volta stabilito che tutte le quattro funzioni di trasformazione sono reversibili, è facile

verificare che la decrittografia è in grado di recuperare il plaintext. La Figura 23 delinea che

crittografia e decrittografia vanno in direzioni verticali opposte.

10. La Round finale di entrambi gli algoritmi (cifratura e decifratura) è costituito da soli tre

funzioni. Questo è una conseguenza della struttura particolare di AES ed è necessaria per

rendere reversibile il cifrario. 37

3.7 Modalità di funzionamento

Nella pratica, il modo in cui si utilizza un algoritmo di crittografia è spesso più importante della

sua scelta. Le modalità di funzionamento dei cifrari a blocchi sono state definite inizialmente

dal NIST (National Institute of Standards and Technology) nel documento intitolato ”DES modes

of operation”, affinché l’algoritmo di cifratura DES potesse essere applicato ad una varietà di

situazioni differenti. Queste modalità cercano dunque di considerare tutte le possibili applicazioni

della crittografia per cui può essere utilizzato l’algoritmo DES. Inoltre, va detto, che queste mo-

dalità possono essere utilizzate con qualsiasi algoritmo di cifratura simmetrica a blocchi: DES,

AES, e cosı̀ via. Le modalità standard di funzionamento per l’utilizzo di un cifrario a blocchi sono

5 e le analizzeremo nei successivi paragrafi ipotizzando di applicarle su DES.

3.7.1 Electronic Code Book (ECB)

La modalità di funzionamento più semplice è l’Elettronic Code Book (BCE), in cui il plaintext

viene suddiviso in blocchi di 64 bit e questi vengono gestiti uno alla volta. Se nell’ultimo blocco

vi sono meno di 64 bit, viene aggiuno il padding, o in italiano, il riempimento. Ogni blocco

è cifrato utilizzando la stessa chiave di cifratura. La decodifica avviene allo stesso modo: viene

eseguita un blocco alla volta, utilizzando sempre la stessa chiave. Viene utilizzato il termine Code

Book poiché, data una determinata chiave, esiste un unico ciphertext per ogni blocco del plaintext

e viceversa. Pertanto possiamo immaginare un grandissimo codebook in cui vi è una voce per ogni

blocco di 64 bit del plaintext, che mostra il corrispettivo ciphertext.

Figura 24: Elettronic Code Book (ECB)

Osserviamo la Figura 24:

• il plaintext consiste in una sequenza di blocchi a 64 bit denotati con P , P , . . . , P ;

1 2 N

• il ciphertext consiste in una sequenza di blocchi a 64 bit denotati con C , C , . . . , C ;

1 2 N

38

Possiamo quindi definire la modalità ECB cosı̀ come segue:

−→

Codifica C = DES (P ) oppure C = E(K, P )

i K i i i

−→

Decodifica P = DES (C ) oppure P = D(K, C )

i K i i i

Abbiamo detto in precedenza che per ogni blocco di plaintext, cifrato con una certa chiave, esiste

un unico blocco di ciphertext. Questo significa che se due blocchi di plaintext sono uguali, allora

avremo due blocchi ci ciphertext esattamente identici. Infatti, se il messaggio è altamente strut-

turato, può essere possibile per un crittanalista sfruttare queste regolarità. Per esempio, se è noto

che il messaggio inizia sempre con alcuni campi predefiniti, allora l’attaccante può avere un certo

numero di coppie note di testo in chiaro-testo cifrato su cui lavorare. Pertanto questa tecnica va

utilizzata soltanto quando si deve inviare un messaggio che, una volta scomposto, presenta un

numero piuttosto basso di blocchi (max 10-15 blocchi). Un modo appropriato nell’utilizzare ECB,

potrebbe essere la trasmissione di una chiave di cifratura.

Che succede se, una volta inviato, C subisce un errore in fase di trasmissione?

3

La risposta è semplice e risalta un grande vantaggio della modalità ECB. Quando un blocco arriva

a destinazione e ci accorgiamo che è corrotto, non dobbiamo preoccuparci del fatto che questo

errore possa averne generati degli altri nei precedenti o successivi blocchi ricevuti, poiché, come

abbiamo visto fin ora, ogni blocco è indipendente dall’altro. Questo è un importante vantaggio di

ECB, visto che gli errori sono localizzati e non distribuiti.

Pro:

1. La cifratura in modalità ECB è parallelizzabile

2. Gli errori rimangono localizzati, quindi non si ha propagazione di errore su diversi blocchi

Contro:

1. Possibilità di utilizzo limitate

2. È una modalità debole e facilmente attaccabile visto che ci possono essere blocchi identici

39

3.7.2 Cipher Block Chaining (CBC)

Per superare i limiti di sicurezza di ECB, è necessario l’utilizzo di una tecnica in cui lo stesso blocco

di testo in chiaro, se ripetuto, produce blocchi di testo cifrato differenti. Questo è ciò che accade

con la modalità Cipher Block Chaining (CBC), in cui l’input dell’algoritmo di crittografia è il

risultato dello XOR tra il blocco di testo in chiaro corrente e il blocco di testo cifrato precedente;

per ciascun blocco viene utilizzata la stessa chiave. In fase di decifratura, ciascun blocco di testo

cifrato passa attraverso l’algoritmo di decrittografia; il risultato subisce uno XOR con il blocco di

testo cifrato precedente, per produrre il blocco di testo in chiaro.

Figura 25: Cipher Block Chaining (CBC)

Osserviamo la Figura 25:

• il plaintext consiste in una sequenza di blocchi a 64 bit denotati con P , P , . . . , P ;

1 2 N

• il ciphertext consiste in una sequenza di blocchi a 64 bit denotati con C , C , . . . , C ;

1 2 N

Possiamo quindi definire la modalità CBC cosı̀ come segue:

−→ ⊕ ⊕

Codifica C = DES (P C ) oppure C = E(K, [P C ])

i K i i−1 i i i−1

−→ ⊕ ⊕

Decodifica P = DES (C ) C oppure P = D(K, C ) C

i K i i−1 i i i−1

Per produrre il primo blocco di testo cifrato, viene utilizzato un vettore di inizializzazione IV.

Quindi in fase di codifica viene eseguito uno XOR tra IV e il primo blocco di testo in chiaro.

In decodifica, invece, l’IV subisce uno XOR con l’output dell’algoritmo di decrittografia in modo

da ottenere nuovamente il primo blocco di testo in chiaro. Il vettore di inizializzazione IV deve

essere dunque noto non solo al mittente ma anche al destinatario, che tipicamente lo riceve assieme

alla chiave; entrambi i valori vengono crittati in modalità ECB.

40

Quindi, per quanto riguarda il primo blocco, le formule saranno:

−→ ⊕ ⊕

Codifica Primo Blocco C = DES (P IV ) oppure C = E(K, [P IV ])

1 K 1 1 1

−→ ⊕ ⊕

Decodifica Primo Blocco P = DES (C ) IV oppure P = D(K, C ) IV

1 K 1 1 1

Abbiamo affermato in precedenza che la cifratura di ciascun blocco dipende dal precedente. Se ad

o o

esempio il 4 e il 5 blocco sono identici, questa modalità produrrà un C e un C diversi, poiché

4 5

seppur sono perfettamente identici appaiono in due posizioni differenti e la loro cifratura dipende

da tutti i blocchi precedenti. È una tecnica utilizzata per cifrature di massa e, come vedremo

più avanti, per l’autenticazione. Dobbiamo far notare che anche qui se i blocchi non rispettano la

dimensione stabilita, va aggiunta un’imbottitura.

Che succede se viene a crearsi un errore nel blocco C ?

3

La risposta è semplice e può essere vista come uno svantaggio della modalità CBC. Quando un

blocco subisce un errore, bisogna cercare di rilevarlo il prima possibile. Questo perché ogni blocco

genera poi i successivi e se l’errore non viene rilevato e corretto, si propagherà per tutta la restante

cifratura del plaintext originale. Sono immuni soltanto i blocchi precedenti.

Pro:

1. È una modalità appropriata per crittare i messaggi con tanti bit

2. Non vi possono essere due blocchi di testo cifrato identici

Contro:

1. La cifratura in modalità CBC non è parallelizzabile

2. Gli errori si propagano visto che ogni blocco viene cifrato grazie al precendente

41

Per qualsiasi cifrario a blocchi, la crittografia è eseguita su un blocco di bit b. Nel caso di DES,

b = 64. Tuttavia, è possibile convertire un cifrario a blocchi in un cifrario a flusso, utilizzando

uno dei tre modi che vedremo a breve: la modalità Cipher Feedback (CFB), la modalità Output

FeedBack (OFB) e la modalità Counter (CTR).

3.7.3 Cipher FeedBack (CFB)

La modalità Cipher FeedBack (CFB) è stata ideata per convertire idealmente una cifratu-

ra a blocchi in una cifratura a flusso. La cifratura a flusso, a differenza di quella a blocchi, non

necessita di eseguire riempimenti per avere un numero preciso di bit ed inoltre opera in tempo reale.

Nell’operazione di cifratura, l’input della funzione di crittografia è un registro a scorrimento a

64 bit che inizialmente viene impostato con un vettore di inizializzazione IV. Successivamente

il contenuto del registro, viene cifrato con DES. L’output che ne esce, viene dato in pasto ad un’o-

perazione di XOR con il primo segmento di testo in chiaro P . Il risultato di questa operazione è

1

la prima unità di testo cifrato C .

1

Durante l’operazione di XOR non è fondamentale che il segmento di testo in chiaro sia effet-

tivamente di 64 bit. Se P è di 48 bit io posso cifrarlo lo stesso. Quello che però creo, sarà un

1

blocco cifrato di 48 bit soltanto. A questo punto dovrebbe sorgere la seguente domanda: al passo

successivo, come faccio a passare questo blocco al DES se egli ha bisogno di 64 bit? Semplice!

Invece di aggiungere i valori per l’imbottitura, poiché bisognerebbe comunicarli al destinatario,

utilizzo parte di quello che avevo prima: inserisco in coda al registro i 48 bit che ho ottenuto dalla

cifratura di P e traslo verso sinistra il contenuto del registro. Cosı̀ facendo ne ottengo di nuovo 64

1

al quale posso applicare DES senza problemi. In poche parole utilizzo quello che prima si trovata

nel registro e quello che ho appena generato. Il processo viene reiterato fino all’esaurimento di

tutte le unità di testo in chiaro.

Figura 26: Cipher FeedBack (CFB)

42

Prima di procedere col parlare dell’atto di decifratura, osserviamo: la cifratura vista nelle moda-

lità precedenti era esterna, ossia si faceva l’OR esclusivo tra il blocco cifrato in precedenza (C )

i−1

e il blocco da cifrare (P ), per poi applicare l’algoritmo di cifratura a quel che ne veniva fuori.

1

Adesso P è stato portato fuori dalla cifratura. Quindi in questo caso l’operazione che effettiva-

i

mente effettua la codifica è lo XOR. Quel che è a destra dell’operazione serve soltanto per creare

la chiave con la quale calcolare l’OR esclusivo.

Se la cifratura è effettivamente fatta attraverso lo XOR, dobbiamo utilizzare la sua operazio-

ne inversa per decifrare. Ma l’operazione inversa dello XOR è se stessa. Pertanto la decifratura

avviene utilizzando lo stesso schema della cifratura, tranne che nell’operazione di XOR le entrate

sono l’unita di testo cifrato che si vuole decodificare e l’output della funzione di cifratura che ha

avuto come input il registro contenente parte di bit del testo cifrato precedente. Ad esempio:

se voglio decodificare C devo fare l’operazione inversa della cifratura che in questo caso è l’OR

3

esclusivo. Prendo C , ne calcolo l’OR esclusivo con la cifratura di C ed ottengo P .

3 2 3

Osserviamo la Figura 26:

• il plaintext consiste in una sequenza di blocchi a 64 bit denotati con P , P , . . . , P ;

1 2 N

• il ciphertext consiste in una sequenza di blocchi a 64 bit denotati con C , C , . . . , C ;

1 2 N

Possiamo quindi definire la modalità CFB cosı̀ come segue:

−→ ⊕ ⊕

Codifica C = P DES (C ) oppure C = P E(K, C )

i i K i−1 i i i−1

−→ ⊕ ⊕

Decodifica P = C DES (C ) oppure P = C E(K, C )

i i K i−1 i i i−1

Tale tecnica viene chiamata Cipher FeedBack poiché quel che si ottiene è un Feedback per la

fase successiva. Viene utilizzata per criptare un flusso di dati e, come vedremo più avanti, per

l’autenticazione.

Pro:

1. Permette la cifratura anche con una più piccola dimensione dei blocchi

2. Non vi possono essere due blocchi di testo cifrato identici

Contro:

1. La cifratura in modalità CFB non è parallelizzabile

2. Gli errori si propagano visto che ogni blocco viene cifrato grazie al precendente

43

3.7.4 Output FeedBack (OFB)

La modalità Output FeedBack (OFB) è anch’essa utilizzata per convertire idealmente una ci-

fratura a blocchi in una cifratura a flusso. La struttura della modalità OFB è molto simile a quella

della modalità CFB ed ora capiremo il perché.

In questa modalità, l’operazione di cifratura consiste nel cifrare ripetutamente con DES un valore

iniziale e utilizzare questi valori codificati come chiavi nell’operazione di XOR con i vari blocchi di

plaintext da cifrare. Analizzandola più nel dettaglio, vediamo che si parte anche qui da un vettore

d’inizializzazione IV che deve essere unico per ogni operazione di crittografia. Si prende questo

IV, vi si applica DES una prima volta e si ottengono dei nuovi 64 bit che chiameremo pre-output

ed indicheremo con O . Successivamente si utilizzano questi nuovi 64 bit per fare l’OR esclusivo

1

con il primo blocco di plaintext P , ottendendo come risultato il primo blocco di ciphertext C .

1 1

Una volta terminata la codifica del primo blocco si passa al successivo. Si prendono i 64 bit di O ,

1

vi si applica nuovamente il DES e si ottengono altri 64 bit indicati con O . Tale operazione è la

2

stessa identica cosa di applicare due volte DES all’IV. Questi nuovi 64 bit li utilizzo per fare l’OR

esclusivo con il secondo blocco di plaintext P , ottenendo come risultato il secondo blocco di cipher-

2

text C . Il procedimento funziona allo stesso modo per tutti gli altri blocchi di plaintext rimanenti.

2

Torniamo a parlare del nostro IV. Abbiamo detto che deve essere sempre diverso per ogni ope-

razione di cifratura. Questo perché i diversi pre-output che ne escono cifrando il vettore di ini-

zializzazione varie volte con DES, O , dipendono soltanto dalla chiave K e dall’IV. Ovviamente

i

se IV e K rimangono sempre uguali, la sequenza di O sarà sempre la stessa. In questo modo un

i

attaccante può risalire facilmente al valore di O utilizzato per crittografare un messaggio.

i

Figura 27: Output FeedBack (CFB)

Anche qui, la vera e propria operazione di cifratura del blocco di plaintext non è l’applicazione

dell’algoritmo DES, ma l’operazione di XOR. 44

Se la cifratura è effettivamente fatta attraverso lo XOR, dobbiamo utilizzare la sua operazio-

ne inversa per decifrare. Ma l’operazione inversa dello XOR è se stessa. Pertanto la decifratura

avviene utilizzando lo stesso schema della cifratura, tranne che nell’operazione di XOR le entrate

sono l’unita di testo cifrato che si vuole decodificare, ossia C , e l’output della funzione di cifratura,

i

ossia O , che ha avuto come input O . Ad esempio: se voglio decodificare C devo fare l’ope-

i i−1 3

razione inversa della cifratura che in questo caso è l’OR esclusivo. Dapprima calcolo la cifratura

di O , ottendo O . Successivamente applico la funzione di OR esclusivo tra C ed O ottenendo P .

2 3 3 3 3

Un importante aspetto della modalità OFB è che se mittente e ricevente non sono sincroniz-

o

zati la cosa non funziona. Cioè il destinatario deve sapere che gli sta arrivando il 5 blocco perché

per decifrarlo poi dovrà fare l’operazione di XOR con ciò che ne esce dall’applicazione del DES 5

volte sull’IV, ossia ciò che noi indichiamo con O . Inoltre è una tenica che evita la propagazione

5

degli errori nei vari blocchi visto che ogni blocco è indipendente dagli altri e permette di paralle-

lizzare l’esecuzione.

Osserviamo la Figura 27:

• il plaintext consiste in una sequenza di blocchi a 64 bit denotati con P , P , . . . , P ;

1 2 N

• il ciphertext consiste in una sequenza di blocchi a 64 bit denotati con C , C , . . . , C ;

1 2 N

• il pre-output consiste in uno stream di 64 bit denotato con O , O , . . . , O ;

1 2 N

Possiamo quindi definire la modalità OFB cosı̀ come segue:

−→ ⊕ ⊕

Codifica C = P DES (O ) oppure C = P E(K, O )

i i K i−1 i i i−1

−→ ⊕ ⊕

Decodifica P = C DES (O ) oppure P = C E(K, O )

i i K i−1 i i i−1

Tale tecnica viene utilizzata per criptare un flusso di dati su canali rumorosi.

Pro:

1. Non vi possono essere due blocchi di testo cifrato identici

2. Gli errori non si propagano visto che ogni blocco è indipendente dagli altri

Contro:

1. Mittente e ricevente devono essere sincronizzati

2. Non si può riutilizzare lo stesso IV 45

3.7.5 Counter (CTR)

La modalità Counter (CTR), come le ultime due, è anch’essa utilizzata per convertire idealmen-

te una cifratura a blocchi in una cifratura a flusso. Questa quinta modalità è stata introdotta

successivamente alle altre quattro ed è stata applicata in IPsec (IP security). La struttura della

modalità CTR è praticamente identica a quella della modalità OFB. L’unica differenza è che la

prima utilizza un valore iniziale che viene incrementato ad ogni iterazione, quindi un Contatore,

mentre la seconda utilizza un vettore d’inizializzazione cifrato varie volte.

In questa modalità viene utilizzato un Contatore con la stessa dimensione del blocco di plain-

text. Il requisito essenziale è che il suo valore sia differente per ciascun blocco da cifrare; in genere

viene inizializzato con un determinato valore e poi incrementato di un’unità per ogni blocco suc-

{Counter −

cessivo: + 0, Counter + 1, Counter + 2, . . . , Counter + N 1}.

Innanzitutto, nella fase di cifratura, il Contatore viene crittografato utilizzando la chiave K.

L’output che ne esce verrà utilizzato per eseguire l’operazione di XOR col blocco di plaintext P ,

i

producendo come risultato il blocco di ciphertext C .

i

Figura 28: Counter (CTR)

Anche qui, la vera e propria operazione di cifratura del blocco di plaintext non è l’applicazione

dell’algoritmo DES, ma l’operazione di XOR.

Se la cifratura è effettivamente fatta attraverso lo XOR, dobbiamo utilizzare la sua operazio-

ne inversa per decifrare. Ma l’operazione inversa dello XOR è se stessa. Pertanto la decifratura

avviene utilizzando lo stesso schema della cifratura, tranne che nell’operazione di XOR dove le

entrate sono l’unita di testo cifrato che si vuole decodificare, ossia C , e l’output della funzione

i

di cifratura che ha avuto come input Counter + i. Ad esempio: se voglio decodificare C devo

3

fare l’operazione inversa della cifratura che in questo caso è l’OR esclusivo. Dapprima calcolo la

cifratura di Counter + 3 e successivamente applico la funzione di OR esclusivo tra il risultato di

questa cifratura e il blocco di ciphertext che voglio decodificare. Il risultato sarà il blocco P 3

46

Un importante aspetto della modalità CTR è che se il mittente cifra un blocco con un certo valore

del Countatore, allora il ricevente deve usare lo stesso valore per decifrarlo. Ad esempio, se il

mittente cifra il blocco P utilizzando il valore Counter + 2, allo stesso modo il destinatario dovrà

3

riutilizzare lo stesso valore Counter + 2 per ottenere il blocco P . Inoltre CTR è sia una tenica

3

che evita la propagazione degli errori nei vari blocchi, visto che ogni blocco è indipendente dagli

altri, e sia un tecnica che permette di parallelizzare l’esecuzione. Va detto che a differenza della

ECB, CBC e CFB, qui non abbiamo bisogno di usare padding vista la struttura di funzionamento.

Osserviamo la Figura 28:

• il plaintext consiste in una sequenza di blocchi a 64 bit denotati con P , P , . . . , P ;

1 2 N

• il ciphertext consiste in una sequenza di blocchi a 64 bit denotati con C , C , . . . , C ;

1 2 N

Possiamo quindi definire la modalità CTR cosı̀ come segue:

−→ ⊕ ⊕

Codifica C = P DES (Counter + i) oppure C = P E(K, Counter + i)

i i K i i

−→ ⊕ ⊕

Decodifica P = C DES (Counter + i) oppure P = C E(K, Counter + i)

i i K i i

Tale tecnica viene utilizzata per criptare dati su reti ad alta velocità.

Pro:

1. La cifratura in modalita CTR è facilmente parallelizzazione

2. Non vi possono essere due blocchi di testo cifrato identici

3. Gli errori non si propagano visto che ogni blocco è indipendente dagli altri

4. Particolarmente adatta a situazioni dove la velocità è essenziale

Contro:

1. Mittente e ricevente devono essere sincronizzati

2. Non si può riutilizzare lo stesso valore del Contatore per più di un blocco

47

3.7.6 Considerazioni finali

Come è stato detto in precedenza queste modalità possono essere utilizzate da qualsiasi cifrario

a blocchi, siano essi a chiave simmetrica e siano essi a chiave asimmetrica. Non è detto che per

tutti i cifrari a blocchi queste modalità sono sicure, ma possono essere comunque utilizzate.

Per alcuni ha senso usarle per altri invece no!

Nelle ultime tre modalità abbiamo utilizzato il cifrario a blocchi per generare la sequenza con

la quale cifrare un carattere alla volta del plaintext, quindi quelli che abbiamo visto assomiglia-

vano più a dei cifrari a stream, dove lo stream (ossia la sequenza) è stato generato utilizzando un

cifrario a blocchi. Quindi potete immaginare cifrari a stream come cifrari a blocchi di lunghezza 1.

È difficile progettare un cifrario a stream perchè quello che è indispensabile avere sono lunghe

sequenza di chiavi senza ripetizioni, visto che nel momento in cui la chiave si ripete l’attaccante

può riuscire ad estrarre alcune informazioni sul plaintext dal ciphertext.

o o

Supponiamo che il 5 blocco sia uguale al 10 . Se dovessi cifrare P e P utilizzando la stessa

5 10

chiave, nel momento in cui eseguo l’operazione di OR esclusivo tra C e C , cosa succede? L’o-

5 10

perazione di OR esclusivo mi cancella la chiave di cifratura utilizzata per i due plaintext e mi dà

come risultato l’OR esclusivo di P e P . Tali informazioni possono essere utilizzate per giungere

5 10

alla scoperta del messaggio orginale.

Qualche paragrafo più su abbiamo analizzato i pro e i contro dei cifrari a blocchi e quelli a

stream. Prima di continuare la trattazione vogliamo riassumerle. Nei stream ciphers, se viene a

crearsi un errore, allora questo sarà localizzato alla sola entità specifica che si sta cifrando. Nei

block ciphers invece, un errore avrà effetto sull’intero blocco. Inoltre per quanto riguarda i block

ciphers, questi sono più lenti poiché bisogna elaborare un intero blocco di plaintext per creare la

sua versione cifrata.

Dopo aver introtto DES e AES come block ciphers, nel prossimo capitolo parleremo più in partico-

lare in un famoso stream ciphers: RC4. Analizzeremo il suo funzionamento anche per comprendere

come effettivamente lavora uno stream ciphers. 48

3.8 RC4

In crittografia l’RC4 è uno tra i più famosi e diffusi algoritmi di cifratura a flusso a chiave sim-

metrica, utilizzato ampiamente in protocolli quali l’SSL ed il WEP. L’RC4 fu sviluppato da Ron

Rivest della RSA Security nel 1987: come in altri suoi algoritmi (vedi RC2, RC5 ed RC6) la sigla

RC sta per Rivest Cipher o, alternativamente, Ron’s Code. Per la sua semplicità e velocità, il suo

uso si diffuse speditamente e l’RC4 divenne ben presto l’algoritmo base di importanti protocolli

quali il WEP ed il WPA per la cifratura delle comunicazioni nelle schede wireless, e l’SSL ed il

TLS per la protezione dei dati delle connessioni internet e delle reti TCP/IP in genere.

È un algoritmo di cifratura a stream quindi è un algoritmo per generare una certa sequenza e

poi utilizzare questa per far criptare il messaggio. Dividiamo l’algortimo RC4 in due fasi:

• la prima fase, quella in cui viene generata la sequenza utilizzata poi per criptare;

• la seconda fase, quella in cui viene criptato il messaggio;

Prima Fase - Generazione della sequenza

Per generare la sequenza, si parte da un array di stato S di 256 elementi i cui valori sono i numeri

ordinati da 0 a 255 (ossia il primo elemento è S[0]=0,il secondo è S[1]=1, poi S[2]=2 e cosı̀ via fino

a S[255]=255). Questo è lo stato iniziale che indicheremo con S . Successivamente, la funzione

0

KSA (Key-Scheduling Algorithm), scambia ad ogni passo due elementi di questo vettore S.

La scelta degli elementi da scambiare si basa ovviamente su una chiave K fornita in input. Ogni

elemento di S viene scambiato con un altro e quindi si verificano 255 swap (scambio). Il vettore

dopo il primo swap lo chiameremo S , dopo il secondo swap lo chiameremo S e quindi dopo lo

1 2

swap finale lo chiameremo S . Gli scambi sono utilizzati per mescolare l’array S.

255

for i = 0 to 255 do

1 S [ i ]= i ;

2 j = 0;

3 for i = 0 to 255 do

4 j = ( j + S [ i ] + k [ i mod n ]) mod 256;

5 swap ( S [ i ] , S [ j ]);

6

Seconda Fase - Codifica del messaggio

A questo punto, una volta generata la sequenza, non resta che procedere con la codifica del

messaggio. Si prende l’array S (al suo stato finale) e si esegue l’operazione di OR esclusivo con

il messaggio da cifrare. Questo ovviamente non avviene in modo diretto! Si prende il messaggio

i-esimo, si calcolano i valori di i e j come mostrato dallo pseudocodice, si scambiano gli elementi

dell’array in posizione i e j, si calcola un valore t in base al contenuto delle locazioni i e j ed infine

si può procedere allo XOR tra il messaggio e il contenuto della locazione t dell’array.

i, j = 0

1 for each message byte M_i

2 i = ( i + 1) mod 256;

3 j = ( j + S [ i ]) mod 256;

4 swap ( S [ i ] , S [ j ]);

5 t = ( S [ i ] + S [ j ]) mod 256;

6 C_i = M_i XOR S [ t ]

7

49

3.9 Cifratura Asimmetrica

Abbiamo visto, qualche paragrafo più su, che quando Alice e Bob volevano comunicare avevo biso-

gno di accordarsi su una chiave segreta K. Tale chiave sarebbe stata poi utilizzata per codificare i

plaintext e decodificare i ciphertext. Questo tipo di approccio presenta due importanti problemi:

• Il primo è che il meccanismo richiede una chiave condivisa tra coppie di utenti. Se Bob

volesse comunicare con N persone allora avrebbe bisogno di N chiavi e si può benissimo

capire che questo non è accettabile quando dobbiamo comunicare con molte persone.

·

Se 10 utenti volessero comunicare tra loro avrebbero bisogno di (10 9)/2 = 45 chiavi.

·

Se 18 utenti volessero comunicare tra loro avrebbero bisogno di (18 17)/2 = 153 chiavi.

• Il secondo è che la comunicazione della chiave deve avvenire di nascosto e questo è molto

difficile in uno scenario in cui due utenti sono geograficamente distanti o non si conoscono.

Whitfield Diffie e Martin Hellman cercarono di affrontare due questioni:

• trovare un modo migliore per distribuire le chiavi;

• trovare un modo che garantisse che il messaggio è effettivamente stato spedito dal mittente;

Riuscirono soltanto ad elaborare il primo punto e nel 1976 proposero un meccanismo, non per di-

stribuire una chiave in maniera segreta, ma per far si che entrambe le parti riuscissero a calcolarsi

la chiave segreta. Questo ha dato poi origine alla nozione di chiave pubblica e privata, facendo

nascere la crittografia a chiave pubblica o anche detta crittografia asimmetrica.

La crittografia asimmetrica, conosciuta anche come crittografia a coppia di chiavi, crittografia

a chiave pubblica/privata o anche solo crittografia a chiave pubblica è un tipo di crittografia do-

ve ad ogni utente coinvolto nella comunicazione è associata una coppia di chiavi. Gli algoritmi

asimmetrici hanno un importante caratteristica.

È computazionalmente impossibile determinare la chiave di decrittazione conoscendo solo

l’algoritmo crittografico e la chiave di crittografia.

Uno schema di crittografia a chiave pubblica ha 6 componenti fondamentali:

−→

1. Plaintext M

È il messaggio originale che viene dato in input all’algoritmo.

−→

2. Chiave Privata e Chiave Pubblica KU e KR

Questa è la coppia di chiavi pubblica e privata. Se una è utilizzata per la codifica, l’altra

è usata per la decodifica. Le trasformazioni esatte eseguite dall’algoritmo dipendono dalla

chiave pubblica o da quella privata che viene fornita come input.

−→

3. Ciphertext C

Questo è il messaggio criptato prodotto come output.

Il ciphertext dipende sia dal plaintext e sia dalla chiave utilizzata.

Dato un certo messaggio, due chiavi diverse produrranno due ciphertext diversi.

−→

4. Algoritmo di Crittazione E

Esegue varie operazioni sul testo in chiaro.

−→

5. Algortimo di Decrittazione D

Questo è essenzialmente l’algoritmo di crittazione al contrario.

Prende in input il ciphertext e l’altra chiave, producendo in output il plaintext originale.

50

I passaggi essenziali sono i seguenti:

1. Ogni utente genera una coppia di chiavi usate per la crittografia e la decrittografia dei

messaggi.

2. Ogni utente inserisce una delle due chiavi in un registro pubblico ed automaticamente questa

diventa la chiave pubblica. La chiave restante diventa automaticamente la chiave pri-

vata. Come mostra la Figura 29, ogni utente mantiene una collezione di chiavi pubbliche

degli altri utenti.

3. Se Bob vuole inviare un messaggio segreto ad Alice, Bob lo codifica utilizzando la chiave

pubblica di Alice.

4. Quando Alice riceve il messaggio, lei può decifrarlo solo utilizzando la sua chiave privata.

Nessun altro destinatario può decifrare il messaggio, perché solo Alice conosce la chiave

privata di Alice.

Figura 29: Codifica e Decodifica con chiave pubblica e privata

51

La notazione che useremo per descrivere codifica e decodifica sarà:

• ←−

C = E(KU, M) oppure C = E (M) Codifica

KU

• ←−

M = D(KR, C) oppure M = D (C) Decodifica

KR

Riepilogo notazione

• −→ • −→

M Plaintext D Algoritmo di Decrittazione

• −→ • −→

C Ciphertext KU Chiave Pubblica

• −→ • −→

E Algoritmo di Crittazione KR Chiave Privata

Quando viene utilizzata in genere la crittografia a chiave pubblica e privata? Due possibili usi:

• Confidenzialità

1. A vuole mandare un messaggio a B

2. A cripta il messaggio con la chiave pubblica di B

3. A invia il messaggio cifrato a B

4. B decifra il messaggio con la propria chiave privata

• Autenticazione, Firma Digitale

1. A vuole inviare un messaggio a B in modo che B è sicuro che sia stato inviato da A

2. A cripta il messaggio con la sua chiave privata

3. A invia il messaggio cifrato a B

4. B decifra il messaggio con la chiave pubblica di A

5. B capisce che solo A può averglielo inviato

Requisiti di un sistema a chiave pubblica

• È computazionalmente facile:

1. generare una coppia di chiavi (pubblica e privata)

2. cifrare un messaggio data la chiave pubblica

3. decifrare un messaggio data la chiave privata

• È computazionalmente impossibile:

1. determinare la chiave privata conoscendo la chiave pubblica

2. recuperare il messaggio originale conoscendo ciphertext e chiave pubblica

Vennero proposti una serie di sistemi crittografici a chiave pubblica/privata, ma ad oggi soltanto

3 di questi sono sopravvissuti. Li analizzeremo nel dettaglio più avanti. Questi sono:

• • •

RSA El Gamal Curve Ellittiche

52

3.9.1 Scambio di chiavi Diffie-Hellman

Lo scambio di chiavi Diffie-Hellman (Diffie-Hellman key exchange) è un protocollo crittogra-

fico che consente a due entità di stabilire una chiave condivisa e segreta utilizzando un canale di

comunicazione insicuro (pubblico) senza la necessità che le due parti si siano scambiate informa-

zioni o si siano incontrate in precedenza. Lo schema del protocollo Diffie-Hellman fu pubblicato

per la prima volta nel 1976 nell’ambito di una collaborazione tra Whitfield Diffie e Martin Hellman.

L’idea di Diffie ed Hellman è piuttosto semplice. Quando Alice e Bob vogliono comunicare attra-

verso dei messaggi criptati, devono mettersi d’accordo su quale chiave utilizzare per la codifica e

la decodifica. Pertanto eseguono una serie di passaggi che permette loro di calcolare la chiave.

Prima di tutto devono accordarsi su due valori interi P e G tali che:

−1

P

• sono numeri primi di grandi dimensioni;

Sia P che 2

Siccome i calcoli vengono fatti in MOD P , più questo è grande e più è necessaria una lunga

ricerca esaustiva delle possibili soluzioni di determinate equazioni.

• G è una radice primitiva MOD P ; −1

È un valore con il quale posso generare tutti i valori da 0 a P utilizzando l’esponenziazione.

Il fatto che qualcuno possa venir a conoscenza di questi valori non cambia nulla.

Adesso sia Alice che Bob devono calcolarsi la loro chiave pubblica (pubA e pubB).

Alice sceglie un valore che utilizzerà come chiave privata (privA). Successivamente userà la sua

privA come esponente del valore G calcolato in MOD P per ottenere la sua chiave pubblica.

privA

pubA = G MOD P

Bob farà lo stesso procedimento di Alice. Sceglierà un valore segreto che utilizzerà come chiave

privata (privB). Successivamente userà la sua chiave privata come esponente del valore G calcolato

in MOD P per ottenere la sua chiave pubblica, ossia pubB.

privB

pubB = G MOD P

Le chiavi pubbliche delle due entità possono essere a conoscenza di chiunque, poiché anche vo-

lendo un attaccante per calcolare la chiave privata, impiegherebbe centinaia di anni! Se P è

sufficientemente grande (>1024 bit), è computazionalmente difficile calcolarsi l’esponente anche

conoscendo il risultato. Quindi è difficile calcolare la chiave privata a partire dalla chiave pubblica.

Arrivati a questo punto, se Alice vuole comunicare con Bob, prende la chiave pubblica di Bob

e utilizza la sua chiave privata come esponente. Il risultato del calcolo in MOD P darà un valore

K che Alice utilizzerà per comunicare con Bob.

A pubBprivA

K = MOD P

A

Al contrario, se Bob vuole comunicare con Alice, prende la sua chiave privata e la utilizza come

esponente della chiave pubblica di Alice. Il risultato del calcolo in MOD P darà un valore K che

B

Bob utilizzerà per comunicare con Alice. pubAprivB

K = MOD P

B

I valori K e K , se sono state rispettate le regole iniziali, sono identici!

A B 53

Questo valore verrà utilizzato per criptare i messaggi che devono scambiarsi Alice e Bob.

In questo modo il numero di chiavi è diminuito, visto che ognuno può avere una singola chiave

pubblica con la quale comunicare con tutti gli altri. La sicurezza di questo meccanismo si basa

sul problema del logaritmo discreto che ad oggi è un problema computazionalmente difficile.

Per comprendere meglio il funzionamento di quanto appena spiegato, facciamo un esempio.

1. Alice e Bob si accordano per usare P = 23 e G = 5

2. Alice sceglie come chiave privata privA = 6 e calcola la sua chiave pubblica:

privA 6

pubA = G MOD P =⇒ pubA = 5 MOD 23 =⇒ pubA = 8

3. Bob sceglie come chiave privata privB = 15 e calcola la sua chiave pubblica:

privB 15

pubB = G MOD P =⇒ pubB = 5 MOD 23 =⇒ pubB = 19

4. Alice calcola K per poi poter finalmente comunicare con Bob:

A

pubBprivA 6

K = MOD P =⇒ K = 19 MOD 23 =⇒ K = 2

A A A

5. Bob calcola K per poi poter finalmente comunicare con Alice:

B

pubAprivB 15

K = MOD P =⇒ K = 8 MOD 23 =⇒ K = 2

B B B

Come possiamo vedere K e K sono identici!

A B

Purtroppo però l’algoritmo per lo scambio di chiavi di Diffie ed Hellman è vulnerabile ad un at-

tacco che prende il nome di Man-in-the-middle (anche noto come Intruder-in-the-middle).

L’attacco Man-in-the-middle consiste nell’intromettersi in una comunicazione e far credere all’al-

tra entità di comunicare con quella originale, mentre invece non è cosı̀.

Pensiamo a quando Alice e Bob devono comunicare. Bob invia la propria chiave pubblica ad

Alice ed Alice invia la propria chiave pubblica a Bob. Un Malware potrebbe intercettare la chiave

pubblica di Alice e spedire invece la propria chiave pubblica a Bob. Quindi Bob riceverà una

chiave che pensa essere di Alice ma che in realtà è del Malware. Mal ovviamente ha la chiave

pubblica di Bob. Quando quest’ultimo utilizzerà la chiave pubblica che pensa essere di Alice per

calcolare la chiave condivisa, in realtà avrà calcolato la chiave condivisa con Mal e cosı̀ Mal potrà

leggere tutti i messaggi che vengono inviati da Bob per Alice. Allo stesso modo modo avviene con

Alice. Mal ha intercettato la chiave pubblica di Bob e ha spedito ad Alice la sua chiave pubblica.

Alice penserà di utilizzare la chiave pubblica di Bob e Bob penserà di utilizzare la chiave pubblica

di Alice. In realtà entrambi staranno utilizzando la chiave pubblica di Mal.

Figura 30: Man-in-the-middle

54

3.10 RSA

In crittografia la sigla RSA indica un algoritmo di crittografia asimmetrica, inventato nel 1977

da Ronald Rivest, Adi Shamir e Leonard Adleman utilizzabile per cifrare o firmare informazioni.

Lo schema RSA è un cifrario a blocchi in cui il plaintext e il ciphertext sono interi compresi

tra 0 e n 1, per qualche n. Una dimensione tipica di n è di 1024 bit, o 309 cifre decimali. In

questa sezione esamineremo RSA in dettaglio, partendo proprio dall’algoritmo.

3.10.1 Descrizione dell’algoritmo RSA

RSA è basato sull’elevata complessità computazionale della fattorizzazione in numeri primi.

Il suo funzionamento base è il seguente:

1. si scelgono a caso due numeri primi, p e q abbastanza grandi da garantire la sicurezza

dell’algoritmo (in genere ha una dimensione di 309 cifre decimali);

· − −

2. si calcola il loro prodotto n = p q, chiamato modulo, e il prodotto ϕ(n) = (p 1)(q 1).

Si considera che la fattorizzazione di n è segreta. Solo chi sceglie i numeri p e q la conosce;

3. si sceglie poi un numero e, coprimo con ϕ(n) tale che e < ϕ(n);

4. si calcola il numero d tale che il suo prodotto con e sia congruo ad 1 modulo ϕ(n) ovvero

· ≡

che e d 1 (mod ϕ(n))

La chiave pubblica è (n, e), mentre la chiave privata è (n, d).

e

Un messaggio M viene cifrato attraverso l’operazione C = M mod n. d

Un messaggio criptato C viene decifrato attraverso l’operazione M = C mod n.

Il procedimento funziona solo se la chiave e utilizzata per cifrare e la chiave d utilizzata per deci-

· ≡

frare sono legate tra loro dalla relazione e d 1 (mod ϕ(n)).

La forza dell’algoritmo sta nel fatto che per calcolare d o e, non basta la conoscenza di n, ma serve

− −

il numero ϕ(n) = (p 1)(q 1). Il calcolo di questo numero richiede tempi molto elevati, poiché

fattorizzare in numeri primi (trovare divisori primi di un numero) è un’operazione molto lenta.

La firma digitale non è altro che l’inverso: il messaggio viene crittografato con la chiave pri-

vata in modo che chiunque, attraverso la chiave pubblica conosciuta da tutti, può decifrarlo e può

essere certo che il messaggio è stato mandato effettivamente dal possessore della chiave privata

corrispondente a quella pubblica utilizzata per leggerlo.

Per far si che questo algoritmo sia soddisfacente devono essere soddisfatti i seguenti requisiti:

ed ∀M

1. Deve essere possibile trovare i valori e, d, ed n tali che M mod n = M , < n.

e d ∀M

2. Deve essere relativamente facile calcolare C = M mod n e M = C mod n, < n.

3. Deve essere impossibile determinare d conoscendo sia e che n.

55

Vediamo qualche esempio numerico per capire meglio il funzionamento di RSA.

Prendiamo i soliti interpreti che vogliono comunicare: Alice e Bob.

1 - Alice genera le sue chiavi pubbliche e private

• Alice genera due numeri primi distinti p e q e li moltiplica tra di loro ottenendo il numero n

che viene reso pubblico, mentre p e q devono restare segreti.

−→ · −→ · −→

p = 5 , q = 11 n = p q n = 5 11 n = 55

• − −

Alice calcola il prodotto ϕ(n) = (p 1)(q 1) che è la funzione di Eulero di n.

Il valore ϕ(n) deve rimanere segreto.

− − −→ · −→

ϕ(n) = (p 1)(q 1) ϕ(n) = 4 10 ϕ(n) = 40

• Alice sceglie il primo valore e che sia coprimo con ϕ(n) (ovvero M CD(e, ϕ(n)) = 1).

−→

e =2 M CD(2, 40) = 2 NO!

−→

e =3 M CD(3, 40) = 1 SI!

• Alice calcola il numero d tale che il suo prodotto con e sia congruo ad 1 modulo ϕ(n) ovvero

· ≡

che d e 1 (mod ϕ(n)). Il numero d è la chiave per decifrare e deve rimanere segreto. Si

potrebbe usare il metodo basato sulla funzione di Eulero ma per numeri grandi la complessità

sarebbe proibitiva; molto più efficiente un’estensione del classico algoritmo di Euclide per

l’MCD; qui a titolo esemplificativo usiamo un semplice metodo a tentativi:

−→ ·

d =2 2 3 mod 40 = 6 NO!

−→ ·

d =3 3 3 mod 40 = 9 NO!

−→ ·

d =4 4 3 mod 40 = 12 NO!

...

−→ ·

d = 26 26 3 mod 40 = 38 NO!

−→ ·

d = 27 27 3 mod 40 = 1 SI!

Quindi riassumento per quanto riguarda Alice si ha:

• p = 5 , q = 11 (privato, scelto)

• n = 55 (pubblico, calcolato)

• e =3 (pubblico, calcolato e scelto)

• d = 27 (privato, calcolato) 56

2 - Bob vuole inviare un messaggio ad Alice

• Per trasmettere un messaggio M = 7 ad Alice, Bob deve conoscere la coppia che forma la

chiave pubblica di Alice. Una volta che Bob legge la coppia che forma la chiave pubblica di

e

Alice (N ed e), egli trasmette il messaggio M cifrandolo come segue: C = M mod n.

e 3

−→ −→

C = M mod n C = 7 mod 55 C = 13

Il ciphertext che Bob invierà ad Alice sarà C = 13.

3 - Alice deve decriptare il messaggio criptato ricevuto da Bob

• Alice deve decriptare il messaggio codificato che ha ricevuto da Bob. Per eseguire questa

operazione utilizza la coppia che forma la sua chiave privata (n e d). Attraverso la formula

d

M = C mod n otterà il messaggio in chiaro.

d 27

−→ −→

M = C mod n M = 13 mod 55 M =7

Il messaggio in chiaro è lo stesso che Bob ha inviato ad Alice, ossia M = 7.

Abbiamo visto quindi, tramite un esempio, come bisogna procedere per inviare un messaggio a

qualcuno utilizzando l’algoritmo RSA. Vogliamo puntualizzare che se Alice avrebbe voluto rispon-

dere a Bob inviandogli lei un messaggio cifrato, allora avrebbe dovuto prelevare la chiave pubblica

di Bob e cifrare con quella il messaggio da spedire. A quel punto Bob utilizzerà la propria chiave

privata per decifrare il messaggio.

Spendiamo qualche parola sulle differenze tra RSA e DES. L’implementazione più veloce di RSA

cripta dati dell’ordine di Kb/s mentre l’implementazione più veloce di DES cripta dati dell’ordine

di M b/s. Proprio perchè più lento RSA viene utilizzato per lo scambio sicuro di chiave DES.

La dimensione della chiave di RSA non è predefinita, ma può essere scelta tra 3 varianit: 384 bit

per usi casuali, 512 bit per usi commerciali o 1024 bit per usi militari. La dimensione della chiave

di DES invece è predefinita: 64 bit (56 bit per la chiave e 8 bit per i controlli).

Analizzeremo adesso tre tipi di esempi mirati a comprendere l’utilità dell’algoritmo RSA.

1. funzionamento di RSA per confidenzialità;

2. funzionamento di RSA per integrità/autenticazione;

3. funzionamento di RSA che comprende sia confidenzialità che integrità/autenticazione;

57

Esempio 1 - Utilizzo di RSA per confidenzialità

Alice prende p = 7 e q = 11. Avrà quindi n = 77 e ϕ(n) = 60.

Si sceglie (secondo le regole imposte da RSA) e = 17 calcolandosi d = 53.

Bob vuole inviare in modo segreto il messaggio (07 04 11 11 14). Lo cripta:

H E L L O

e 17

• −→

M mod n 07 mod 77 = 28

1

e 17

• −→

M mod n 04 mod 77 = 16

2 17

e −→

• mod n 11 mod 77 = 44

M

3

e 17

• −→

M mod n 11 mod 77 = 44

4 17

e −→

• mod n 14 mod 77 = 42

M

5

Bob invia ad Alice il messaggio cifrato: 28 16 44 44 42.

Alice usa la sua chiave privata, d = 53, per decriptare il messaggio ricevuto:

53

d −→

• mod n 28 mod 77 = 07

C 1

d 53

• −→

C mod n 16 mod 77 = 04

2 53

d −→

• mod n 44 mod 77 = 11

C 3

d 53

• −→

C mod n 44 mod 77 = 11

4 53

d −→

• mod n 42 mod 77 = 14

C 5

Alice traduce il messaggio in lettere e legge H E L L O.

Nessun altro può leggere il messaggio cifrato inviato da Bob ad Alice.

Solo Alice può farlo poiché è l’unica che conosce la sua chiave privata.

58

Esempio 2 - Utilizzo di RSA per integrità/autenticazione

Alice prende p = 7 e q = 11. Avrà quindi n = 77 e ϕ(n) = 60.

Si sceglie (secondo le regole imposte da RSA) e = 17 calcolandosi d = 53.

Alice vuole inviare il messaggio (07 04 11 11 14).

H E L L O

Alice fa in modo che Bob sia certo dell’effettivo mittente del messaggio quando arriva a

destinazione, ossia vuole essere certo che sia stata Alice ad inviarglielo. Lei lo cripta, ma

anziché utilizzare la chiave pubblica di Bob, utilizza la propria chiave privata:

53

d −→

• mod n 07 mod 77 = 35

M

1

d 53

• −→

M mod n 04 mod 77 = 09

2 53

d −→

• mod n 11 mod 77 = 44

M

3

d 53

• −→

M mod n 11 mod 77 = 44

4 53

d −→

• mod n 14 mod 77 = 49

M

5

Alice invia a Bob il messaggio cifrato con la propria chiave segreta: 35 09 44 44 49.

Bob usa la chiave pubblica di Alice, e = 17, per decriptare il messaggio ricevuto:

17

e −→

• mod n 35 mod 77 = 07

C 1

e 17

• −→

C mod n 09 mod 77 = 04

2 17

e −→

• mod n 44 mod 77 = 11

C 3

e 17

• −→

C mod n 44 mod 77 = 11

4 17

e −→

• mod n 49 mod 77 = 14

C 5

Bob traduce il messaggio in lettere e legge H E L L O.

Nessun altro poteva conoscere la chiave privata di Alice per cifrare il messaggio,

pertanto se la decodifica riesce allora Bob è sicuro del mittente.

59

Esempio 3 - Utilizzo di RSA che comprende entrambi gli aspetti

Alice vuole inviare a Bob il messaggio in modo tale che Bob lo riceva

H E L L O

codificato (quindi non leggibile a nessuno se non da lui) e che sia certo della sua provenienza

(quindi certo che Alice sia il mittente). Dato n = 77:

• •

Chiave pubblica di Alice e = 17 Chiave pubblica di Bob e = 37

A B

• •

Chiave privata di Alice d = 53 Chiave privata di Bob d = 13

A B

Alice quindi sceglie di cifrare il messaggio nel seguente modo:

d e 53 37

• −→

((M mod n) mod n) ((07 mod 77) mod 77) = 07

A B

1

d e 53 37

• −→

((M mod n) mod n) ((04 mod 77) mod 77) = 37

A B

2

d e 53 37

• −→

((M mod n) mod n) ((11 mod 77) mod 77) = 44

A B

3

d e 53 37

• −→

((M mod n) mod n) ((11 mod 77) mod 77) = 44

A B

4

d e 53 37

• −→

((M mod n) mod 77) mod 77) = 14

mod n) ((14

A B

5

Alice invia a Bob il messaggio cifrato: 07 37 44 44 14.

60

3.11 ElGamal

Nel 1984, Taher Elgamal annunciò un sistema di cifratura a chiave pubblica basato sui logaritmi

discreti, strettamente correlato alla tecnica dello scambio di chiavi Diffie-Hellman: ElGamal cifra,

D&H no! Il sistema crittografico ElGamal non è molto utilizzato, ma lo analizzeremo perché

presenta caratteristiche differenti dagli altri. Come Diffie-Hellman, gli elementi globali di ElGamal

sono:

• un numero primo P di grandi dimensioni;

Siccome i calcoli sono svolti in mod P , più questo è grande e più è necessaria una lunga

ricerca esaustiva delle possibili soluzioni di determinate equazioni.

• una radice primitiva di P che indicheremo con G; −1

È un valore con il quale posso generare tutti i valori da 0 a P utilizzando l’esponenziazione.

Vediamone il funzionamento nello scambio di messaggi tra due utenti.

L’utente genera una coppia di chiavi pubblica e privata cosı̀ come segue:

A

• −

sceglie un numero intero randomico, che sarà la sua privA, tale che 1 < privA < P 1;

privA

• −→

calcola la sua chiave pubblica pubA = G mod P ;

L’utente B che vuole inviare un messaggio ad A, procede come segue:

• ≤ ≤ −

rappresenta il messaggio in un intero M e lo suddivide in blocchi, tale che 0 M P 1;

• ≤ ≤ −

sceglie un numero intero randomico k, tale che 0 k P 1;

k

• −→

calcola una one-time key K = ( pubA ) mod P ;

• cripta M con una coppia di interi (C , C ) dove:

1 2

k

– C = G mod P

1 ·

– C = (K M ) mod P

2

L’utente A, per recuperare il plaintext M, procede come segue:

privA

• −→

calcola la one-time key K = (C ) mod P

1 −1

• −→ ·

calcola il messaggio M M = (C K ) mod P

2

Un’importante caratteristica di ElGamal è che se A manda due volte lo stesso messaggio a B,

cifrandoli entrambi con la stessa chiave, egli riceverà due ciphertext differenti. Con DES, AES o

RSA avremo gli stessi ciphertext, mentre qui saranno diversi. Com’è possibile? Utilizzando valori

randomici differenti, in combinazione con la chiave pubblica del ricevente, si avrà una cifratura

differente anche se il messaggio è identico. 61

3.12 Autenticazione dei messaggi e funzioni HASH

In sicurezza, l’autenticazione dei messaggi o autenticazione dell’origine dei dati (message

authentication) è la proprietà che un messaggio non è stato modificato durante il trasferimento

(integrità dei dati) e che il destinatario possa verificare l’origine del messaggio (autenticazione).

Sono due quindi gli aspetti fondamentali:

• Integrità

Con il termine integrità si intende la protezione dei dati e delle informazioni nei confronti

delle modifiche del contenuto, accidentali oppure effettuate da una terza parte.

• Autenticazione

L’autenticazione è una procedura che verifica che i messaggi ricevuti provengano dalla

sorgente indicata e che non siano stati modificati.

I protocolli di autenticazione dei messaggi sfruttano l’esistenza di funzioni che producono auten-

ticatori, che verranno poi utilizzati dal destinatario per verificare l’autenticità del messaggio.

Queste funzioni sono raggruppabili in tre classi:

1. Crittografia dei messaggi

2. Message Authentication Code (MAC)

3. Funzione Hash

3.12.1 Crittografia dei messaggi

Come abbiamo visto fin ora, si può utilizzare la crittografia simmetrica e asimmetrica.

• Crittografia simmetrica

Il messaggio trasmesso dalla sorgente A alla destinazione B viene crittografato utilizzando

una chiave segreta K condivisa da A e B. La crittografia simmetrica garantisce segretezza e

autenticazione:

– Nessun altro conosce la chiave

– Un estraneo che non conosce K non saprebbe come modificare il messaggio

• Crittografia Asimmetrica

L’uso ordinario della crittografia a chiave pubblica garantisce la segretezza ma non sempre

l’autenticazione. Chiunque potrebbe usare la chiave pubblica di Bob per crittografare un

messaggio qualsiasi ed inviarlo a Bob sostenendo di essere Alice. Tuttavia però il mittente

potrebbe firmare il messaggio con la propria chiave privata e criptarlo successivamente con la

chiave pubblica del destinatario. In questo modo si ottiene sia segretezza che autenticazione.

Tale schema richiede 2 crittografie e 2 decrittografie per ogni messaggio inviato.

62

3.12.2 Message Authentication Code (MAC)

In crittografia un Message Authentication Code (MAC) è un piccolo blocco di dati generato

secondo un meccanismo di crittografia simmetrica, utilizzato per l’autenticazione di un messaggio

e per verificarne l’integrità da parte del destinatario. Un algoritmo MAC accetta in ingresso una

chiave segreta ed un messaggio da autenticare di lunghezza arbitraria, restituendo un MAC in

uscita. In ricezione il destinatario opererà in maniera identica sul messaggio pervenuto in chiaro

ricalcolando il MAC con lo stesso algoritmo e la stessa chiave: se i due MAC coincidono si ha

autenticazione e integrità del messaggio inviato. Il valore MAC protegge dunque sia l’integrità dei

dati del messaggio sia la sua autenticità permettendo al destinatario di rilevare qualsiasi modifica

al messaggio.

Quindi in parole povere, l’idea alla base dei codici MAC è quella di garantire l’autenticazione

dei messaggi attraverso a creazione di informazioni aggiuntive. Questo checksum crittografico

prende il nome di codice MAC e deve poter essere calcolato a partire da una chiave segreta K,

condivisa da entrambe le parti (mittente e destinatario).

Il piccolo blocco di dati (MAC):

• dipende sia dal messaggio che da una chiave segreta

• viene aggiunto al messaggio come se fosse una firma

• il destinatario può calcolarlo e verificare che il messaggio è giunto integro

È da sottolineare che il nostro obiettivo è consentire l’autenticazione dei messaggi e che ora non

siamo interessati alla segretezza, quindi i nostri messaggi stanno viaggiando in chiaro sul canale

di comunicazione. Ma nel caso in cui Alice volesse inviare un messaggio privato a Bob senza che

nessuno sia in grado di leggerlo utilizzando MAC per avere anche l’autenticazione, allora la scelta

migliore sarà quella di crittografare il messaggio M e poi aggiungere il MAC al testo cifrato. In

questo modo nessuno potrà leggere il messaggio se non Bob attraverso l’utilizzo della chiave uti-

lizzata per criptarlo. Inoltre Bob può verificare verificare il MAC prima di decrittare il messaggio:

se il MAC inviatogli fosse diverso dal MAC calcolato da Bob, allora non si perderebbe tempo a

decrittare.

Requisiti di sicurezza dei MAC:

• Conoscendo il messaggio ed il MAC, deve essere computazionalmente difficile trovare un

altro messaggio cui corrisponde lo stesso MAC (ovviamente la chiave non deve essere nota)

• I MAC devono essere uniformemente distribuiti (ovvero, scelti a caso 2 messaggi, i loro MAC

coincidono con probabilità 2−n)

• Il MAC deve dipendere in “egual maniera” da tutti i bit del messaggio

63

3.12.3 Funzioni Hash

In informatica una funzione crittografica di hash trasforma dei dati di lunghezza arbitraria

(un messaggio) in una stringa di dimensione fissa chiamata valore di hash, ma spesso anche con

il termine inglese message digest.

La funzione crittografica di hash ideale deve avere tre proprietà fondamentali:

1. deve essere estremamente semplice calcolare un hash da qualunque tipo di dato;

2. deve essere estremamente difficile o quasi impossibile risalire al testo che ha portato ad un

dato hash;

3. deve essere estremamente improbabile che due messaggi differenti, anche se simili, abbiano

lo stesso hash;

Oltre a queste tre proprietà fondamentali c’è da aggiungere il cosiddetto ”effetto valanga”, ossia

la minima modifica del messaggio deve portare ad un’alterazione radicale dell’impronta del mes-

saggio. Un valore hash h viene generato da una funzione H con la seguente forma: h = H(M ). I

cifrari a blocchi possono essere usati per creare funzioni hash, ad esempio, posto H = 0, calcola:

0

[H ], con M blocco i-esimo del messaggio. Come possiamo vedere si usa l’ultimo

H = E i−1 i

i M i

blocco come codice hash e non vi è l’utilizzo di una chiave. Però vi sono due problemi: il codice

hash risultante può essere troppo piccolo (64-bit) ed è ulnerabile ad attacchi crittografici tra cui

l’attacco a compleanno.

Funzioni con queste proprietà sono utilizzate come funzioni di hash in diversi campi, anche al

di fuori di quello prettamente crittografico. Le applicazioni pratiche includono infatti i controlli

sull’integrità dei dati mediante somme di controllo, le firme digitali semplici, l’autenticazione e

varie applicazioni nella sicurezza informatica.

In diversi standard ed applicazioni le due funzioni crittografiche di hash più utilizzate sono:

MD5

• Progettato da Ronald Rivest (la R di RSA)

• Produce un codice hash di 128 bit; l’input è elaborato in blocchi di 512 bit

• È stato uno dei più usati algoritmi hash fino a qualche anno fa

• Recentemente sono sorti dubbi sulla sua vulnerabilità agli attacchi a forza bruta

SHA-1

• SHA fu sviluppato dal NIST e dall’ NSA nel 1993; fu poi rivisto nel 1995 e chiamato SHA-1

• US standard, usato con la tecnica di firma digitale DSA

• Produce codici hash di 160 bit

• È attualmente l’algoritmo hash maggiormente preferito

• È basato sulla struttura di MD5 64

3.13 Firma digitale

Lo sviluppo più importante dal lavoro sulla crittografia a chiave pubblica è la firma digitale. La

firma digitale fornisce una serie di funzionalità di sicurezza che sarebbe difficile da implementare

in qualsiasi altro modo. La firma digitale, in informatica, rappresenta l’insieme dei dati in forma

elettronica, allegati oppure connessi tramite associazione logica ad altri dati elettronici, utilizzati

come metodo di identificazione informatica. Può essere basata su varie tecnologie. Uno schema

di firma digitale è un metodo di firma di un messaggio memorizzato in forma elettronica.

Utilizzando la firma digitale possono essere soddisfatte alcune esigenze:

• il destinatario può verificare l’identità del mittente (autenticazione);

• il mittente non può disconoscere un documento da lui firmato (non ripudio);

• il destinatario non può modificare un documento firmato da qualcun altro (integrità);

Un tipico schema di firma digitale consiste di due componenti:

1. un algoritmo di firma, che dato un messaggio m produce una firma s;

2. un algoritmo di verifica, che data una coppia (m, s):

• restituisce True se s è la firma del messaggio m;

• restituisce False altrimenti;

Il classico sistema di firma digitale si basa su una terza parte fidata. Vediamo un esempio. Cathy

è la terza parte fidata con la quale Alice e Bob condividono le loro chiavi crittografiche K e K .

A B

Quando Bob vuole inviare ad Alice un messaggio m, lo firma con K e glielo via. A questo punto

B

Alice inoltra il messaggio m a Cathy che prima lo spacchetta tramite la chiave condivisa con Bob,

e dopo lo impacchetta tramite la chiave condivisa con Alice. Infine rimanda il tutto ad Alice. Se

Alice spacchettando quello che riceve da Cathy trova la stessa cosa che era arrivata insieme alla

firma di Bob, allora la firma di Bob è autentica. Fidandosi che Cathy ha fatto le conversioni in

maniera corretta, Alice può affermare che il messaggio è effettivamente stato spedito e firmato da

Bob. Senza utilizzare una terza parte fidata, questo processo non funziona. Questo perchè se Bob

manda qualcosa firmato con la chiave che soltanto lui e Alice condividono, allora Alice non potrà

dimostrare a qualcun altro che la firma è effettivamente di Bob.

Figura 31: Semplice esempio di Firma Digitale

65

In realtà non è proprio cosı̀ che funziona la creazione e la verifica della firma digitale. Vediamo

un esempio. Cathy è sempre la terza parte fidata con la quale Alice e Bob condividono le loro

chiavi crittografiche K e K . Quando Bob vuole inviare ad Alice un messaggio m, gli applica

A B

una funziona hash calcolandosi un digest. Questo digest viene poi cifrato da Bob con la chiave K B

ed invia il tutto a Cathy. Cathy prende quello riceve, lo spacchetta utilizzando la chiave di Bob,

lo impacchetta utilizzando la chiave di Alice e lo invia a quest’utlima. Alice adesso spacchetta ciò

che Cathy gli ha inviato e lo confronta con il digest calcolato dal messaggio originale attraverso la

stessa funzione hash utilizzata da Bob. Se corrispondono allora il messaggio è stato effettivamente

firmato da Bob. Ovviamente qui è importante che Bob ed Alice utilizzino la stessa funziona hash.

Figura 32: Schema classico di Firma Digitale

La firma digitale può essere implementata anche utilizzando un sistema di crittografia a chiave

pubblica. Vediamo un esempio. Supponiamo che Alice vuole mandare qualcosa di firmato a Bob.

Non deve far altro che abbinare al messaggio m il risultato della cifratura dello stesso messaggio

con la propria chiave privata (privA).

A questo punto, come farà Bob a verficare la firma assocciata al messaggio?

Per verificare la provenienza del messaggio, Bob utilizzerà la chiave pubblica di Alice. Se quel che

gli è arrivato è stato effettivamente cifrato con la chiave privata di Alice, allora una cifratura dello

stesso oggetto con la chiave pubblica di Alice, produrrà il messaggio inviato.

Cioè se a Bob è arrivato {m}

(m, privA)

egli dovrà cifrare il tutto con la chiave pubblica di Alice, ossia

{m}

({(m, privA)} pubA)

In questo modo Bob otterrà il messaggio m. Soltanto Alice avrebbe potuto cifrare il messaggio

con la propria chiave privata perchè si suppone che soltanto lei la conosca.

66

3.13.1 Firma digitale con RSA

Quanto fatto vedere nell’ultimo paragrafo, è formalmente giusto ma non utilizzabile nella realtà

poiché altrimenti sarebbe facilmente attaccabile. Un sistema a chiave pubblica che effettivamente

funziona ed è oggi utilizzato, è RSA. In RSA si utilizza lo stesso algoritmo sia per crittografare dei

dati (quindi preservare la confidenzialità) e sia per produrre una firma digitale (quindi preservare

autenticazione e non ripudio).

• Applicando prima la codifica e poi la decodifica si criptano i dati.

e d

(M mod n) mod n = M

• Applicando prima la decodifica e poi la codifica si firma digitalmente.

d e

(M mod n) mod n = M

Come possiamo vedere viene utilizzata la chiave privata per firmare.

I punti da rispettare per avere un sistema efficiente di firma digitale sono:

1. non firmare mai il documento stesso;

2. non firmare mai documenti casuali;

3. prima firmare e poi cifrare;

Indipendentemente se la firma digitale viene applicata tramite RSA, tali punti bisogna sempre

rispettarli. Ad esempio è una pessima idea firmare direttamente il documento originale o docu-

menti casuali, poichè ad esempio un’attaccante può prendere due messaggi e le firme di questi

due messaggi per creare una firma di un terzo messaggio che corrisponde alla moltiplicazione delle

firme dei primi due messaggi.

Esempio 1

Prima di spiegare l’esempio, elenchiamo i dati di Alice e Bob:

−→

1. Dati di Alice n = 95, e = 59, d = 11

A A A

−→

2. Dati di Bob n = 77, e = 53, d = 17

B B B

Supponiamo che Alice ha una serie di contratti numerati da 00 a 25 e che convinca Bob a

firmare i contratti numero 05 e numero 17: d 17

• −→

Firma contratto 05 c = m mod n = 05 mod 77 = 3

B B

d 17

• −→

Firma contratto 17 c = m mod n = 17 mod 77 = 19

B B

A questo punto Alice può prendere i due contratti, moltiplicarli tra loro ed ottenere il numero

di un certo contratto. Quello che succede è che se adesso lei prende le due firme di Bob

sui contratti, può molitplicarle ottenendo la firma per il numero di contratto ottenuto nella

moltiplicazione precedente:

• −→ ·

Numero contratto 05 17 mod 77 = 08

• −→ ·

Firma contratto 3 19 mod 77 = 57

In questo modo Bob può essere facilmente incastrato da Alice visto che un giudice può

verificare che la firma sul contratto 08 è effettivamente quella di Bob. Proprio per questo

motivo non bisogna mai firmare cose casuali e/o firmare direttamente il messaggio.

e 53

• −→

Verifica della firma m = c mod n = 57 mod 77 = 08

B B

67

L’atro punto fondamentale è il fatto di non firmare il messaggio successivamente dopo la fase di

cifratura. Questo perchè il ricevente malintenzionato del quale avete utilizzato la chiave pubblica

per cifrare il messaggio che gli dovete spedire, potrebbe cambiare la chiave e imporre la vostra

firma su di un altro documento. In questo modo non firmerete qualcosa di casuale ma qualcosa

che è sotto il controllo di un altra persona.

Esempio 2

Prima di spiegare l’esempio, elenchiamo i dati di Alice e Bob:

−→

1. Dati di Alice n = 95, e = 59, d = 11

A A A

−→

2. Dati di Bob n = 77, e = 53, d = 17

B B B

Supponiamo che vi sono una serie di contratti numerati da 00 a 25 e che Alice e Bob

accettano di firmare il contratto numero 06:

• Firma contratto 06

e d 53 11

−→ c = (m mod n ) mod n = (06 mod 77) mod 95 = 63

B A

B A

Questo risultato è ottenuto nel momento in cui la chiave pubblica di Bob era (53, 77).

Adesso chi impedirebbe a Bob, una volta che gli arriva il contratto firmato, di cambiare la

sua chiave pubblica? Nessuno! Ed è proprio quello che farà attraverso una serie di passi:

r

1. Si calcola una r tale che 13 mod 77 = 6 ottenendo che r = 59

(Egli può farlo perche conosce la fattorizzazione di n )

B

77 è la n , 13 è il contratto che vuole far firmare Bob ad Alice in maniera illegale

B

e 06 è il contratto sul quale Alice ha posto la sua firma. ×

2. Si calcola poi il prodotto scalare tra r e e tramite l’operazione r e mod ϕ(n )

B B B

×

ottenendo 59 53 mod 60 = 7

3. Infine sostituisce e = 7 e d = 43

B B

Adesso Bob può affermare e dimostrare che Alice ha firmato il contratto numero 16. De-

cifrandolo con la chiave pubblica di Alice e cifrandolo con la sua chiave privata, ottiene

il valore 13. In questo modo Alice è nei guai poichè ha firmato qualcosa controllato da

Bob con la sua chiave pubblica. In realtà avrebbe dovuto prima firmare il messaggio e

successivamente cifrarlo.

• Verifica della firma

e e 59 43

−→ m = (c mod n ) mod n = (63 mod 95) mod 77 = 13

A B

A B 68

3.13.2 Firma digitale con ElGamal

Come per RSA, anche ElGamal propose un meccanismo per firmare. Sappiamo che la caratte-

ristica più importante di ElGamal è che, a differenza di RSA, anche cifrando la stessa cosa in

diversi momenti, viene prodotto un output diverso ogni volta. Questo perchè ElGamal utilizza

valori randomici all’interno del processo di cifratura.

Immaginate che Bob deve firmare qualcosa con RSA. Per farlo prende il messaggio, gli appli-

ca una funzione hash e firma con la sua chiave privata il digest del messaggio. Se successivamente

Bob vorrà firmare di nuovo lo stesso messaggio, ciò che ne uscirà sarà lo stesso del precedente.

Questo perchè le componenti utilizzate (stessa hash, stesso messaggio) sono le stesse ed inoltre è

possibile risalire al fatto che Bob ha firmato due volte lo stesso messaggio.

Il vantaggio di ElGamal è che firmando due volte lo stesso messaggio ne verranno fuori due firme

diverse. Utilizzando questo meccanismo, non è possibile nemmeno risalire al fatto che il messaggio

sia stato firmato due volte. Questo perchè, come avveniva nell’algoritmo di cifratura, ElGamal fa

uso di valori randomici.

Descriveremo adesso i passi necessari per firmare un documento con tale meccanismo.

1. si sceglie un valore P primo, una radice primitiva di P che indicheremo con G ed un numero

intero randomico d < P 1 che sarà la chiave privata d

−→

2. si calcola la chiave pubblica tramite la formula y = G mod P

3. si firma il documento m − ≤ ≤ −

(a) si sceglie un valore k primo a P 1 tale che 1 k P 1 (mai utilizzato)

k

−→

(b) si calcola il valore a tramite la formula a = G mod P

· · −

(c) si ricerca un valore b tale che m = (d a + k b) mod P 1

(d) la firma sarà indicata dalla coppia (a, b)

Come si verifica se la firma è corretta?

La si inserisce nella seguete formula: a b

·

(y a ) mod P

e se il risultato di questa è lo stesso della formula

m

G mod P

allora la firma è corretta. 69

Esempio 1

Alice sceglie:

1. P = 29 3. d = 6 6

2. G = 3 4. y = 3 mod 29 = 4

Supponiamo che vi sono una serie di contratti numerati da 00 a 25 e che Alice voglia firmare

ed inviare a Bob il contratto numero 23:

• ≤ ≤

sceglie k = 5 (tale che 1 k 28 e primo con 28)

k 5

• →

calcola a = G mod P ottenendo che a = 3 mod 29 a = 11

• · · −

ricerca b tale che m = (d a + k b) mod P 1 ottenendo

· · →

23 = (6 11 + 5 b) mod 28 b = 25

• invia il messaggio 23 con la firma (11, 25)

A questo punto Bob può verificare che la firma è esatta

m 23

• si calcola G mod P ottenendo che 3 mod 29 = 8

a b 11 25

• · ·

si calcola (y a ) mod P ottenendo che (4 11 ) mod 29 = 8

Siccome questi due valori coincidono allora la firma di Alice è autentica.

Questo meccanismo però è vulnerabile poiché può compromettere la chiave privata di chi firma.

Ad esempio, se un attaccante riesce a recuperare il valore randomico utilizzato nella creazione

della firma, può risalire alla chiave privata di chi ha generato tale firma. Il lettore si chiederà come

sia possibile risalire ad un valore randomico: ebbene parecchi sistemi operativi non utilizzano

un generatore randomico ma un generatore pseudo-randomico. Ad esempio RandomUnix genera

valori secondo un procedimento predefinito quindi si può benissimo risalire al valore randomico

che genera in quel momento. 70

4 Gestione delle chiavi e certificati digitali

4.1 Scambio di chiavi classico

Ci sono vari meccanismi per scambiare le chiavi. Ipotizziamo di dover scambiare una chiave sim-

metrica. Il meccanismo più classico è quelo di utilizzare una terza entità sicura, proprio come

abbiamo visto per le firme digitali. In questo contesto bisogna quindi eleggere un’entità fidata alla

quale ciascun entità vi si registra scambiando una chiave condivisa tra lei e la parte fidata. Da lı̀

in poi, utilizzando la parte fidata, ogni coppia di entità può stabilire una chiave simmetrica che

verrà utilizzata durante il loro scambio di messaggi.

Vediamo un esempio per comprendere meglio il funzionamento di tale meccanismo. Alice e Bob

si registrano presso la parte fidata Cathy e scambiano con lei delle chiavi condivise. Nel momento

in cui Alice vuole iniziare uno scambio di messaggi verso Bob, come fa a scambiare in sicurezza

una chiave che gli permetta di codificare i messaggi da inviare a Bob? Esegue 3 semplici passi:

1. Alice manda a Cathy un messaggio cifrato in cui esprime la sua richiesta di voler una

chiave per cominciare una sessione di scambio messaggi codificati con Bob. Alice codifica

il messaggio di richiesta con la chiave che essa ha condiviso con Cathy al momento della

registrazione.

2. Cathy genera una chiave e forma un messagio. Il messaggio è composto da due parti:

• una prima parte, codificata con la chiave condivisa tra lei ed Alice, dove è contenuta la

nuova chiave simmetrica che Alice potrà utilizzare per comunicare in maniera protetta

con Bob

• una seconda parte, codificata con la chiave condivisa tra lei e Bob, dove è contenuta an-

che qui la nuova chiave simmetrica che Bob potrà utilizzare per comunicare in maniera

protetta con Alice

3. Alice riceve il messaggio, preleva la prima parte, la spacchetta con la chiave condivisa con

Cathy e ottiene la chiave simmetrica che potrà utilizzare con Bob. Successivamente preleva

la seconda parte e la inoltra a Bob. Soltanto Bob potrà manipolare tale parte del messaggio

poiché, insieme a Cathy, è l’unico che conosce la loro chiave condivisa. A quel punto sia

Alice che Bob hanno la chiave generata per il loro scambio e la comunicazione protetta può

avvenire tranquillamente.

Figura 33: Scambio di chiavi classico

71

Tale approccio però da spazio a vari problemi.

1. Come fa Bob ad essere sicuro che sta parlando con Alice?

L’unica cosa di cui Bob è a conoscenza è che la parte di messaggio che gli arriva è stata

creata dalla terza parte fidata Cathy. All’interno non vi sono informazioni riguardanti il

mittente. Ad esempio, può succedere, che mentre Alice invia la seconda parte del messaggio

a Bob, Eva (l’attaccante) la intercetta e si mette in ascolto durante la fase dello scambio di

messaggi cifrati tra Alice e Bob. Eva a quel potrebbe riuscire ad estrapolare informazioni

sufficienti per scoprire la chiave di sessione che i due interlocutori stanno utilizzando.

2. Chi impedisce ad Eva di usare la stessa chiave di sessione camuffandosi da Alice?

Un altro problema è che Eva (l’attaccante) potrebbe venir a conoscenza della chiave di

sessione ed utilizzarla per comunicare con Bob. Eva invierebbe lo stesso messaggio iniziale

inoltrato da Alice a Bob e a quel punto Bob userebbe questa chiave pensando di condividerla

con Alice, ma in realtà starà condividendo qualcosa con Eva.

Questo è il problema del replay attack

4.1.1 Protocollo Needham-Schroeder

Il protocollo Needham-Schroeder risolve parzialmente questi problemi.

Roger Needham e Michael Schroeder nel 1978, hanno pensato di inserire all’interno dei messaggi

delle informazioni riguardanti chi sta interagendo nella comunicazione. Proprio come nel classico

scambio di chiavi, anche qui le entità coinvolte devono registrarsi presso la terza parte fidata speci-

ficandone una chiave condivisa. Come illustrato nella Figura 34, il protocollo Needham-Schroeder

funziona nel seguente modo:

1 - Alice invia a Cathy un messaggio di richiesta condificato con la chiave tra loro condivisa,

contenente il suo nome, il nome dell’entità con cui vuole cominciare una comunicazione

(Bob) ed un valore randomico che prende il nome di nonce ( = numero utilizzato una volta

sola). Il nonce, indicato con r , serve a Cathy per poter identificare a quale messaggio sta

1

rispondendo.

2 - Cathy risponde ad Alice con un messaggio che presenta al suo interno due Ticket.

Ovviamente sempre codificato con la loro chiave condivisa.

• Il primo Ticket è in risposta ad Alice e contine esattamente lo stesso messaggio di

richiesta che lei aveva inviato ad Alice precedentemente. In aggiunta vi è la chiave

di sessione K che Cathy ha creato per permettere ad Alice e Bob di comunicare in

s

maniera segreta.

• Il secondo Ticket è qualcosa che Alice non può manipolare, poiché cifrato con la chiave

condivisa tra Bob e Cathy, e che dovrà inoltrare a Bob. All’interno di questo Ticket vi

è il nome dell’entità che desidera comunicare con Bob (in questo caso Alice) e la stessa

chiave di sessione K che ha ricevuto Alice all’interno del primo Ticket.

s

3 - A quel punto Alice preleva il secondi Ticket e lo invia a Bob.

72

Quindi, come fa Bob a sapere che Alice è la mittente del messaggio appena arrivato?

Abbiamo detto che all’interno del Ticket spedito a Bob vi è il nome del mittente e la chiave di

sessione utilizzata. Bob decide quindi di utilizzare altri due scambi per verificare che il Ticket è

stato effettivamente inviato dalla persona giusta.

4 - Bob sceglie un valore randomico, indicato con r , lo cifra con la chiave di sessione che trova

2

all’interno del Ticket e lo spedisce al mittente. Egli si aspetterà che l’entità che gli ha inviato

−1.

il Ticket riuscirà a spacchettare questo messaggio rispedendogli il valore randomico

5 - Alice, una volta ricevuto il messaggio da Bob, utilizzerà la chiave di sessione K , spacchetterà

s

il messaggio, calcolerà r 1 e lo rispedirà a Bob sempre codificato tramite la solita chiave

2

di sessione.

Se Bob riterrà esatto il valore inviatogli da Alice allora capirà che il mittente originario del Ticket

che gli è giunto in precedenza è effettivamente Alice.

Figura 34: Protocollo Needham-Schroeder

Nonstante il protocollo Needham-Schroeder si pensava risolvesse entrambi i problemi, dopo 10

anni dalla sua nascita si è capito che era ancora soggetto al Replay Attack. Nonostante il dop-

pio scambio finale risolvesse il primo problema, per risolvere il Replay Attack il protocollo ha

dovuto subire una modifica. Dorothy Denning e Giovanni Maria Sacco proposero una modifica

al protocollo cosicché non fosse vulnerabile al Replay Attack. La loro domanda fu: supponendo

che un attaccante riesca a scoprire, dopo un po’ di tempo, la chiave di sessione utilizzata tra le

due entità in comunicazione, come si comporterebbe questo protocollo? Vediamolo con un esempio.

Torniamo alla situazione in cui Alice e Bob stanno comunicando con la chiave di sessione K .

s

Nessuno impedisce ad Eva (l’attaccante) di ascoltare lo scambio di messaggi tra le due entità

comunicanti e dopo un certo numero di scambi e tempo recuperare informazioni sufficienti per

scoprire la chiave di sessione. A quel punto Eva potrebbe benissimo riprendere il Ticket che Alice

invia Bob dove specifica chiave e nome del mittente ed inviarlo lei stessa a Bob. Bob, ricevuto

il messaggio, non farà altro che inviare al mittente un valore randomico codificato con la chiave

di sessione. Eva a questo punto è in grado di spacchettare il messaggio di Bob, calcolarne il

−1

valore randomico e spedirglielo nuovamente codificato con K . A quel punto Bob crederà di

s

comunicare con Alice, ma in realtà starà comunicando con Eva.

73

L’esempio precedente ci ha mostrato la vulnerabilità del protocollo Needham-Schroeder al Replay

Attack. Per evitare che questo ne sia soggetto, Denning e Sacco deciserò di aggiungere un valore

che assomigli al tempo di validità di un messaggio (timestamp, T ). Un Replay Attack per

essere attuato deve passare un po’ di tempo dall’invio del messaggio originale, poiché l’attaccante

deve aver estratto qualcosa dal sistema che gli permetta di sfruttare nuovamente la sequenza di

messaggi. Proprio per questo, aggiungendo un valore che stabilisca la validità del messaggio si

potrà limitare l’uso del Replay Attack. Ad esempio, se Alice indica con T che il messaggio è valido

fino al 1 Marzo, Eva dovrà cercare di eseguire un Replay Attack prima della data stabilita. Quindi

avrà tempo di scoprire la chiave di sessione solamente fino ale 28 Febbraio. Un Replay Attack

successivo alla data di scadenza del messaggio è pressoché inutile poiché il timestamp permette a

Bob di capire se è alle prese con quel tipo di attacco.

Figura 35: Protocollo Needham-Schroeder con la modifica di Denning e Sacco

74

4.2 Scambio di chiavi a chiave pubblica

Abbiamo appena visto che il protocollo Needham-Schroeder è un protocollo per lo scambio di

chiavi simmetriche. Vedremo adesso, attraverso un esempio, come avviene lo scambio di chiavi

utilizzando le chiavi pubblica e quindi la cifratura asimmetrica.

Supponiamo che Alice vuole mandare a Bob una chiave di sessione utilizzando il metodo a chiave

pubblica. Per prima cosa Alice prende la chiave si sessione K , la firma con la sua chiave privata,

s

la impacchetta con la chiave pubblica di Bob e successivamente gliela invia.

Come fa Bob a sapere che effettivamente è stata Alice a mandare questa chiave? Molto semplice!

Bob sà che soltanto Alice può conoscere la sua chiave privata, quindi una volta spacchettato con la

sua chiave privata il messaggio, egli verifica tramite la chiave pubblica di Alice se effettivamente è

lei a spedirgli quella chiave di sessione. Inoltre, il messaggio è totalmente al sicuro poiché nessuno

conosce la chiave privata di Bob per spacchettarlo.

4.3 Soluzione per la distribuzione delle chiavi

L’obiettivo per avere un metodo sicuro per lo scambio delle chiavi è associare l’identità alla chiave.

Parleremo di chiavi pubbliche, nonostante il discorso valga anche per le chiavi private. Il problema

è, quindi, come associare un’entità ad una chiave. Ci sono due approcci:

• •

Centralizzato Distribuito

Abbiamo introdotto precedentemente la terza parte fidata Cathy che è essenzialmente un’autorità

di certificazione, poiché invia Ticket (o Certificati) ad altre entità. In un contesto a chiave sim-

metrica, un certificato è un qualcosa che l’entità ricevente può identificare come proveniente da

Cathy, dove al suo interno vi sono informazioni necessarie sulla chiave da utilizzare per interagire

con un’altra entità. In generale però, un certificato è un asserzione digitalmente firmata da un’au-

torità di certificazione famosa della quale si conosce la chiave pubblica.

Vediamo con un esempio come funziona l’approccio centralizzato. L’idea è: Bob devo conoscere

la chiave pubblica di Alice, come fa? Può chiederla direttamente ad un’altra entità che per garan-

tirgli la non manomissione del certificato gliela firma con la propria chiave privata. Bob ottiene

quindi il certificato da un’altra entità ma adesso deve conoscere la chiave pubblica di quest’ultima

per verificare l’originalità del certificato e venir a conoscenza della chiave pubblica di Alice. Si può

creare quindi una catena che terminerà con l’arrivo di un certificato firmato con la chiave privata

di un’autorità di certificazione nota, della quale tutti i browser conoscono la chiave pubblica.

−→ {e || || }

Un certificato ha sostanzialmente la seguente forma C = Alice T d . Dove:

A A C

• d è la chiave privata dell’autorità di certificazione che ha creato il certificato

C

• T è il timestamp

• Alice è il nome dell’entità del quale si è richiesto l’informazione

• e è la chiave pubblica dell’entità specificata nel certificato

A 75

Nel metodo distribuito, invece dell’autorità di certificazione che risolve le richieste, viene utilizzato

il PGP Pretty Good Privacy. Alla base di questo approccio vi è una rete di entità distribuite.

Ogni entità mantiene una lista di utenti che conosce e a cui riesce ad associare con certezza una

chiave pubblica e utenti che ha conosciuto tramite altre operazioni/richieste. Vediamo un esempio

per capirne il funzionamento. L’idea è: Alice riceve un informazione sulla chiave pubblica di Bob.

Come fa a sapere che l’informazione ricevuta è corretta? Chiede ai suoi vicini ed analizza, tramite

una valutazione personale, le loro risposte per capire se effettivamente l’informazione contiene la

chiave pubblica di Bob. Questa è la semplice idea del Web Of Trust (Ragnatela di fiducia). In

questo approccio, come avete potuto notare, non vi è nessuna catena di richieste che termina con

l’autorità di certificazione, ma abbiamo diversi feedback da diverse entità.

4.4 Salvataggio delle chiavi

Fin ora abbiamo parlato di chiavi, ma non ci siamo mai espressi su dove esse vengono mantenute.

Proteggere le chiavi di crittografia sembra semplice: basta inserire la chiave in un file ed utilizzare

meccanismi di controllo dell’accesso del sistema operativo per proteggerlo. Purtroppo, come ve-

dremo più avanti, tali meccanismi di controllo possono spesso essere elusi o sconfitti, o potrebbero

non essere applicabili ad alcuni utenti. In un sistema single-user, questa considerazione è irrile-

vante, poiché nessun altro avrà accesso al sistema. In un sistema multiutente, altri utenti hanno

accesso al sistema. In un sistema collegato in rete, un utente malintenzionato potrebbe ingannare

il proprietario a scaricare un programma che potrebbe memorizzare ed inviare sequenze di tasti e

file all’attaccante, rivelando cosı̀ le chiavi di crittografia riservate. Consideriamo questi sistemi.

In tali sistemi, cifrare il file contenente le chiavi, non funziona. Quando l’utente inserisce la

chiave per decifrare il file, la chiave e il contenuto del file risiederà in un certo punto della memo-

ria. Queste chiavi potrebbero essere registrate o riprodotte in un secondo momento. Una possibile

soluzione è quella di mettere la chiave su uno o più dispositivi fisici, come ad esempio una ROM

o smart card. In questo modo, la chiave non risiederà mai nella memoria del computer. Invece,

per cifrare un messaggio, l’utente inserisce la smart card in un dispositivo speciale che dal quale

il computer può leggere e scrivere. Il computer invia al dispositivo il messaggio da cifrare e que-

st’ultimo, utilizzando la chiave salvata sulla smart card, lo cifrerà. Una volta codificato, rispedirà

il messaggio cifrato al computer.

Può succedere che però la smart card venga rubata e il ladro ha a disposizione la chiave crit-

tografica. Per ovviare a questo problema, invece di memorizzare interamente la chiave su una

singola scheda, questa viene condivisa su più dispositivi (due schede, una scheda e il lettore). In

questo modo, se un ladro ruba una delle schede è inutile, poiché non contiene l’intera chiave.

4.5 Revocazione della chiave

I certificati contengono una data di scadenza della chiave. Se una chiave diventa non valida prima

di tale data, essa deve essere revocata. Tipicamente, questo significa che la chiave è compromessa,

o che il legame tra il soggetto e la chiave è cambiato. Distinguiamo questo da un certificato

scaduto. Un certificato scaduto ha raggiunto un periodo prestabilito dopo di che non è più valido.

Ci sono due problemi con la revoca di una chiave pubblica. Il primo è quello di garantire che la

revoca è corretta. Il secondo è quello di garantire la tempestività della revoca.

76

4.6 Certificati digitali ed autorità di certificazione

In generale un certificato digitale è un asserzione digitalmente firmata da un’autorità di cer-

tificazione famosa della quale si conosce la chiave pubblica. Un asserzione di solito può essere

un’affermazione di identità o anche un elenco di autorizzazioni. Noi prenderemo in considerazione

solamente il problema riguardante l’affermazione di un’identità.

Un’autorità di certificazione (CA) deve avere diverse caratteristiche:

• si deve occupare di generare/firmare i certificati;

• deve avere una chiave pubblica conosciuta da altre entità;

• deve essere famosa;

Un certificato è quindi una dimostrazione crittografica, firmata dall’autorità di certificazione,

riguardo un’asserzione e che può essere verificata utilizzando un meccanismo di cifratura.

Le autorità di certificazione possono variare notevolmente:

• Vi sono CA molto grandi, come ad esempio Thawte, Verisign, Belsign e GTE Cybertrust.

Queste autorità di certificazione commerciali rilasciano certificati a milioni di utenti.

• Vi sono CA più piccole o locali, come ad esempio La Sapienza.

Queste autorità di certificazione rilasciano certificati a un piccolo numero di utenti.

Tipicamente quel che succede è che diverse entità possono farsi rilasciare dei certificati da diverse

autorità di certificazione. Quando una delle due entità invia il certificato prodotto dalla propria

CA all’altro, se quest’ultima è la stessa, allora non ci saranno problemi poiché ci si forniscono

entrambi e conoscono la chiave pubblica di tale autorità di certificazione.

Ma nel caso in cui le CA sono diverse, come si procede? Quel che si fa in genere è risalire la catena

di verifica delle firme fino a raggiungere il punto in cui varie CA si certificano a vicenda.

4.7 Standard X.509

Fin’ora abbiamo trattato il problema della distribuzione delle chiavi e i certificati. Andremo adesso

ad analizzare come sono stati standardizzati i certificati. Quello che si è cercato di fare è stato di

mettere in piedi un meccanismo ragionevole di distribuzione di chiavi pubbliche in maniera tale

che queste potessero essere utilizzate in tre meccanismi specifici:

1. Crittografia a chiave pubblica

Il mittente ha bisogno della chiave pubblica del ricevente;

2. Firma digitale a chiave pubblica

Il ricevente ha bisogno della chiave pubblica del mittente;

3. Accordo di chiave

Entrambi hanno bisogno della chiave pubblica dell’altro;

X.509 definisce framework per la fornitura di servizi di autenticazione. Ogni certificato contiene

la chiave pubblica di un utente ed è firmato con la chiave privata di un’autorità di certificazione

attendibile. Inoltre, X.509 definisce protocolli di autenticazione alternativi basati sull’utilizzo di

certificati a chiave pubblica. La struttura del certificato ed i protocolli di autenticazione, definiti

in X.509, sono utilizzati in una varietà di contesti. È stato inizialmente rilasciato nel 1988, ma

successivamente ha subito modifiche. Vennero poi sviluppate una seconda ed una terza versione.

77


ACQUISTATO

2 volte

PAGINE

169

PESO

6.33 MB

AUTORE

MicAra93

PUBBLICATO

+1 anno fa


DETTAGLI
Corso di laurea: Corso di laurea in informatica
SSD:
A.A.: 2016-2017

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher MicAra93 di informazioni apprese con la frequenza delle lezioni di Sicurezza informatica e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Tor Vergata - Uniroma2 o del prof Parisi Presicce Francesco.

Acquista con carta o conto PayPal

Scarica il file tutte le volte che vuoi

Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato

Recensioni
Ti è piaciuto questo appunto? Valutalo!

Altri appunti di Corso di laurea in informatica

Teoria degli insiemi parte 1
Appunto