Sei sulla pagina 1di 82

Capitolo 2

Paragrafo 2.1
I sistemi crittografici si possono classificare in 3 categorie, in base alle tecniche
che utilizzano per cifrare il testo :
1. In base al tipo di operazione utilizzata per produrre il testo cifrato a
partire dal testo in chiaro . IL linea generale ogni algoritmo di cifratura è
basato su due principi:
a. Sostituzione, ogni elemento del testo in chiaro è mappato su un
altro elemento.
b. Trasposizione, l’ ordine degli elementi del testo cifrato è cambiato
rispetto a quello del testo in chiaro, l’ importante è fare in modo di
non avere perdita di informazione.
2. Il numero di chiavi usate, Se il mittente e il destinatario utilizzano la
stessa chiave parliamo di chiave simmetrica, la chiave è detta
simmetrica poiché cifriamo e decifriamo con la stessa chiave, altrimenti
parliamo di chiave assimetrica.
3. Il modo in cui il testo in chiaro è processato, esistono cifrari a blocchi che
cifrano un blocco di testo alla volta producendo blocchi di testo cifrati e
cifrari a flusso che producono un elemento cifrato alla volta.

STUDIARE TUTTO IL CAPITOLO SUGLI ATTACCHI MI SERVIRA’

One-Time-Pad
Questo schema di crittografia ha le seguenti caratteristiche:
 Chiave lunga quanto il messaggio in chiaro, scelta in modo casuale in
modo che non si ripetano
 Ogni nuovo messaggio richiede una nuova chiave, cioè una singola
chiave è usata per cifrare il messaggio e decifrarlo dopo viene scartata
Un sistema crittografico di questo tipo è detto a segretezza perfetta poiché il
testo cifrato prodotto non ha alcuna correlazione con il testo in chiaro, per cui l’
unica cosa che l’ attaccante conosce è la lunghezza del testo in chiaro.
Svantaggi:
a. Se il testo in chiaro è molto pesante dobbiamo generare una stringa
pseudocasuale altrettanto grande che non si ripeta a ogni messaggio e
questo è un problema
b. La chiave deve essere resa disponibile a tutti e due gli utenti in maniera
indipendente e attraverso un canale sicuro , se la chiave fosse modificata
renderebbe il testo illegibile, e il fatto che la chiave sia molto grande crea
problemi logistici
funzionamento del cifrario one-time-pad
Per le proprietà dello XOR cifratura e decifratura sono la stessa cosa.
Il sistema è a segretezza perfetta dovuta al fatto che come già detto la
chiave è scelta in maniera casuale, per cui l’ unico attacco possibile è il
brute-force, provando tutte le chiavi è plausibile che ci siano più testi in
chiaro leggibili e a questo punto cosa scegliamo? Se la chiave non fosse
stata scelta in maniera casuale l’ attaccante avrebbe avuto dei criteri per
scegliere la chiave migliore, ma così non è per cui rimane a segretezza
perfetta.
Cifrari a blocchi capitolo 3
Paragrafo 3.1
Esistono 2 fondamentali differenze, tra i cifrari:
 Cifrari a flusso, cifra un bit alla volta, come per esempio one-time-pad .
Per ragioni pratiche il generatore di chiavi dev’ essere software e deve
produrre stringhe crittograficamente sicure, cioè da porzioni vecchie di
chiave non dev’essere possibile capire quale sarà la prossima chiave
prodotta.
 Cifrari a blocco, un blocco di testo in chiaro è utilizzato per produrre un
blocco cifrato di uguale lunghezza, in molti algoritmi si utilizzano blocchi
di 64 / 128 bits. Proprio come per i cifrari a flusso nel cifrari a
blocchi gli interlocutori condividono una chiave simmetrica
Diffusione e confusione
Ogni sistema crittografico a blocchi deve essere costruito a partire da questi 2
principi dettati da shannon, egli dice che in un cifrario ideale tutte le statistiche
del testo cifrato devono essere indipendenti dalla chiave, in questo modo non è
possibile che l’ attaccante possa dedurre la chiave analizzando il testo cifrato.
Questo può essere ottenuto con i principi di diffusione e confusione:
 Diffusione, ogni carattere del testo in chiaro influenza più caratteri del
testo cifrato in questo modo la correlazione tra testo in chiaro e cifrato
diminuisce
Esempio di come può essere ottenuta la
diffusione il yn carattere de carattere del testo cifrato è
ottenuto attraverso un operazione di operazione di media di k
caratteri.
In un cifrario binario la diffusione può essere ottenuta applicando operazioni
di permutazione seguite dall’ applicazione di una qualche funzione che
trasforma il testo e di nuovo una permutazione; l’ effetto della diffusione è
che un solo bit nel testo cifrato influenza più bit del testo in chiaro, in questo
modo eliminiamo le correlazioni statistiche tra il testo in chiaro e testo
cifrato e rendiamo più difficile dedurre la chiave.
La trasformazione del blocco del testo viene fatta attraverso la chiave, il
principio di confusione fa in modo di rende il più complesso possibile la
relazione tra chiave e blocco cifrato in modo che non sia possibile scoprire la
chiave. Questo viene ottenuto utilizzando algoritmi di sostituzione molto
complessi.
Cifrari a flusso
Un tipico cifrario a flusso cifra il testo in chiaro un byte alla volta, ma potrebbe
anche essere progettato per lavorare 1 bit alla volta oppure unità più grandi.

Figure 1: Tipica struttura di un cifrario a flusso

La chiave viene data in input ad un generatore pseudocasuale, il quale produce


una sequenza pseudocasuale di 8 bit (keystream). La keystream è messa in
XOR, con l’operazione di OR esclusivo un byte alla volta, con il testo in chiaro.
La differenza con one time pad è che une time pad utilizzava una sequenza
casuale. Considerazioni importanti per un cifrario a flusso:
1. Un generatore pseudocasuale utilizza una funzione che produce
una sequenza deterministica di bit, che possono ripetersi, più
raramente queste sequenze si ripetono più difficile sarà fare
attacchi di tipo crittoanalisi.
2. La sequenza pseudocausale deve assomigliare il più possibile ad
una vera sequenza casuale, per esempio dovrebbero esserci più o
meno lo stesso numero di 0,1. se la chiave è di 1 byte allora tutti i
256 valori possibili dovrebbero essere generati egualmente spesso,
più la sequenza è casuale più il testo cifrato lo sarà e di
conseguenza gli attacchi di tipo crittoanalisi saranno più complicati.
3. La sequenza generata è basata sulla chiave, per cui per evitare
attacchi di tipo brute force è desiderabile avere chiavi lunghe.
I vantaggi rispetto a cifrari a blocchi è che i cifrari a flusso sono più veloci e
richiedono meno codice. L’utilizzo di cifrari a flusso è però diminuito
considerevolmente negli ultimi anni soprattutto dovuto all’introduzione di AES
che è molto veloce a livello software, inoltre sono anche disponibili tecniche di
accelerazione a livello hardware. Un vantaggio dei cifrari a blocchi è che si
possono riutilizzare le chiavi, in un cifrario a flusso se noi abbiamo due testi in
chiaro A e B, se effettuiamo uno XOR con la stessa chiave K otteniamo i testi
cifrati C1 e C2 a questo punto se li mettiamo in XOR (A XOR K) XOR (B XOR K)
otteniamo lo XOR dei testi in chiaro un attacco di tipo crittoanalisi potrebbe
avere successo in questo caso. Un cifrario a flusso è più adatto per la cifratura
di flussi di dati.
RC4
RC4 è un cifrario a lunghezza di chiave variabile con operazioni orientate ai
byte.
Paragrafo 5.2
Il cifrario prende in
input blocchi di
testo da 16 bytes, la
lunghezza della
chiave può invece
essere di 16,24 e 32
bytes e sono usate
ciascuna da AES
128, AES 192 e AES
256.
Idea Generale
 L’ input viene
rappresentato
come una
matrice 4 x 4
di bytes
 Questa
matrice viene
copiata in uno
state array, il
quale viene
modifica a
ogni stato
della cifratura/
decifratura
 Lo state array
è copiato in
una matrice di
output

In modo simile
viene trattata la chiave.

L’ ordine dei byte nelle matrici avviene per colonne per cui i primi 4 byte del
testo in chiaro saranno rappresentati dalla prima colonna della matrice e così
via, stesso discorso vale per la chiave.
La chiave viene trattata più o meno come l’ input , dapprima rappresentata
tramite una matrice di byte viene espansa in un array di parole dove ogni
parola è costituita da 4 bytes, con chiavi da 128 bits, questo array contiene 44
parole.
La cifratura avviene in N rounds, dove il numero di rounds è definito dalla
lunghezza della chiave
I primi N – 1 round consistono ciascuno di 4 fasi distinte
di trasformazione:
1. SubBytes
2. ShiftRows
3. MixColumns
4. Aggiungi la chiave di round

L ‘ ultima fase contiene solo 3 trasformazioni e abbiamo una trasformazione


iniziale (aggiungi chiave di round) prima dell’ inizio del primo round. Come si
può vedere dalla figura ogni trasformazione prende in input ona o più matrici (4
x 4 in questo caso) e producono una matrice in output. L’ espansione della
chiave produce N + 1 chiavi di round ognuna delle quali viene rappresentata
come una matrice 4 x 4, le quali servono alla fase di trasformazione (aggiungi
chiave di round) a ogni round. L’ ultimo round produrrà il testo cifrato.
riepilogo
dei

parametri AES
Struttura nel dettaglio
Considerazioni:
[1] AES non
si riferisce
alla classica
struttura di
Feistel infatti
in Feistel una
metà del
blocco era
utilizzato per
modificare l’
altra metà e
poi si faceva
uno swap
delle due
metà, AES
modifica l’
intero blocco,
rappresentato da un'unica matrice, attraverso sostituzione e
permutazione.
[2] La chiave è espansa in un array di parole, con una chiave di 32
bytes abbiamo 44 parole, ogni chiave di round è costituita da 4 parole
w[0,3](prime quattro parole)

[3] ogni round è costituito da 4 fasi, una di permutazione e 3 di trasformazione

1. Sostituzione dei bytes


2. Shift Rows, una semplice permutazione
3. MixColumns, una sostituzione che utilizza l’aritmetica finita GF (2^8)
4. Aggiungi chiave di round, XOR bit a bit del blocco con una porzione
della chiave.

Come già detto il round 0 contiene solo aggiungi chiave di round.


Round di cifratura nello specifico, solo l’ ultima fase (addRoundKey) cifra,
poiché fa uso della chiave, le altre no infatti queste sono invertibili senza l’
utilizzo di chiave e questo è un deficit per la sicurezza, essenziali però per
aggiugere confusione, diffusione e non linearità al cifrario, caratteristiche che
shannon individua come essenziali per la struttura di un cifrario a blocchi.
Questo schema è molto efficiente e sicuro. Per quanto riguarda la decifratura le
prime tre fasi sono facilmente invertibili, per la quarta invece(addRoundKey)
basta per natura dello xor, mettere in xor il blocco con la stessa chiave di
round utilizzata per la cifratura (A XOR B XOR B = A ).
L’ algoritmo di decifratura varia da quello di cifratura, per esempio la chiave
espanse è utilizzata in ordine inverso e altre cose dovute alla strattura di AES.
Una volta che è stabilito che tutte le fasi sono invertibili è facile verificare che
si può tornare al testo di partenza.
Fasi più nel dettaglio
Sostituzione di byte
Viene utilizzata una S-BOX

Che contiene una permutazione dei 256 valori possibili con 8 bit, a questo
punto dato un byte originale del blocco, esempio 51, viene sostituito dal 5 byte
a sinistra e dal 1 byte a destra, che nella tabella ha valore 59.
La tabella può essere fissata in questo modo per l’implementazione non serve
conoscere la progettazione, oppure progettata, in questo modo possiamo
prevenire gli attacchi noti.
Scorrimento di righe

A partire dalla seconda riga effettua uno shift circolare di 1 byte, nella terza di
2 byte e nella 4 di 3 byte, in questo modo aumentiamo la diffusione.
Mischiare colonne

calcolo per ottenere 7b

viene introdotta una matrice di costanti e moltiplicata per la matrice per cui
vogliamo mischiare le colonne in matematica GF(8). Per decifrare serve la
matrice inversa.
Aggiunta chiave di Round
Semplice XOR bit a bit con la chiave di round.
Espansione della chiave
Inizialmente la chiave da 16 bytes viene copiata nelle prime 4 word del vettore,
in seguito in iterazione vengono create le chiavi che dipendono dai 4 word
precedenti.

Questa progettazione resiste ad attacchi noti inoltre:


1. È invertibile
2. Parte della chiave non fornisce informazioni su altre parti di chiavi
3. È veloce su molte CPU
4. Utilizza costanti di round per rompere la simmetria
5. Diffusione bit di chiave nelle chiavi di round
6. Abbastanza non lineare per rendere l’analisi difficile
7. Semplicità di descrizione
La decifratura è quasi identica alla cifratura.
ECB
Un cifrario a blocchi cifra blocchi di testo in chiaro di lunghezza b bits e una
chiave e produce un blocco di testo cifrato da b-bits, se il blocco di testo in
chiaro è > del blocco di testo cifrato possiamo operare in modi diversi, il modo
più semplice è utilizzare ECB (electronic code book ), in ECB suddividiamo il
testo il chiaro in n blocchi da b-bits l’ uno, ogni blocco viene cifrato con la
stessa chiave , se nel testo ci sono blocchi che contengono lo stesso
messaggio(in chiaro) ECB produce blocchi di testo sempre uguali, questa
vulnerabilità può essere utilizzata dai crittoanalisti per decifrare blocchi di
testo cifrato, per questo motivo ECB non è adatto a cifrare messaggi lunghi,
viene spesso utilizzato per inviare chiavi.

All’ ultimo blocco se necessario viene inserito un padding, che serve quando il
blocco non è un multiplo del blocco cifrato.
CBC
Il blocco
di testo in
chiaro
viene
messo in
OR
esclusivo
con il
blocco
cifrato,
utilizzando la stessa chiave, per eliminare per fare in modo che ogni blocco di
testo in chiaro uguale abbia un blocco di testo cifrato differente si mette in XOR
il blocco di testo cifrato precedentemente con il testo in chiaro da cifrare e poi
si esegue la cifratura. Per quanto riguarda la decifratura viene effettuata la
decifratura del blocco di testo cifrato, e otteniamo: A XOR B, cioè il blocco di
testo in chiaro xorato con il blocco cifrato precedentemente, questo viene
messo in xor con il blocco di testo cifrato precedentemente e otteniamo A,
sfruttando la proprietà dello XOR che ci dice Pi+1 XOR Ci XOR Ci = Pi+1.
Chiaramente al primo passaggio non abbiamo un blocco “precedente” da
xorare con il testo in chiaro utilizziamo quindi un vettore iniziale, che viene
utilizzato anche nel primo passo di decifratura. Questo implica che IV sia
conosciuto sia dal mittente che dal ricevente. Per questo motivo è importante
proteggere IV, poiché modificando bit di IV è possibile invertire i bit del primo
testo in chiaro, stessa cosa per i blocchi di testo cifrato, per questo motivo
questo blocco è inviato con ECB. Uno svantaggio di questo metodo è che i
blocchi non possono essere cifrati/decifrati in maniera indipendente.

Anche in questo caso al blocco finale viene aggiunto il padding se la sua


grandezza non è multiplo di b (grandezza del blocco cifrato)
NOTA: la scelta di IV è importante solitamente si scelgono blocchi di dati
pseudocasuali.
CFB (cipher feedback)
Metodo per convertire un cifrario a blocchi in uno a flusso, in questo modo
possiamo operare in tempo reale (cifrare un bit e trasmetterlo subito) e non
abbiamo bisogno che il testo venga suddiviso in blocchi di b bits. Una
caratteristica importante è che la lunghezza del flusso di caratteri in chiaro sia
di dimensione equivalente a quelli del testo cifrato, se per esempio la
dimensione di un carattere in chiaro è 1 byte il corrispondente cifrato sarà da 1
byte. Nel caso la dimensione di ogni carattere cifrato sia maggiore della
dimensione dei caratteri del testo in chiaro si spreca potenza di trasmissione.
L’ unità di trasmissione è s bits. L’ unità di trasmissione viene xorata con il
testo cifrato, proprio come in CBC, una volta xorata può essere trasmessa.
Cifratura
La cifratura inizia con un registro di shift, posto inizialmente al valore del
vettore iniziale questo viene cifrato con la chiave, a questo punto, prendiamo s
bits del testo in chiaro e li mettiamo in xor con s bits del testo cifrato, al
secondo passo il contenuto dello shift register viene traslato di s bits e il testo
cifrato prodotto al passo precedente viene posto nei bit meno significativi dello
shift register il processo è poi iterato fino a quando tutto il testo in chiaro è
stato cifrato.
Per la decifratura lo schema è lo stesso, ad eccezione del fatto che il testo
cifrato ricevuto viene messo in XOR con gli s bits più significativi del risultato
della funzione di cifratura.
L’ utilizzo della funzione di cifratura nella decifratura è giustificato dalla
seguente proprietà:
CFB può essere definito in questo modo:
dove I equivale al contenuto dello shift
register.

Pur essendo un cifrario a flusso a delle caratteristiche che non sono conformi a
quelle dei cifrari a flusso, un tipico cifrario a flusso prende in input un valore
iniziale e una chiave, in seguito viene generato un valore pseudocasuale il
quale viene xorato con il testo in chiaro, nel caso di CFB invece lo stream di
bits che viene xorato con il testo in chiaro dipende a sua volta dal testo in
chiaro, questo perché l’ input di ciascuna operazione di cifratura è il risultato
della precedente operazione di cifratura. Proprio per questo motivo le
operazioni di cifratura non possono avvenire in parallelo, la decifratura invece
può avvenire in parallelo se i blocchi sono prima costruiti in serie a partire da IV
e il blocco cifrato (che ci è arrivato). Per quanto riguarda la propagazione degli
errori, modificando un bit di IV (supponiamo per comodità che sia nei primi s
bits ) l’errore viene propagato ai blocchi successivi.

OFB
Con OFB il risultato della cifratura viene utilizzato per la cifratura del successivo
blocco di dati in chiaro. La differenza con CFB è che esso lavorava con un
sottoinsieme del blocco, il quale veniva passato poi per la cifratura successiva,
mentre in OFB quando facciamo lo XOR, lavoriamo su tutto il blocco.
Così viene definito OFB

Nel caso l’ultimo blocco sia di u bits per cui u < b, per fare lo XOR con il blocco
di b bits O, vengono utilizzati per lo XOR soltanto i primi u bits, gli altri b – u
bits vengono scartati.
Come per le altre modalità OFB richiede un vettore iniziale IV, che deve essere
unico a ogni esecuzione, questo perché la cifratura dipende solo dalla chiave e
dal vettore iniziale, e non dal testo in chiaro come CFB, inoltre dato un IV e una
chiave la sequenza di bit che viene messa in XOR è sempre la stessa per cui è
molto importante che a ogni esecuzione IV cambi.
Un vantaggio importante è che gli errori non si propagano, se blocco cifrato è
corrotto esempio C1, allora solo P1 sarà corrotto. Rispetto a CFB è più
vulnerabile ad attacchi che modificano il messaggio, visto che complementare
un bit sul testo cifrato equivale a modificarlo sul testo in chiaro, per cui
modificando il testo cifrato è possibile controllare il testo in chiaro.
La
decifratura avviene nello stesso modo.
Counter Mode (CTR)

Per ogni blocco di cifratura utilizziamo un counter di dimensione uguale al


blocco di testo in chiaro da cifrare. Ogni blocco deve avere un valore diverso,
per cui solitamente si genera un valore iniziale e poi viene fatta un operazione
del ti<po COUNTER + 1 % b (dimensione del blocco).
Per la cifratura il counter è cifrato con la chiave e poi messo in XOR con il testo
in chiaro per ottenere il testo cifrato, questo blocco non viene utilizzato nelle
cifrature successive.
Per la decifratura devono essere utilizzati gli stessi valori di COUNTER che
vengono messi in XOR per ottenere il messaggio in chiaro.
Il counter iniziale deve essere reso disponibile sia a mittente che destinatario.
CTR viene così definito.

Per quanto riguarda l’ultimo blocco di testo in chiaro il quale potrebbe essere
un blocco di dimensione parziale, si adotta la stessa soluzione, che si adotta
per OFB, cioè si prendono solo gli u bits più significativi del blocco cifrato e si
mette in XOR, scartando gli altri b - u bits.
CTR impone dei requisiti:
1. Il valore di counter iniziale deve essere un nounce, il quale deve essere
diverso per tutti i messaggi cifrati usando la stessa chiave
2. Tutti i valori di counter devono essere distinti, quindi non ci possono
essere due valori di counter uguali
Nel caso non si rispettino questi requisiti, e venga riutilizzato più volte lo stesso
valore di counter, la riservatezza di tutti i messaggi associati a quel valore di
counter è compromessa. Se l’attaccante scopre un blocco di testo in chiaro
cifrato, il quale è stato cifrato con un determinato counter, può facilmente
recuperare l’output della funzione di cifratura facendo uno XOR con il testo
cifrato, il quale permette molto facilmente di recuperare il testo in chiaro di
altri blocchi cifrati con lo stesso counter, basta un solo XOR con il
corrispondente testo cifrato(sempre per la proprietà A XOR B XOR B = A).
Per fare in modo di scegliere sempre counter differenti si incrementa il valore
del counter di 1 anche tra un messaggio e l’altro, oltre che quando dividiamo il
testo in blocchi.
L’ efficienza hardware è molto elevata in CTR, non avendo dipendenze tra le
operazioni di cifratura possiamo parallelizzarle, massimizzando il throughput.
L’ efficienza software è altrettanto buona, poiché possiamo sfruttare il
parallelismo .Inoltre è possibile fare preprocessing, se i requisiti di sicurezza
sono rispettati è possibile cifrare in anticipo il counter in modo che quando ci
sarà da cifrare/decifrare basterà fare una serie di XOR. Un altro vantaggio è
che possiamo anche non decifrare tutto il messaggio, ma solo alcuni blocchi.
Inoltre è sicuro come gli altri algoritmi visti in precedenza e non c’è bisogno di
implementare l’algoritmo di decifratura.

Cifratura In ISO/OSI
//FARE DOPO
PKSC
Standard di sicurezza definito da RSA.
Robustezza di DES
DES utilizza chiavi a 56 bits, ci sono quindi 256 chiavi, il numero di chiavi è
talmente elevato da vanificare un attacco brute force. Supponendo di avere
una macchina che ogni microsecondo genera una chiave e prova a fare una
cifratura, sapendo che bisogni provare almeno la metà di tutte le chiavi
possibili, ci metteremmo più di mille anni a rompere il cifrario. Tuttavia l’
assunzione di una cifratura ogni microsecondo non è conservativa nel tempo.
Già nel 1977 diffie-hellman, postularono che sfruttando la tecnologia esistente
potessero costruire una macchina che rompesse il cifrario in 10 ore, spendendo
all’ incirca 1 milione di dollari. Con la tecnologia corrente non serve nemmeno
costruire hardware specializzato, i moderni processori sono in grado di provare
103 chiavi al millisecondo.

Con chiavi più lunghe di 56 bits risulta praticamente “”impossibile”” decifrare il


testo cifrato utilizzando il bruteforce.
Sostituzione di DES
A un certo punto si rese necessario sostituire DES, per i motivi sopra elencati e
anche perché era troppo lento. Fu indetta una gara per definire un nuovo
cifrario a blocchi dopo alcuni test e selezioni furono selezionati 5 cifrari, AES
vinse per la sua semplicità.
Triplo DES
Il triplo DES utilizza 3 chiavi e 3 esecuzioni dell’algoritmo DES (cifratura –
decifratura – cifratura)

l ‘ operazione di decifratura viene introdotta per questioni di compatibilità con il


vecchio DES in questo modo è possibile continuare a decifrare con il vecchio
DES.
La decifratura avviene allo stesso modo, utilizzando però le chiavi in ordine
inverso

Il fatto che vengano utilizzate 3 chiavi diverse è come se la lunghezza effettiva


di chiave fosse 56 bits x 3/2(alcune indacazioni dicono che K1 = K3)).
chiavi lunghi prevengono
gli attacchi forza bruta.

Classificazione dei
cifrari in base agli attacchi al quale è vulnerabile
Lo scopo solitamente non è scoprire il testo in chiaro di un determinato
messaggio quanto piuttosto recuperare la chiave utilizzata, esistono 2 approcci
per attaccare un sistema crittografico:
1. Criptoanalisi, attacchi che fanno affidamento sulla natura dell’algoritmo
oppure anche coppie (VALORE CIFRATO, VALORE IN CHIARO) note.
2. Attacchi forza bruta, l’attaccante prova tutte le chiavi possibili finché non
ottiene un testo in chiaro leggibile, studi dimostrano che bisogna provare
almeno metà delle chiavi per poter trovare il testo in chiaro
corrispondente.
Classificazione degli attacchi di tipo criptoanalisi sulla base delle informazioni
che il criptoanalista
conosce

L’
attacco più difficile è quando è noto solo il testo cifrato, in questo caso un
approccio possibile è il brute force, provo a decifrare il testo generando tutte le
chiavi possibili, se la lunghezza delle chiavi è molto elevata l’attacco diventa
impraticabile. L’ attaccante deve fare affidamento su un’analisi del testo
cifrato, effettuata attraverso test statistici. L’ attaccante per analizzare il testo
deve anche conoscere la struttura del testo in chiaro, esempio: è un file
eseguibile oppure è un file di testo scritto in inglese e così via. In questi casi è
semplice divendersi.
Ma non è sempre così, esempio l’attaccante potrebbe intercettare coppie di
messaggi (testo in chiaro, testo cifrato ) oppure l’ analista conosce
determinati pattern del testo in chiaro, esempio un header sempre uguale,
osservando il modo in cui il testo è trasformati, l’ analista potrebbe dedurre la
chiave utilizzata. Strettamente correlato a questo tipo di attacco troviamo l’
attacco basato su parole probabili.
In attacchi di tipo chosen plaintext l’ avversario è in grado di cifrare un
qualsiasi testo in chiaro, esempio l’ avversario intercetta un messaggio e
inserisce un suo testo da cifrare, l’ analista può scegliere sequenze di testo che
rivelino la chiave.
Sono possibili altri 2 tipi di attacchi: chosen ciphertext e chosen text. Sono
attacchi meno frequenti, ma comunque attacchi possibili.
Un sistema crittografico è detto computazionalmente sicuro se il testo cifrato
generato soddisfa i 2 requistiti:
1. Il costo per rendere inefficace il cifrario supera il valore dell’informazione
cifrata
2. Il tempo necessario per rendere inefficace il cifrario supera l’arco
temporale in cui l’ informazione ha una qualche utilità.
Un sistema crittografico è detto uncondittionaly sicuro se sono rispettati i 2
criteri di sopra e il testo cifrato generale non contiene abbastanza informazioni
per poter decifrare il testo (deve essere impossibile per l’attaccante decifrare)
ad eccezione di one time pad non esistono cifrari unconditionally sicuri.
Sfortunatamente stimare il tempo richiesto per far sì che un attacco
criptoanalitico abbia successo è molto difficile, mentre per attacchi di tipo forza
bruta è possibile fare stime su costi e tempi.
Un attacco forza bruta prevede di provare tutte le chiavi possibili finché non si
ottiene una decifratura leggibile del testo in chiaro. In media si devono provare
almeno metà di tutte le chiavi possibili per scoprire la chiave giusta. Se il testo
in chiaro ottenuto mediante brute force è semplicemente un testo in scritto in
inglese allora è facile rendersi conto che l’attacco ha avutp successo, se invece
il testo è stato compresso prima della cifratura allora è più difficile rendersi
conto se l’attacco ha avuto successo o meno. Questo fa sì che il processo di
verificare se il testo in chiaro è leggibile non sempre può essere automatizzato.
Sistemi a chiave pubblica
I sistemi crittografici a chiave pubblica nascono per sopperire ai problemi di
quelli a chiave simmetrica:
1. La distribuzione delle chiavi, abbiamo bisogno che i partecipanti alla
comunicazione:
a. O condividano già la chiave prima di iniziare la comunicazione, la
quale è stata condivisa in quale modo.
b. O ci sia una sorta di controllore centrale che distribuisce le chiavi
Proprio questo secondo punto va contro il principio di crittografia, cioè il fatto di
costringere 2 utenti a distribuire le proprie chiavi attraverso un controllore
centrale, che potrebbe essere compromesso da un mal intenzionato.
Il secondo problema dei sistemi a chiavi simmetrica è correlato alla firma
digitale, cioè in un’epoca in cui la crittografia non è più usata solo a scopo
militare, ma anche in attività commerciali esiste un modo per firmare un
documento? Cioè esiste un modo per verificare che un messaggio digitale è
stato inviato a una determinata persona?
Diffie-Hellman nel 1976 proposero un sistema crittografico a chiave pubblica.
Gli algoritmi a chiave assimetrica utilizzano una chiave per la cifratura e una
chiave differente ma collegata, per la decifratura, gli algoritmi di questo tipo
hanno una caratteristica importanti:
 Data la chiave di cifratura e l’algoritmo di cifratura è
computazionalmente difficile determinare la chiave di decifratura
Inoltre, algoritmi come RSA hanno le seguenti caratteristiche aggiuntive.
 Una qualsiasi delle due chiavi può essere utilizzata per la cifratura e l’altra
per la decifratura
Caratteristiche di un sistema a chiave pubblica

 Algoritmo di cifratura, esegue varie trasformazioni sul testo in chiaro


 Chiave pubblica e privata, coppia di chiavi per cui una è stata selezionata
per essere utilizzata in cifratura e di conseguenza l’altra in decifratura
 Testo cifrato, testo prodotto dall’algoritmo dipende dalla chiave e dal
testo in chiaro per cui se avessi cifrato con la chiave privata il testo
cifrato sarebbe stato differente.
 Algoritmo di decifratura, dato il testo cifrato e la chiave produce il testo
in chiaro
La comunicazione tra Alice e Bob funziona in questo modo:
 Alice e Bob generano ciascuno una coppia di chiavi, che verranno
utilizzate per la cifratura/decifratura dei messaggi.
 Ogni utente trasmette la propria chiave pubblica all’altro, inserendola
magari in un registro pubblico accessibile a tutti e mantiene l’altra
chiave privata.
 A questo punto Bob che vuole inviare un messaggio Ad alice ha la
chiave pubblica di Alice per cui cifra con la sua chiave ed invia.
 Alice decifra con la sua chiave privata.
Con questo sistema le chiavi pubbliche sono distribuite a tutti, mentre le chiavi
private sono mantenute segrete da ogni partecipante (NON DEVONO ESSERE
DISTRIBUITE) finché nessuno si impossessa di chiavi private altrui le
comunicazioni sono sicure. In caso la chiave privata venga sottratta o
comunque in qualsiasi momento si voglia è possibile generare una nuova
coppia di chiavi e pubblicare la corrispondete pubblica.

La figura di sopra mosta le differenze tra i sistemi tradizionali a chiave simmetrica e


quelli a chiave pubblica.
Comunicazione nel dettaglio

Abbiamo una sorgente A che produce un messaggio X, il destinatario B genera una


coppia di chiavi, la cui chiave pubblica è accessibile da A, attraverso la quale produce
il messaggio cifrato Y, a destinazione B con la sua chiave privata può decifrare il
messaggio(Il tutto comunque sintetizzato nella figura di sopra).
Un attaccante, che riesce a intercettare Y (il messaggio cifrato) ed ha accesso a PU b ,
ma che non ha accesso a PRb e X (messaggio in chiaro) deve tentare di recuperare
PRb o X, nel primo caso l’ attaccante sarà in grado di recuperare tutti i messaggi futuri
e passati, nel secondo solo X.

Figura 1 Cifratura con chiave privata

Mentre lo schema precedente (Cifratura con chiave pubblica) forniva


riservatezza, qua abbiamo un meccanismo di autenticazione. In questo caso
infatti A cifra un messaggio per B utilizzando PRa (le chiavi sono
interscambiabili) e B decifra utilizzando la chiave pubblica di A, siccome la
chiave privata di A dovrebbe essere conosciuta solo ad A, allora B è sicuro che
il messaggio sia arrivato da A, e siamo anche sicuri che il messaggio non sia
stato alterato poiché può essere modificato solo con la chiave di A per cui il
messaggio è autenticato sia in termini di sorgente (da chi è arrivato) sia in
termini di integrità. Inoltre, l’intero messaggio serve come firma digitale.
Sebbene questo meccanismo offra una convalidata di autore e integrità del
messaggio richiede un grande quantitativo di spazio, per ogni documento
dobbiamo memorizzare il testo in chiaro per motivi pratici, e una copia deve
essere memorizzata nel testo cifrato, in modo che l’origine e il contenuto
possano essere verificati in caso di controversia. Chiaramente vogliamo
rendere il processo di autenticazione più leggero. Per far questo ci basta cifrare
un piccolo blocco di bits che è funzione del documento, cioè non si può
modificare il documento senza modificare questo blocco. In gergo questo
blocco è chiamato autenticatore, con questo schema solo l’autenticatore viene
cifrato il resto del messaggio è inviato in chiaro. Questo schema non fornisce
però la riservatezza, infatti il messaggio, si non può essere modificato ma, può
essere intercettato, inoltre per decifrare ci basta utilizzare la chiave pubblica
del trasmittente. Uno schema a doppia cifratura come il seguente fornisce
anche la riservatezza:
Applicazioni per gli algoritmi a chiave pubblica
Possiamo classificare i sistemi di cifratura a chiave pubblica in 3 gruppi a
seconda di come utilizzano la chiave privata e pubblica per eseguire funzioni di
cifratura:
 Cifratura/decifratura, il trasmittente cifra un messaggio con la chiave
pubblica del destinatario
 Firma digitale, il trasmittente “firma” un messaggio con la propria
chiave privata, il documento viene firmato attraverso un algoritmo
crittografico applicato al documento o a un blocco di bits
 Scambio di chiavi, mittente e ricevitore comunicano per scambiarsi una
chiave di sessione, in questo caso abbiamo diversi approcci che
coinvolgono la chiave privata o le chiavi private di entrambe le parti

Requisiti per un sistema crittografico a chiave pubblica


Diffie-Hellman postularono un sistema crittografico a chiave pubblica senza
dimostrare che tale algoritmo esistesse davvero, ma fornirono delle specifiche
che l’algoritmo doveva soddisfarre:
 Dev’essere computazionalmente semplice per B generare la coppia di
chiavi
 Dev’essere computazionalmente semplice per A conoscere la chiave
pubblica di B e il messaggio che deve cifrare M per generare il
corrispondente cifrato C = E(PUb, M)
 Dev’essere computazionalmente semplice per B decifrare il messaggio
usando la propia chiave privata M = D (PRb, C) = D [PRb, E (PUb, M)]
 Dev’essere computazionalmente impossibile per un attaccante
determinare la chiave privata a partire dalla chiave pubblica.
 Dev’essere computazionalmente impossibile per un attaccante
determinare il messaggio in chiaro M a partire dalla chiave pubblica e dal
messaggio cifrato
Public Key criptoanalisi
Un sistema a chiave pubblica è vulnerabile ad attacchi di tipo brute force, per
cui si utilizzano chiavi abbastanza lunghe, in modo da rendere impraticabile un
attacco di tipo brute force, considerando però che i sistemi a chiave pubblica si
basano sull’ utilizzo di funzioni matematiche hash, e la complessità di queste
funzioni potrebbe non crescere linearmente al numero di bits della chiave. Un
altro tipo di attacco è ottenere dalla chiave pubblica quella privata, non è
matematicamente provato che questo sia possibile in tempi umani. Un ultimo
tipo di attacco consiste nell’ intercettare un messaggio, supponendo che
l’avversario sappia che il messaggio consiste in una chiave DES a 56 bits,
quello che l’attaccante può fare è cifrare tutte le possibili chiavi a 56 bits, e
confrontando il testo cifrato può scoprire la chiave cifrata.

RSA
RSA è un cifrario in cui testo in chiaro e testo cifrato sono interi compresi tra 0
e n – 1, per un qualche numero n; tipicamente 1024 bits.
Il testo in chiaro viene cifrato in blocchi, ogni blocco ha un valore binario < n.
Dove n è compreso 2i <= n <= 2i+1 .Dove i bits sono la grandezza del blocco.
La cifratura e decifratura funzionano in questo modo:
sia ricevente che
mittente conoscono il
valore di n, solo il
mittente conosce il
valore di e mentre il ricevente conosce il valore di d. Questo algoritmo è a
chiave pubblica con PU = {e, n} e una chiave privata PK = {d ,n}. Affinché
questo algoritmo possa essere utilizzato per la cifratura a chiave pubblica
devono essere soddisfatti i seguenti requisiti:
 È possibile trovare valori di e,d,n tali che Med = M mod n per ogni M < n.
 È relativamente semplice calcolare Me e Cd M < n
 Dato e ed n è difficile, a livello computazionale, calcolare d.
Per il primo requisito possiamo esprimere Med = M mod n, come ed mod ф(n) =
1, dove ф(n) è la funzione di eulero, che è equivalente a dire:
cioè e ed d sono inversi moltiplicativi modulo n, in
matematica modulare questa affermazione è vera solo
se e ed d sono primi modulo n ( gcd (ф(n),e) ).

Figura 2

Parametri RSA.

La comunicazione con RSA funziona in questo modo:


l’ utente A pubblica la sua chiave pubblica {e, n} , l’ utente B vuole mandare un
messaggio ad A, per cui calcola C = Me mod n e trasmette, in ricezione l’ utente A
utilizza la propria chiave privata {d,n} per decifrare il messaggio M = Cd mod n.

Funzionamento di RSA
Figura 3 Riepilogo del funzionamento di RSA

La sicurezza di RSA
Ci sono 5 approcci possibili per attaccare RSA
1) Brute force, provo tutte le chiavi private
2) Attacchi matematici
3) Timing Attacks
4) Attacchi basati su vulnerabilità hardware
5) Chosen ciphertext attacks
Per la difesa contro gli attacchi forza bruta si scelgono chiavi di grosse dimensioni, in
termini di attacchi forza bruta più il numero di bit di d è grande meglio è, il problema è
che sia la generazione delle chiavi sia cifratura / decifratura, sono tanto più complessi
quanto più la chiave è lunga, quindi rallentano il funzionamento del sistema,
importante è trovare il giusto trade off.

Attacchi Matematici
Esistono 3 approcci
1) Calcolare i due numeri primi che compongono n, questo permette di calcolare
ф (n) = (p - 1) * (q -1), il quale ci permette di calcolare d
2) Determinare ф (n) senza determinare prima p, q. Anche in questo caso siamo in
grado di calcolare d
3) Determinare direttamente d, senza prima calcolare ф (n).
La tabella mostra i progressi raggiunti nel fattorizzare n, con chiavi sempre più grandi.
Questo progresso è dovuto sia all’ evoluzione tecnologica sia all’ impiego di algoritmi
sempre più efficienti per la fattorizzazione.
differenza di velocità tra due algoritmi di
fattorizzazione molto efficienti.

Per quanto riguarda la scelta di p, q si


consiglia valori che siano difficili da fattorizzare, i ricercatori suggeriscono:
1) I valori di p, q dovrebbero differire di poche cifre l’uno dall’ altro, per esempio
con RSA a 1024 bits i valori di p, q si dovrebbero aggirare tra 10^75 a 10^100.
2) Sia (p - 1) che (q - 1) dovrebbero contenere un prime factor molto alto.
3) Gcd(p - 1,q - 1) dovrebbe essere piccolo.
Inoltre è dimostrato che se e < n allora d < n^(1/4), per cui d può esssere più
facilmente calcolato.
Attacchi CCA
Utilizzano proprietà di RSA per ricavare il testo in chiaro.
RSA è vulnerabile al chosen ciphertext attack (CCA). L’hacker intercettando I dati scambiati tra Alice e Bob entra in
possesso del messaggio cifrato C. L’hacker può ricavare il messaggio M sfruttando la collaborazione incosapevole di
Alice (destinatario di M). L’hacker manda ad Alice un messaggio Y chiedendole di restituirlo codificato proprio con la
chiave privata di essa. Cosi Y viene costruito nel seguente modo dal malintenzionato:
• sceglie un numero casuale R
• ricava X=Re mod n (l’hacker conosce e,ed il modulo n, che sono I componenti PU di Alice)
• ricava Y = (X * C) mod n, e lo invia ad Alice
• ricava T = R-1 mod n
Se Alice, ricevuto Y, esaudisce le richieste dell’hacker, la sua rispostà vale U = Yd mod n.
A questo punto è possibile ricavare il messaggio originario M effettuando la seguente trasformazione:
M’ = ( T x U) mod n. Infatti (TxU) mod n = R-1 Yd mod n = R-1 Xd Cd mod n = R-1 Rcd mod n = Cd mod n = M
Per evitare che l’attaccante ricavi M, occorre fare attenzione all’uso che si fa della propria chiave privata per codificare
I messaggi generati localmente. E si suggerisce di inserire un paddin randomico in modo da rendere non più valida l’
equazione di sopra.
Calcolo della potenza in modulo
Per cifrare / decifrare dobbiamo calcolare delle potenze in modulo n, per farlo
possiamo utilizzare l’algoritmo dei quadrati ripetuti.
questo metodo utilizza i bits dell’esponente per
determinare quali potenze sono calcolate.

Per esempio se l’esponente ha 4 bits (1101),


l’algoritmo procede con quattro iterazioni + 1 (fase di inizializzazione).

Complessità
O((n log(x))^k)
Scambio di chiavi con diffie-hellman
Lo scopo di questo algoritmo è permettere lo scambio sicuro di una chiave, che viene
poi utilizzata per uno scambio di messaggi a chiave simmetrica.
L’ efficacia di questo algoritmo dipende dalla complessità nel calcolare logaritmi
discreti.
Cioè data la definizione di primitive root di un numero primo p, cioè un
numero il quale elevato a k , dove k è compreso tra 0 e p – 1, restituisce tutti
i numeri da 0 a p-1.
L’ esponente i è detto logaritmo discreto.

Funzionamento Algoritmo
αk ≡ a (mod q),
questa relazione è
detta primative
root, cioè α è una
primative root di q
se ogni numero a
coprimo con q è
congruente a αk
modulo n.
In figura un
semplice protocollo
basato su RSA.

Alice genera un numero casuale Xa < q e calcola Ya = αXa mod q. Allo stesso modo
Bob calcola Xb e Yb indipendentemente da Alice. X viene utilizzata come chiave
privata e Y come chiave pubblica. A seguito di questo alice condivide la propria chiave
pubblica e stessa cosa fa Bob.
Alice e Bob, a questo punto, calcolano indipendentemente K, e per le regole della
matematica modulare la chiave K calcolata è uguale.
Adesso osserviamo un avversario che può osservare lo scambio di chiavi, e vuole determinare K. Siccome
XA ed XB sono privati, l’avversario ha solo I seguenti ingredienti q, α, Y A e YB . L’avversario deve risolvere
un logaritmo dicreto per determinale la chiave, per esempio se volesse determinare la chiave private di B:
XB = dlog α, q (YB)
A questo punto per determinare K procede allo stesso modo di Bob.
K = (YA)XB mod q
Per numeri primi grandi l’attacco è considerato difficile.
Esempio di attacco brute force
L’attaccante conosce tutti questi dati a
parte 97 e 233 che sono rispettivamente
Xa e Xb. Per trovargli gli basta risolvere
una delle due equazioni:
3a mod 353 = 40 oppure 3b mod 233 = 40.
Un altro esempio di utilizzo dell’algoritmo di diffie hellman, supponiamo che un gruppo di utenti generi una
chiave privata Xi e una corrispondente chiave pubblica Yi, a lungo termine, cioè la stessa chiave è utilizzata
per più messaggi. Tutti questi valori pubblici Yi e i valori globali q, a vengono memorizzati in una directory
centrale, ogni volta che l’utente j vuole inviare un messaggio all’ utente i, può accedere alla sua chiave
pubblica Yi, calcolare K e utilizzare questa chiave per inviare a lui un messaggio. Se la directory centrale è
affidabile allora questa forma di comunicazione fornisce sia criteri di riservatezza sia un meccanismo di
autenticazione, infatti solo j e i possono calcolare la chiave K.
Man in the middle attacks
Il protocollo di comunicazione visto precedentemente è vulnerabile ad attacchi di tipo man in the middle
L’ attacco procede nel seguente modo:
1) Darth si prepara per l’ attacco generando 2 coppie di chiavi (XD1,YD1) e (XD2, YD2).
2) Alice trasmette Ya a Bob.
3) Dartb intercetta Ya e trasmette YD1 a bob, inoltre calcola K2
4) Bob riceve YD1 e calcola K1.
5) Bob trasmette Yb ad alice
6) Darth riceve Yb e trasmette YD1 ad alice e calcola K1
7) Alice riceve YD2 e calcola K2
A questo Bob e Darth condividono la chiave privata K1 ed Alice e Darth condividono la chiave privata K2.
Tutte le future comunicazioni sono compromesse nel seguente modo:
1) Alice invia un messaggio cifrato M: E(K2, M).
2) Darth intercetta il messaggio e lo decifra per ricavare M
3) Darth invia a Bob E (K1, M), cioè invia il messaggio inalterato oppure invia E (K1, M’)
Questo protocollo risulta vulnerabile a questi tipi di attacchi poiché non autentica i partecipanti.
Aritmetica a curve ellittiche
La cifratura a chiave pubblica è molto pesante, per la natura stessa della matematica su cui si basa, la
cifratura a curve ellittiche (ECC) è strettamente correlata alla cifratura basata sui logaritmi discreti.
La sicurezza dei sistemi a chiave pubblica basati sui logaritmi discreti, si basano sul problema del logaritmo
discreto, il calcolo di un logaritmo all’ interno di un gruppo di elementi finiti. Un esempio è diffie-hellman.
Anche ECC utilizza un problema sul logaritmo e dei gruppi di elementi, ciò che cambia è il modo in cui il
gruppo è definito, come gli elementi del gruppo sono definiti e le operazioni matematiche che sono definite
su essi.
Il modo in cui le operazioni basate sulle curve ellittiche sono definite è ciò fornisce a ECC più sicurezza con
il vantaggio di utilizzare chiavi più corte.

Una curva ellittica è definita in un piano cartesiano bidimensionale


dall’ equazione: y2 = x3 +ax +b.
La curva ellittica è utilizzata sia per definire i membri del set sul
quale il gruppo è calcolato sia per definire le operazioni tra i
membri del gruppo, le quali definiscono come funziona la
matematica all’ interno del gruppo.

Il gruppo è definito come segue, immaginiamo un grafico in cui


ogni asse è etichettato con i numeri di un campo finito di un numero primo molto grande (Fq).
Ora se immaginiamo un grafico quadrato di dimensione p x p, dove p è un numero primo molto grande. Fp è
il campo di interi modulo p (tutti i numeri da 0 a p-1).
Ora se definiamo una curva ellittica su questo grafico, tale per cui ci sono punti ( x, y) su questa curva che
soddisfano la condizione che sia x che y siano membri di Fq allora implicitamente stiamo definendo un
gruppo dall’ insieme di punti sulla curva, cioè un sottoinsieme dei p x p punti del grafico, in particolari quelli
sui quali passa la curva. Al contrario di DH gli elementi del gruppo non sono interi, ma sono punti, proprio
come in DH però sono definite le regole, che ci dicono come fare addizioni, sottrazioni ecc…

Moltiplicazione di punti
L’ operazione di moltiplicazione di punti è molto importante per quanto riguarda la cifratura a chiave non
simmetrica, l’operazione in se è molto semplice, al contrario l’operazione inversa risulta più difficile.
Quando andiamo ad eseguire una cifratura con chiave pubblica o decifratura con chiave privata non stiamo
facendo altro che una moltiplicazione di punti. Questa operazione consiste nel trovare kP, dove K è un intero
e P è un punto sulla curva ellittica definito nel gruppo di primi.
In termini di addizione funziona al seguente modo: prendiamo un punto P aggiungiamolo a se stesso,
poi prendiamo il risultato, e il punto originale e li aggiungiamo insieme di nuovo utilizzando la
regola della corda e della tangente. Dopo prendiamo questo risultato e di nuovo il punto originale e li
sommiamo insieme utilizzando la regola della tangente e della corda. Facciamo queste operazioni k –
1 volte in questo modo otteniamo kP. Se l’ unico modo di fare quest’ operazione fosse ripetere
queste operazioni trovando i punti P, 2P 3P e così via fino ad arrivare a kP allora, la cifratura su
curve ellittiche sarebbe inutile, poiché l’ operazione di cercare k dato P o Kp non sarebbe molto
difficile.

Il problema dei logaritmi discrete su curve ellittiche


È l’operazione inversa alla moltiplicazione di punti, cioè trovare un logaritmo in un gruppo definito
su una curva ellittica su un campo finito di un numero primo. Dati i punti Q e P, trovare l’intero k
tale che Q=kP. Quest’ operazione serve per decifrare il testo cifrato.

Funzioni di hash
Le funzioni di hash sono impiegate in diverse applicazioni.
Autenticazione di messaggi
È un meccanismo che serve per verificare l’integrità di un messaggio, assicura
che il messaggio che arriva non abbia subito modifiche da malintenzionati, e i
molti casi che l’ identità del mittente sia verificata. Il valore restituito dalla
funzione hash, in funzione dell’ autenticazione dei messaggi è detto:
‘messagge digest’ .
Funzionamento

Il mittente calcola un valore di hash in funzione del messaggio che vuole


inviare, invia il messaggio includendo l’hash. Il ricevente effettua lo stesso
calcolo di hash sui bits del messaggio, e confronta i due valori di hash, se c’è
qualche disuguaglianza, il ricevente sa che ci sono state delle alterazioni.
La funzione di hash dev’ essere inviata in modo sicuro, in questo modo se l’avversario
riesce ad alterare il messaggio, non può comunque ingannare il ricevente che
confronterà l’hash (vedi attacco di sopra).
Illustriamo diversi modi in cui l’hash può essere utilizzata per fornire autenticazione
dei messaggi
1) Il messaggio e la funzione hash sono cifrati utilizzando un chiave simmetrica
condivisa, siccome solo mittente e destinatario conoscono la chiave, il
destinatario è sicuro che il messaggio sia arrivato proprio da A. Siccome la
cifratura è applicata al messaggio + codice hash è fornita anche la
riservatezza

2) Solo il codice hash è cifrato utilizzando la chiave simmetrica, se non abbiamo


bisogno della riservatezza questo è un buon meccanismo, poiché
alleggeriamo l’ intero processo
3) Senza cifratura, A e B condividono un valore segreto S, A calcola il valore di
hash del messaggio || S, siccome B conosce S può verificare il messaggio.

4) Come 3) solo che viene aggiunta la riservatezza cifrando hash + messaggio

Ovunque non ci sia bisogno di riservatezza la tecnica (2) è la migliore poiché:


1) I software di cifratura sono lenti, anche se dobbiamo cifrare piccoli messaggi
2) Costo dell’hardware di cifratura
3) L’ hardware di cifratura è ottimizzato per file di grandi dimensioni
4) Gli algoritmi di cifratura possono avere dei brevetti quindi si deve pensare
anche al costo delle licenze
Più comunemente l’autenticazione dei messaggi è ottenuta attraverso il MAC
(message authentication code) tipicamente vengono utilizzato da due interlocutori che
comunicano tra di loro attraverso una chiave condivisa per autenticare i messaggi. Il
MAC viene calcolato in funzione di una chiave e un blocco di dati in seguito viene
spedito insieme al messaggio protetto, l’integrità del messaggio a destinazione può
essere verificata riapplicando la funzione di MAC e confrontando. Siccome il MAC è
basato sulla chiave l’attaccante non può modificare il messaggio, inoltre inoltre il
destinatario è sicuro di quale sia il mittente del messaggio, poiché condividono la
chiave.

Firma digitale
La firma digitale è molto simile al MAC, nel caso della firma digitale, la funzione hash
di un messaggio è cifrata con la chiave privata dell’utente. Chiunque conosco la chiave
pubblica dell’utente può verificare l’integrità del messaggio che è associato alla firma
digitale. Un utente che desideri modificare il messaggio ha bisogno della chiave
privata dell’utente.
Fornire una firma digitale con codice hash
1) Il codice hash è cifrato utilizzando la cifratura a chiave pubblica, in questo modo
siamo sicuri che il codice hash non sia stato alterato. (fornisce sia
autenticazione che la firma digitale)

2) La chiave privata hashata + il messaggio sono cifrati utilizzando una chiave


simmetrica, in questo abbiamo anche la riservatezza

Altre Applicazioni
Protezione delle passwords, al posto di memorizzare la passwords memorizzo l’hash
della password.
Creazione di un generatore di numeri pseudocasuali.
2 funzioni hash semplici
Le funzioni hash che considereremo hanno tutte la stessa struttura, l’input è visto
come una sequenza di blocchi da n-bits. L’input è elaborato 1 blocco alla volta in
maniera iterativa per produrre una funzione hash da n bit.
Or esclusivo bit a bit dei blocchi
Questa tecnica è anche chiamata controllo longitudinale della ridondanza, è molto efficace per
controllare l’integrità di dati casuali. Inoltre, la probabilità che un errore non influisca sul codice
hash è 2^-n, con dati formattati in maniera particolare, questa funzione è meno efficace, per
esempio in molti file di testo, il bit più significativo di ogni sequenza di 8 bit è sempre 0, quindi
se è utilizzato un codice hash a 128 bit, l’efficacia della funzione non sarà 2^-128 ma 2^-112.
Un modo semplice per migliorare questa cosa è eseguire uno shift circolare di un bit sul valore
di hash dopo che ogni blocco è stato processato. La funzione può essere generalizzata come
segue:
1) Inizializzare il valore hash di n bit a 0
2) Elaborare ogni successivo blocco di dati da n bit come segue:
a. Eseguire la rotazione sinistra di un bit del valore di hash corrente
b. Eseguire lo XOR con il blocco
Questo ha l’effetto di randomizzare l’input, cioè eliminare le ricorrenze nell’input.
Figura 4 Procedure appena descritte(per valori di hash da 16 bit)

La seconda procedura fornisce un buon metodo per l’integrità dei dati. È inutile per la
sicurezza dei dati, quando una funzione hash cifrata è usata con un messaggio in
chiaro, dato un messaggio è semplice produrre un nuovo messaggio con lo stesso
hash code, semplicemente basta prepararsi il messaggio alternativo e poi aggiungere
un blocco da n-bit che forza il nuovo messaggio ad avere l’hash code desiderato.
Inoltre, queste due tecniche (XOR e XOR con rotazione) sono inutili se solo l’hash
viene cifrato. Una tecnica originariamente proposta da National Bureau of Standard,
utilizzava lo XOR semplice applicato a un messaggio con blocchi da 64 bit e
successivamente una cifratura del messaggio con CBC. Più specificatamente:
Dato un messaggio M, formato da una sequenza di blocchi da 64 bit X1, X2, …, Xn
definiamo il codice hash h= H(M) come lo XOR blocco a blocco e aggiungiamo il codice
hash come blocco finale

Successivamente cifriamo l’intero messaggio + il codice hash per produrre il


messaggio cifrato Y1, Y2, …, Yn
Ci sono però diversi modi per manipolare il testo cifrato senza che sia visibile a livello
di hash, per natura stessa di CBC infatti:

Se i blocchi precedenti fossero permutati l’hash code non cambierebbe, poiché gli XOR
dei vari blocchi possono avvenire in qualisasi ordine.
Sicurezza delle funzioni hash
Per un valore di hash h = H(x), chiamiamo x pre-immagine/pre-impronta di h x è
un blocco di dati per il quale usando la funzione di hash H ci viene resitituita
l’immagine hash h. Per ogni valore hash di h ci sono molteplici pre-immagini
(si verificano delle collisioni). Una collisione si verifica se dati due blocchi x,y con x
diverso da y H(x) = H(y), queste si verificano poiché le funzioni hash mappano un
qualsiasi blocco da qualsiasi dimensione in n bits, chiaramente prima o poi le
combinazioni di bits finiscono e ci ritroviamo con delle impronte hash uguali. Il
problema delle collisioni non è molto gradito, poiché stiamo utilizzando le funzioni
hash per garantire l’integrità dei dati. Supponendo di avere una funzione hash che
restituisce un’immagine di n bit e accetta in input blocchi di lunghezza b bits, con n >
b, il numero totale di possibili messaggi è 2 b e il numero totale di valori hash è 2n, se H
tende a distribuire uniformemente i valori di hash allora abbiamo che ogni valore di
hash calcolato h ha 2b – n preimmagini che producono lo stesso hash, cioè collisioni,
tuttavia il problema delle collisioni non è così catastrofico in termini di rischi per la
sicurezza.
Requisiti delle funzioni hash
I primi 3 requisiti riguardano le applicazioni pratiche degli algoritmi di hash, la quarta è
detta one-way-property, cioè dev’ essere semplice dato un messaggio produrre l’hash
ma computazionalmente impossibile fare il contrario (anche perché tornando indietro
ci sono le collisioni e come faccio a sapere qual’ era il messaggio originale?), per
questo è detto one-way, questo requisito è molto importante in questa situazione:

Se la funzione hash non fosse one-way un’attaccante che riesce a intercettare M può
ricavere il segreto S.
La quinta proprietà garantisce che dato un valore di hash e un messaggio è
computazionalmente impossibile trovare un’altro messaggio con la stessa impronta
hash. Se così non fosse un attaccante potrebbe intercettare un messaggio e il
corrispondente hash cifrato, generare l’hash del messaggio e trovare un hash
equivalente (NB: MI STO RIFERENDO ALLE FIGURE 11.3b e 11.4a). Se queste 5
proprietà sono rispettate allora si dice che la funzione hash è debole, se anche la sesta
è rispettata allora la funzione hash è detta forte.
La sesta proprietà ci protegge da attacchi di questo tipo:
Bob invia ad alice un messaggio da firmare, Alice lo firma. Bob trova 2 messaggi con lo
stesso hash uno dei quali chiede ad alice di pagare una piccola quantità di denaro, e
un altro che richiede di pagarne una grande quantità. Alice firma il primo messaggio,
in seguito Bob è in grado di dire che il secondo messaggio è quello firmato.
Figura 5 Requisiti per varie applicazioni

Attacchi
Si possono fare 2 tipi di attacchi: brute force, che dipende solo dalla lunghezza dei bit
del codice prodotto dalla funzione hash, e attacchi di tipo crittoanalisi, che dipendono
dalla vulnerabilità dell’algoritmo.
Attacchi brute-force
Preimage e Second Preimage Attacks, per questi tipi di attacchi, l’avversario
vuole trovare un valore y tale che H(y) è uguale ad una impronta hash h. Per farlo si
generano valori random di y, si fa l’hash e si confronta con h funchè non si trovano
delle collisioni. Mediamente se la funzione hash produce impronte di m bits servono
2m-1 tentativi per trovare la collisione.
Collision Resistant Attacks
Un avversario vuole trovare due messaggi x, y tale che H(x) = H(y); questo richiede
molto meno sforzo rispetto all’attacco precedente. 2 m/2, questo risultato è spiegabile
con il paradosso del compleanno.
Yuoval propose la seguente strategia per sfruttare il paradosso del compleanno in un
collision attack:
1) La sorgente A, si prepara a firmare il messaggio legittimo x aggiungendo in
coda gli m-bit di codice hash cifrato con la sua chiave privata
2) L’avversario genera 2m/2 varianti di x, che chiamiamo x’, i quali hanno lo stesso
significato di x
3) L’avversario genera un messaggio fraudolento y
4) L’avversario genera piccole variazioni y’ di y, e per ognuna di queste calcola
H(y’) e controlla se ci sono delle collisioni con ognuna delle x’ varianti di x,
finchè non trova una collisione.
5) L’ avversario offre ad A il messaggio x’ da firmare, la firma può poi essere
allegata al messaggio fraudolento y’, poiché le due variazioni hanno lo stesso
hash. Questa tecnica è molto efficace poiché funziona anche senza sapere la
chiave privata di A.
La generazione delle variazioni non è molto dispendiosa, basta inserire spazi in
posizioni random e già questa è una variazione che mantiene il significato del
documento.

Crittoanalisi
Per misurare la resistenza di un algoritmo rispetto ad un attacco di tipo crittoanalisi si
fa una comparazione con la complessiva difficoltà di un attacco brute-force un buon
algoritmo dovrebbe avere resistenza agli attacchi di tipo crittoanalisi maggiore di
quella degli attacchi brute force.
Per comprendere meglio questi tipi di attacchi occorre analizzare la struttura di un
algoritmo di hash sicuro

Questa struttura è detta funzione di hash iterativa. La funzione di hash prende in input
un messaggio, lo divide in L blocchi da b bits ciascuno, se necessario è aggiunto un
padding di b bits all’ultimo blocco. L’ultimo blocco include anche la lunghezza totale
dell’input data alla funzione di hash. Questo rende il lavoro dell’attaccante più
faticoso, poiché deve trovare 2 messaggi della stessa lunghezza con la stessa
impronta hash, oppure due messaggi con lunghezze diverse che insieme producono la
stessa impronta hash.
L’algoritmo fa uso di una funzione di compressione f, che prende 2 input, un input da n
bits chiamato chaining variable e un blocco da b bits Yi. All’inizio dell’hash la CV è
inizializzata ad un valore specifico. L’ultimo valore di CV è il valore di hash. Spesso b >
n(lunghezza dell’hash code), per questo la funzione è detta di compressione.
Riassunto passaggi della
funzione di hash.
La motivazione della struttura iterativa deriva dall’osservazione di Merkle e Damgard,
se la funzione di compressione è resistente alle collisioni allora anche la
corrispondente funzione di hash iterata lo è. Il problema di costruire una funzione
di hash resistente alle collisioni e che accetta in input un qualsiasi messaggio di
qualsiasi lunghezza si traduce nel costruire una funzione di compressione resistente
alle collisioni e che accetta in input messaggi di lunghezza prefissata. Gli attacchi
vengono fatti sfruttando la struttura interna di f, si cerca di produrre delle collisioni
con una singola esecuzione di f e poi si aggiusta l’IV.

Funzioni hash basate su Cipher Block Chaining


Furono fatte numerose proposte per costruire funzioni hash basate su cifrari a blocchi,
ma senza l’utilizzo della chiave, una delle prime proposte fu quella di Rabin, egli
proponeva di:
1) Dividere il messaggio M in blocchi di lunghezza fissata M1, M2, …, Mn
2) Utilizzare una cifratura simmetrica come DES per calcolare l’hash code G

Molto simile a CBC, ma senza chiave segreta. Come ogni altra funzione hash è
soggetta ad attacchi basati sul paradosso del compleanno, inoltre se viene utilizzato
DES e viene prodotto un hash code di soli 64 bit, allora il sistema è vulnerabile. Inoltre,
un'altra versione dell’attacco di compleanno può essere utilizzata anche se
l’avversario ha accesso a solo il messaggio e la corrispondente firma, quindi non può
far firmare altro. Supponiamo che l’avversario intercetti un messaggio firmato,
utilizzando un hash cifrato, e che lunghezza dell’hash non cifrato sia m bits, allora:
1) Utilizzando l’algoritmo visto prima calcoliamo l’hash code G
2) Costruiamo un messaggio che vogliamo nella forma Q1, Q2, …, Qn-2
3) Calcoliamo Hi = E (Qi, Hi-1) per 1<=i<=(N-2)
4) Generiamo 2m/2 blocchi causali; per ogni blocco X calcoliamo E (X, Hn-2)
generiamo altri 2m/2 blocchi Y, e per ogni blocco Y generato calcoliamo D (Y,
G) dove D è la funzione di decifratura
5) Sulla base del paradosso di compleanno, ci saranno un X e un Y tali che E (X,
HN-2) = D(Y, G).
6) A questo punto formiamo il messaggio Q1, Q2, Q3, QN-2, X, Y. Questo ha hash
G e può essere utilizzato con la firma intercettata.
L’attacco è anche chiamo meet in the middle attack.
Esistono variazioni dell’algoritmo visto prima che lo rafforzano contro attacchi di
questo tipo, esempio:
Oppure

In generale però questo non è l’unico attacco basato sul paradosso di compleanno ed
è dimostrato che tutti gli algoritmi basati su CBC soffrono attacchi basati su quello.
Secure Hash Algorithm (SHA)
SHA fu sviluppata da National Institute of Standards and Technology (NIST). Quando
furono evidenti le sue debolezze fu pubblicata una versione corretta, chiamata SHA-1,
SHA-1 produce un valore hash di 160 bits. Nel 2002 NIST rilascia altre 3 versioni di
SHA, chiamate SHA-256, SHA-384 e SHA-512, questi algoritmi sono conosciuti come
SHA2.

Autenticazione di messaggi
Requisiti
Nel contesto delle comunicazioni su internet possiamo identificare diversi attacchi:
 Disclosure, rilascio del contenuto del messaggio a qualsiasi persona o processo
che non possiede le credenziali crittografiche
 Analisi del traffico, scoperta di pattern, legati al traffico, tra due interlocutori.
Esempio: in un’applicazione connection oriented potrebbe essere determinata la
durata e frequenza di connessione oppure sia in applicazione non connection
oriented che connection oriented è possibile determinare il numero e lunghezza
di messaggi.
 Masquerade, inserimento di messaggi provenienti da fonti fraudolente, questo
include: la creazione del messaggio, da parte di un avversario, che si presume
provenga da una fonte autorizzata.
 Modifica del contenuto, cambiare il contenuto di un messaggio.
 Modifica di sequenza, modifica di una sequenza di messaggi.
 Timing modification, rispondere a un messaggio, oppure ritardare la sua
ricezione
 Source repudiation, impedire che una sorgente invii messaggi.
 Destination repudation, impedire che un destinatario riceva messaggi.
Gli attacchi dal 3 -6 devono essere trattati con l’autenticazione dei messaggi, il quale
è, detto in maniera semplificata, un meccanismo per verificare la sorgente di un
messaggio e che non siano stati alterati.
Message authenthication function
Ogni meccanismo di firma digitale o message authentication ha 2 livelli di funzionalità.
Una a basso livello, cioè una funzione che produce un valore per autenticare un
messaggio, in gergo chiamato autenticatore. Questa funzione a basso livello è poi
usata come una primitiva di un protocollo di autenticazione ad alto livello che
permette a chi riceve il messaggio di verificare l’autenticità del messaggio.
Ci sono diversi tipi di classi di funzioni che possono essere utilizzate per
produrre un autenticatore:
1) Funzioni Hash, una funzione che mappa un messaggio di qualsiasi lunghezza
in un valore di hash di lunghezza fissata
2) Cifratura del messaggio, il messaggio cifrato è utilizzato come autenticatore
3) MAC (message authentication code) Una funzione che dato il messaggio e
una chiave segreta produce un autenticatore di lunghezza fissata.

Cifratura del messaggio


La cifratura del messaggio da sola può fornire un valore per autenticare il messaggio,
la tecnica cambia a seconda che la cifratura sia a chiave pubblica o simmetrica.
Chiave simmetrica

Un messaggio M, inviato da A, è cifrato utilizzando la chiave K condivisa da A, B. Se


nessun’altro conosce la chiave allora la riservatezza è garantita, nessuno al di fuori di
A, B può leggere il testo in chiaro. Inoltre, B è sicuro che solo A può avere inviato il
messaggio e che nessuno può avere alterato il messaggio (sempre considerando che
solo A e B conoscono K) siccome un avversario che non conosce la chiave non sa
come cambiare il messaggio cifrato per produrre il testo in chiaro desiderato.
Consideriamo cosa succede a B, data una funzione di decifratura D, la chiave e un
qualsiasi messaggio cifrato X produce Y = D (K, X). Se X è il testo cifrato di un
messaggio legittimo M prodotto utilizzando la corrispondente funzione di cifratura
allora Y un testo in chiaro M. Altrimenti se così non fosse Y sarebbe una sequenza di
bit con poco significato, si potrebbe automatizzare il processo di riconoscere messaggi
alterahashti. Supponiamo però che il messaggio in chiaro possa essere una qualsiasi
sequenza di bit, in questo caso non è possibile determinare automaticamente se il
messaggio ricevuto è il testo cifrato di un messaggio legittimo, poiché può essere una
qualsiasi sequenza di bit.
Solitamente però si impone il vincolo che solo un sottoinsieme di sequenze di bit sia
valida. In questo caso la probabilità che un testo cifrato alterato produca un testo in
chiaro valido è molto bassa, per esempio se imponiamo che solo 1 pattern di bit su 10 -
6
possibili sia un pattern valido allora la probabilità che un pattern di bit scelto a caso
nel testo cifrato, produca un pattern valido nel testo in chiaro è di 10 -6.
È comunque difficile capire automaticamente se un testo cifrato produrra un testo in
chiaro leggibile, per esempio se il testo in chiaro è un file binario, il riconoscitore
automatico dovrebbe testare un sacco di pattern, un avversario potrebbe bloccare il
sistema semplicemente inviando una serie di messaggi generati casualmente
spacciandoli per messaggi provenienti da una fonte sicura. Un meccanismo per
proteggersi contro questi tipi di attacchi potrebbe essere quello di forzare il testo in
chiaro ad avere una qualche struttura facilmente riconoscibile, ma che non può essere
replicata senza cifrare.
Per farlo appendiamo al messaggio un FCS o checksum prima che venga cifrato.

A destinazione B ricalcola il checksum sul messaggio e confronta. NB l’ordine in cui


allego il checksum al messaggio è critico.

Cifratura a chiave pubblica

In questo schema abbiamo riservatezza, non autenticazione poiché anche un


avversario conosce la chiave pubblica del destinatario.
Per fornire anche l’autenticazione, il mittente A deve cifrare con la sua chiave privata,
in fase di decifratura B deve decifrare con la chiave pubblica di A.
Anche in questo caso il mittente vuole distinguere un testo ben formattato da una
sequenza casuale di bit

Lo schema c oltre a fornire autenticazione fornisce anche quella che è chiamata firma
digitale, il mittente è firma il docuemento con la propria chiave privata, e non può
rinnegare di averlo fatto (solo lui conosce la chiave in questo caso, nel caso della
chiave simmetrica erano sempre almeno 2 i conoscitori della chiave);

MAC
Tecnica alternativa che consente di generare un blocco di dati di grandezza fissa, a
partire da una chiave segreta condivisa tra i partecipanti, chiamata cryptographic
checksum o MAC. Supponendo che A voglia inviare un messaggio a B il MAC viene
calcolato nel seguente modo:

MAC + messaggio sono spediti al destinatario il quale ricalcolerà il MAC sul messaggio
utilizzando la chiave K, e confronterà con il MAC ricevuto. Se solo ricevente e mittente
conoscono la chiave allora:
1) Il ricevente è sicure che il messaggio non sia stato alterato, siccome la chiave
condivisa è conosciuta solo da mittente e ricevente, nessun attaccante può
alterare il MAC.
2) Il ricevente è sicuro che il mittente del messaggio sia proprio quello indicato,
perché nessun’altro conosce la chiave, necessaria per preparare un messaggio
con il MAC appropriato.
3) Se il messaggio include una sequenza di numeri (vedi TCP header), il
destinatario può essere sicuro che nessuno abbia alterato la sequenza dei
messaggi.
A differenza delle funzioni di cifratura le funzioni MAC devono essere non reversibili
(one way function), proprio come per le funzioni di hash abbiamo il problema delle
collisioni, poiché trattasi di funzioni che prendo in input messaggi di lunghezza
qualsiasi e restituiscono blocchi di dati di lunghezza fissa, quindi se per esempio ho un
MAC da 10 bit e messaggi da 100 bit, avremo che in media ogni MAC è generato da
2100/210 = 290 messaggi diversi. Qui però abbiamo anche la chiave per cui, se
utilizziamo una chiave da 5 bit abbiamo 290 * 25 altre combinazioni.

Per ottenere riservatezza dobbiamo anche cifrare il testo in chiaro con un'altra chiave
simmetrica. Possiamo scegliere se calcolare il MAC sul messaggio in chiaro,
concatenare e cifrare l’intero blocco; oppure calcolare il MAC sul testo cifrato e
concatenare al messaggio cifrato (poco usato).
Abbiamo visto che anche la cifratura a chiave simmetrica fornisce autenticazione,
perché usare un MAC separato allora?
1) In generale è molto utile in tutte quelle situazioni in ho bisogno di separare
autenticazione e riservatezza. Possiamo controllare la provenienza di un
messaggio senza decifrarlo.
Requisiti per il MAC
Il MAC è anche chiamo tag, questo tag è posto alla fine del messaggio, in un periodo di
tempo in cui si è sicuri che il messaggio non fosse corrotto. Il ricevente poi ricalcola il
tag e confronta. Quando l’intero messaggio è cifrato per motivi di riservatezza,
utilizzando cifratura a chiave pubblica o simmetrica, la sicurezza dello schema dipende
dalla lunghezza della chiave, poiché l’avversario deve fare brute force sulla chiave,
provando in media 2k-1 chiavi, nel caso in cui il cifrario sia chiper text only l’avversario
dovrà fare Pi = D (Ki, C) per tutte le possibili chiavi finché Pi non produce un testo
valido.
Per valutare la sicurezza di un MAC le considerazioni sono totalmente diverse, come le
funzioni hash il MAC è una many to one function per cui facendo brute force troverò un
sacco di corrispondenze e l’attaccante non saprà qual è la chiave. Supponiamo che la
lunghezza del MAC sia n e che la lunghezza della chiave sia k con k > n; l’attaccante
dato un messaggio M1 e il corrispondente T per scoprire la chiave deve effettuare Ti =
MAC (Ki, M1) per tutte le possibili chiavi, ma per la proprietà vista prima 2 k-n
produrranno una corrispondenza valida. L’attaccante per scoprire il MAC deve iterare
l’attacco utilizzando come dominio il set di chiavi scoperte e altre coppie (M, T).

In questo modo esclude dal set altre chiavi. In media sono necessari a x n rounds per
scoprire la chiave. Se la lunghezza della chiave k fosse <= n basterebbe un solo round
per scoprire la chiave di autenticazione. Un attacco per scoprire la chiave di
autenticazione potrebbe essere costoso quanto scoprire la chiave di cifratura.
Altri attacchi che non richiedono di trovare la chiave di autenticazione sono possibili,
consideriamo il seguente algoritmo MAC. M = (X1 || X2 || … || Xn) è un messaggio
formato da blocchi da 64 bits.
Il MAC è così calcolato:
L’ algoritmo di cifratura è DES con ECB, la
lunghezza della chiave è 56 bits e la
lunghezza del tag è 64.

Un avversario che osserva {M || MAC (K, M)} può rimpiazzare i blocchi da X1 a Xm-1
con qualsiasi valore Y1 Ym-1 e rimpiazzare il blocco Xm con Ym, tale per cui Ym è
calcolato nel seguente modo:

A questo punto l’attaccante concatena il messaggio al tag, il quale verrà considerato


autentico dal ricevente.
Con questa tecnica qualsiasi messaggio di lungezza 64 x (m-1) può essere inserito.Per
garantire la sicurezza per la funzione MAC bisogna considerare tutti I possibili attacchi.
Assumiamo che l’attaccante conosca la funzione MAC ma non K, allora il MAC deve soddisfare I
seguenti requisit:
• se un attaccante osserva M e il MAC(K,M), deve essere computazionalmente difficile per
un attaccante costruire un messaggio M’ con MAC(K,M’) = MAC(K,M)
• MAC(K,M) deve essere uniformemente distribuito, se viene scelto un messaggio random,
M ed M’, la probabilità che il loro MAC sia uguale deve essere dell’ordine di 2 -n, dove n è
il numero di bit nel tag. (attacchi plaintext choosen.)
• Sia M’ uguale a qualche trasformazione di M ( M’=f(M)). Per esempio, se f inverte un bit
o dei bit specifici, in questo caso:

Sicurezza del MAC


Anche in questo caso gli attacchi al MAC si dividono in 2:
Brute Force e Crittoanalisi
Brute Force
Un attacco brute force su un MAC è molto più difficile di un attacco brute force su una
funzione di hash, poiché per attaccare un MAC ci servono coppie di messaggio-tag.
(VEDERE DI SOPRA PER ATTACCO BRUTE FORCE PER TROVARE COLLISIONI IN HASH).
Un attacco brute force hash può essere eseguito off line, cioè solo dall’attaccante,
senza comunicare con il sistema che si sta attaccando, un attacco MAC può essere
eseguito off line, ma dipende dalla lunghezza della chiave e dal tag.
Un MAC deve avere la proprietà di Computation resistance, dato una o più coppie
[xi, MAC (K,xi)] è computazionalmente difficile calcolare una nuova coppia [x, MAC
(K,x)] per ogni nuovo input x != xi.
In altre parole, l’attaccante vorrebbe costruire un MAC valido per un qualsiasi
messaggio x, ci sono attacchi possibili:
1) Attacco all’insieme di chiavi, supponendo che la chiave sia lunga k bits e che
l’attaccante abbia una coppia messaggio tag, quello che può fare è generare
tutte le possibili chiavi calcolare il MAC e confrontare con il tag di partenza. Con
complessità 2k. Chiaramente per il problema visto prima potrebbero essere
trovate più corrispondenze per cui nel caso fosse così servono altre coppie e
altri round per trovare la chiave giusta.
2) Attacco al MAC, si vuole generare un MAC valido per un determinato messaggio,
oppure trovare un messaggio che matchi con un dato tag. Questo tipo di
attacco non può essere condotto off line, poiché per farlo servono ulteriori
coppie [x, MAC (K, x)] (choosen [x, MAC (K, x)]). Questo richiede 2 n.
Livello di sforzo per attacco brute force: min (2 k, 2n), solitamente si richiede che min
(k, n) >= N, dove solitamente N è intorno a 128 bits.
HMAC
Solitamente i MAC vengono costruiti a partire da cifrari a blocchi simmetrici. Gli HMAC
sono MAC costruiti a partire da funzioni crittografiche hash. Le motivazioni che hanno
portato a farlo sono:
1) Le funzioni hash crittografico, come per esempio MD5 e SHA, solitamente
vengono eseguite più velocemente rispetto a cifrari a blocchi come DES.
2) Le librerie per le funzioni crittografiche hash sono ampiamente disponibili.
Algoritmi come SHA non sono stati progettati per essere usati per generare MAC,
poiché non fanno uso di chiavi segrete, per essere utilizzato dev’essere prima
adattato. HMAC implementa una funzione di hash utilizzando una chiave segreta, è
utilizzato in molti protocolli di rete, come per esempio IP e SSL.
HMAC obbiettivi di progettazione
1) Deve utilizzare funzioni hash esistenti senza modificarle
2) Deve permettere una facile sostituzione della funzione hash incorporata in caso
funzioni hash più veloci sono trovate o richieste
3) Non dev’essere troppo più pesante della funzione hash originale, in termini di
performance.
4) Deve utilizzare le chiavi in maniera semplice
5) Deve avere una chiara analisi crittografica della forza del meccanismo di
autenticazione basata su ragionevoli assunzioni riguardo alla funzione hash
incorporata.
1 – 2, sono importanti per l’accettabilità del HMAC. HMAC tratta la funzione hash
come una scatola nera. Questo ha il vantaggio di poter utilizzare una funzione hash
esistente come un modulo di HMAC, e di poter sostituire il modulo nel caso si volesse
utilizzare un’altra funzione hash, senza dover modificare HMAC.

HMAC algoritmo
L’HMAC può essere definito come segue:

L’algoritmo funziona in questo modo:


1) Viene costruito K+.
2) Viene eseguito uno XOR bit a bit tra K+ e ipad per produrre il blocco da b bits S i
3) Aggiunge M in coda a Si
4) Applica la funzione hash H allo stream generato al punto 3
5) XOR di K+ con opad per generare il blocco da b bit S 0
6) Aggiunge il risultato della funzione hash del punto 4 in coda a S 0
7) Applica la funzione hash H allo stream generato al punto 6 e restituisce il
risulatato.
Il risultato dello xor con ipad è ribaltare una metà dei bit di K, stessa cosa fa lo xor con
opad, utilizzando un pattern di bit differenti. Passando S i e S0 attraverso una funzione
di compressione hash abbiamo generato in modo pseudocasuale due chiavi dalla
chiave K. La funzione hash appena descritta è veloce, approssimativamente, quanto
un’esecuzione della funzione hash, ma può essere ancora ottimizzata:

In questo schema pre computiamo:


f (IV, (K+ XOR ipad))
f (IV, (K+ XOR opad))
Queste quantità rappresentano la
funzione di compressione per la
funzione hash che prendono in input
una cv di n bits e un blocco di b bits e
producono una chaining variable di b-
bits. (riguardare funzione hash
iterativa). In questa versione basta
applicare una sola volta la funzione
hash, molto efficiente se abbiamo
messaggi corti.

Sicurezza di HMAC
La sicurezza di HMAC dipende dalla funzione hash che implementa. È dimostrato che
per un dato livello di sforzo e date coppie di messaggi - tag generati con la stessa
chiave da un utente legittimo e visti dall’attaccante, la probabilità di attaccare con
successo HMAC è equivalente a uno dei seguenti attacchi:
1) L’attaccante è in grado di calcolare un output della funzione di compressione
anche con un IV generato in modo pseudocasuale e sconosciuto all’attaccante
2) L’attaccante trova delle collisioni nella funzione hash anche quando IV è
generato casualmente e tenuto segreto.
1 – Possiamo vedere la funzione di compressione equivalente alla funzione hash
applicata a un blocco di b bits dati e per questo attacco IV viene rimpiazzato da una
chiave generata casualmente di n-bits. L’attacco consiste nel fare brute force sulla
chiave, il che richiede un livello di sforzo di 2 n
2 – l’attaccante cerca due messaggi M e M’ tali che producano lo stesso H (M) = H
(M’), cioè l’attacco che sfrutta il paradosso del compleanno che richiede 2 n/2 per una
funzione hash di n.
NB: quando un attaccante attacca un HMAC non può mai essere un attacco offline
questo perché, si che l’attaccante conosce la funzione hash che ci sta sotto ma non
conosce K, quindi non può generare coppie (messaggio, tag), supponendo di usare
MD5 a 128 bits questo richiederebbe 264 blocchi generati con la stessa chiave,
osservare così tanti messaggi con la stessa chiave è quasi impossibile.
Authenticated Encryption (AE)
AE è un termine usato per descrivere sistemi crittografici che forniscono
simultaneamente riservatezza e integrità nelle comunicazioni. Molti protocolli
richiedono questi due requisiti di sicurezza. Ci sono 4 meccanismi per fornire sia
integrità che riservatezza con la cifratura:
1) Hashing seguito dalla cifratura (H -> E): prima calcoliamo l’hash su M, cioè h =
H (M). poi cifriamo il messaggio più la funzione di hash: E (K, (M || h)). (usata in
wep)
2) Autenticazione seguita dalla cifratura (A -> E): utilizziamo 2 chiavi. Prima
autentichiamo il testo in chiaro calcolando il MAC, T = MAC (K1, M) in seguito
cifriamo il messaggio più il tag; E (K2, [M||T]).
3) Cifratura seguita dall’autenticazione (E -> A); usa 2 chiavi. Primo cifra il
messaggio C = E (K2, M). inseguito autentica il testo in cifrato calcolando T =
MAC (K1, C), in modo da produrre la coppia (T, C)
4) Cifratura indipendente dall’ autenticazione, cifra il messaggio per produrre C =
E (K2, M). Autentica il testo in chiaro e produce T = MAC (K1, M) per produrre la
coppia (C, T) la differenza con 3 è che posso farlo in qualsiasi ordine.
Per 1, 2 e 4 prima decifriamo e poi verifichiamo l’integrità. Per 3 prima verifichiamo e
poi decifriamo.
Ci sono vulnerabilità in tutti gli approcci visti sopra, ma con la giusta implementazione
possono provvedere il giusto livello di sicurezza.
Galois / Counter Mode
GCM è progettato per essere parallelizzato, così che possa fornire un alto throghput
con bassi costi e bassa latenza. Il messaggio viene cifrato in una variante di CTR. Il
testo cifrato ottenuto viene moltiplicato con la chiave e la lunghezza del messaggio
oltre GF (2128) per ottenere il tag di autenticazione. Lo standard specifica anche un
modo per ottenere per fornire solo il MAC, conosciuto come GMAC.
La modalità GCM utilizza 2 funzioni: GHASH, che è una funzione hash con chiave e
GCTR che è la modalità CTR con il counter calcolato con una semplice incremento di
+1.
GHASHH(X) prende in input la chiave hash H e una stringa di bit X, tale che |X| = 128m
bits per un qualche intero positivo m e produce un MAC a 128 bit. La funzione è
descritta come segue:

1) X1, X2, …, Xm-1, Xm denotano la sequenza di blocchi tali che X = X1 || X2 || …


|| Xm
2) Y0 è un blocco di di 128 bit a 0 indicato come 0 128
3) Per i che va da 1 a m Yi = (Yi-1 XOR Xi) * H, * indica la moltiplicazione in
GF(2128)
4) Restituisce Ym
La GHASHH(X) può anche essere espressa come:

Questa funzione può avere ottime performance, infatti se la stessa chiave è


utilizzata per più messaggi H2, H3 … possono essere precalcolati e poi possiamo
calcolarci i blocchi di dati in parallelo poiché le computazioni sono indipendenti
l’una dall’altra (per le proprietà dello XOR non è importante l’ordine in cui faccio le
computazioni).
GCTRK (ICB, X) prende in input una chiave segreta K e una stringa di bit X di
lunghezza variabile e restituisce un testo cifrato Y di bit di lunghezza len (X), la
funzione è descritta come segue:
1) Se X è una stringa vuota, allora viene restituito Y stringa vuota
2) Sia n = [(len(X)/128)] tale che n sia il più piccolo intero maggiore o
uguale a len(X)/128.
3) Siano X1, X2, …, Xn-1, X*n la sequenza di stringhe di bit tali che X = X1 ||
X2 || … || X*n (X1 … Xn-1 sono blocchi completi da 128 bits)
4) Sia CB1 = ICB
5) Per ogni i che va da 2 a n sia Cbi = inc32 (CBi-1) dove inc32 è una funzione
che incrementa i 32 bit più significati di 1 mod 2 32
6) Per i che va da 1 a n – 1 facciamo Y = Xi XOR E (K, CBi)
7) Sia Y*n = X*n XOR MSBlen (X*n) (E (K, CBn))
8) Sia Y = Y1 || Y2 || Y3 || … || Y*n
9) Restituisce Y
NB alcuni blocchi hanno * vicino perché possono non essere di 128 bits. Il valore del
counter può essere generato velocemente e le operazioni di cifratura possono essere
parallelizzate.
Funzione sommaria di autenticazione e cifratura
L’input consiste della chiave segreta K, IV, testo in chiaro P e informazioni addizionali
di autenticazione A. [x]s la rappresentazione a s bit del valore non negativo di x.
L’algoritmo procede in questo modo:
1) Sia H = E (K, 0128)
2) Definiamo J0 come segue
a. Se len (IV) = 96, allora J0= IV || 031 || 1
b. Se len (IV) != 96 allora s = 128 [len(IV)/128] – len(IV) e j0 = GHASH H(IV ||
0s+64 || [len(IV)64])
3) Sia C = GCTRK (inc32(J0), P).
4) Sia u = 128[len(C)/128] – len(C) e sia v = 128[len(A)/128] – len(A).
5) Definiamo un blocco S, come

Nello step uno generiamo la chiave hash, nello step due il blocco che viene utilizzato
come base per il counter viene generato dall’IV, all’IV se l’IV è 96 bits allora vengono
aggiunti || 031 || 1 altrimenti all’ IV vengono aggiunti il numero minimo di 0 per
renderlo multiplo di 128 bits, a questa stringa sono poi aggiunti 64 bit a 0, seguiti da
64 bit che rappresentano la lunghezza dell’IV in seguito la funzione GHASH é applicata
alla stringa risultante.
Così GCM è basato su CTR e in più aggiunge un MAC che autentica messaggio e dati
addizionali che richiedono solo l’autenticazione (vedesi header IP). La funzione che
calcola l’hash utilizza solo la moltiplicazione in un insieme finito di numeri. Questa
scelta è stata fatta perché l’operazione di moltiplicazione in un campo finito è molto
semplice e può essere implementato in hardware per performance ottime.
Firme digitali
La digitale fornisce una serie di capacità di sicurezza che sarebbe difficile
implementare in altro modo

Bob può firmare un messaggio utilizzando un algoritmo di firma digitale. Gli input
dell’algoritmo sono il messaggio e la chiave privata di Bob. Qualsiasi altro utente può
verificare che la firma sia autentica utilizzando un algoritmo di verifica, che utilizza il
messaggio firmato e la chiave pubblica di Bob.
Proprietà
L’autenticazione dei messaggi protegge due comunicanti che si scambiano messaggi
da attaccanti di terze parti, la firma digitale protegge i due comunicanti da
controversie che potrebbero verificarsi tra loro stessi, supponiamo di avere due utenti
A, B quello che può succedere è:
1) A potrebbe costruire un messaggio contraffatto e pretendere che gli sia stato
inviato da B, per farlo A potrebbe semplicemente costruire il messaggio
desiderato e poi aggiungere un codice di autenticazione utilizzando la chiave
che A e B condividono
2) B può rinnegare di aver inviato un messaggio, poiché A può anche averlo
contraffatto non ci sono le prove per sapere che sia stato effettivamente B a
farlo, anche se lo ha fatto davvero lui.
La firma digitale deve avere le seguenti proprietà:
1) Deve permettere di verificare: autore, date e ora della firma
2) Deve permettere di autenticare il contenuto al momento della firma. Infatti, la
firma digitale include anche la funzione di autenticazione.
3) L’autenticità della firma dev’essere verificabile da terze parti, in caso ci siano
dispute da risolvere.
Attacchi e falsificazioni
Supponendo che A sia l’utente che usa l’algoritmo di firma e C sia l’attaccante, gli
attacchi si dividono in:
1) Key only attack: C conosce solo la chiave pubblica di A
2) Known message attack: C ha accesso ad un insieme di messaggi e la loro firma
3) Generic chosen message attack: C sceglie una lista di messaggi prima di
provare a rompere lo schema di firma di A e indipendentemente dalla chiave
pubblica di A. dopodiché ottiene una firma valida da A per il messaggio scelto.
4) Directed chosen message attack: Come prima solo che la lista di messaggi da
firmare è scelta dopo che C conosce la chiave pubblica di A, ma prima che
qualsiasi firma sia apporta.
5) Adaptive chosen message attack: C può usare A come un oracolo. Cioè C può
richiedere ad A firme di messaggi che sono correlate alle coppie messaggio-
firma prima ottenute.
Si dice che l’attaccante ha avuto successo nel rompere uno schema di firma come
risultato di una delle seguenti azioni compiute da C:
1) Total break: C determina la chiave privata di A.
2) Universal forgery: C trova un algoritmo efficiente che fornisce un modo
equivalente di costruire la firma su un qualsiasi messaggio
3) Selective forgery: C falsifica una firma per un particolare messaggio da lui
scelto.
4) Existential forgery: C falsifica una firma per almeno on messaggio. C non ha
controllo sui messaggi, di conseguenza questa falsificazione ha meno impatto
su A.
Requisiti
1) La firma dev’essere una sequenza di bit che dipende dal deve messaggio
firmato
2) La firma deve utilizzare una qualche informazione che conosce solo chi invia in
modo da prevenire falsificazioni e rinnegazione
3) Dev’essere semplice produrre la firma
4) Dev’essere semplice verificare l’autenticità della firma
5) Dev’essere computazionalmente difficile falsificare una firma, anche costruendo
un messaggio un nuovo messaggio per una firma esistente o construendo una
firma fraudolenta per un dato messaggio.
6) Dev’essere facile mantenere una copia della firma digitale nella memoria.

Figura 6 Esempio di firma digitale che implementa i requisiti attraverso una funzione di hash sicura

Firma digitale diretta


Trattasi di uno schema di firma digitale che coinvolge solo mittente e ricevente.
Assumiamo ovviamente che il destinatario conosca la chiave pubblica del mittente.
La riservatezza può essere ottenuta cifrando l’intero messaggio più la firma con una
chiave condivisa, importante calcolare la firma prima di cifrare il messaggio.
Questo perché in caso di disputa l’utente di terze parti che vuole verificare la firma ha
anche bisogno della chiave di decifratura per leggere il messaggio originale, invece se
la firma è calcolata prima, il destinatario può memorizzare il messaggio insieme alla
firma per eventuali dispute.
Algoritmo firma digitale approvato dal NIST (DSA)
DSA utilizza l’algoritmo di hashing sicuro SHA, le ultime versioni implementano
versioni basate su RSA e sulle curve ellitiche. DSA utilizza un algoritmo pensato per
fornire solo un servizio di firma digitale, al contrario di RSA non può essere utilizzato
per lo scambio di chiavi o la cifratura nonostante sia un “tecnica” a chiave pubblica.

Figura 7 Approccio con RSA e DSA

Nella versione basata su RSA, il messaggio da firmare è input di una funzione hash che
produce un codice hash sicuro di lunghezza fissata. Questo codice è poi cifrato con la
chiave privata dell’utente che invia per formare la firma digitale. Messaggio e firma
sono poi trasmessi. Il ricevente prende il messaggio e produce un hash code, inoltre
decifra la firma utilizzando la chiave pubblica del mittente, se il codice hash calcolato
corrisponde alla firma allora la firma è valida, poiché solo il mittente conosce la chiave
privata, per cui soltanto lui può aver firmato. Anche DSA utilizza una funzione hash,
questo viene dato in input a una funzione di firma Sig insieme ad un numero casuale
k, alla chiave privata dell’utente che invia e un insieme di parametri conosciuti ad un
gruppo di entità comunicanti, possiamo considerare questi parametri come una chiave
pubblica globale (PUG). il risultato è una firma con 2 componenti, s e r.
Il ricevente genera l’hash code del messaggio in arrivo, la firma e l’hash vengono dati
in input a una funzione di verifica, la funzione utilizza anche la chiave pubblica globale
e la chiave pubblica dell’utente. Il risultato della funzione è uguale a r se la firma è
valida, poiché soltanto l’utente A che conosce la chiave privata può aver messo la
firma.
Algoritmo DSA
La sicurezza di DSA è basata sulla difficoltà di calcolare logaritmi discreti.

Global public key components, parametri pubblici e comuni ad un gruppo di utenti


che comunicano, viene prima selezionato un numero primo q di N-bit, inseguito viene
scelto un primo p di lunghezza compresa tra 512 e 1024 bits tale che q divide (p-1).
Infine, viene scelto g in questo modo: h(p-1) /q mod p > 1, dove h è un intero compreso
tra 1 e p – 1.
Utilizzando questi parametri ogni utente seleziona una chiave privata e genera una
chiave pubblica, calcolate come in figura. Il calcolo della chiave pubblica dev’essere
relativamente semplice, ma dev’essere computazionalmente difficile fare il cotrario
cioè calcolare la chiave pubblica che è il logaritmo discreto in base g di y mod p.
Per fare la firma calcolano r, s. NB, k è un numero pseudocasuale e unico per ogni
firma.
Per verificare la firma si usa la funzione in figura, dove u1 e u2 sono la chiave pubblica
globale e la chiave pubblica dell’utente. Se v corrisponde a r’ allora la firma è validata.

Figura 8 Struttura dell'algoritmo

Data la difficoltà di calcolare


logaritmi discreti è molto difficile per
un attaccante recuperare k dato r
cioè calcolare log di r in base g mod
p mod q. Un altro vantaggio di
questa struttura è che visto che r
non dipende dal messaggio può
essere precalcolato in anticipo,
anche più di uno in attesa che ci sia
un documento da firmare. Possiamo
anche calcolarci gli inversi
moltiplicativi di k in anticipo.
Firma digitale a curve ellittiche (ECDSA)
Molto popolare poiché si appoggia su curve ellittiche, le quali sono molto efficienti e
permettono di mantenere gli stessi requisiti di sicurezza di DSA utilizzando chiavi più
corte.
ECDSA ha 4 elementi principali:
1) Tutti i partecipanti allo schema di firma digitale condividono gli stessi parametri
pubblici globali, i quali sono costituiti da: curva ellittica e un punto di origine
sulla curva.
2) Un utente che firma deve prima generare una coppia di chiavi (privata,
pubblica), per la chiave privata si fa come in DSA, si sceglie un numero(punto)
pseudocasuale sulla curva, a partire da quel punto si sceglie un altro punto
pseudocasuale sulla curva, che verrà utilizzato come chiave pubblica.
3) Si genera l’hash del messaggio; a partire dall’hash, la chiave privata e i
parametri di dominio si genera la firma che consiste di due interi r e s.
4) Chi verifica utilizza la chiave pubblica dell’utente che ha inviato, s e i parametri
pubblici di domino. L’output è un valore v che viene confrontato con r’.

Parametri globali di dominio


Per ECDSA sono utilizzate curve ellittiche su Z p. I parametri globali sono:
1) Un numero primo q
2) Due interi a e b che specificano l’equazione della curva ellittica y 2 = x3 + ax +b
3) G il punto di partenza sulla curva ellittica (x g, yg)
4) Ordine di G, cioè il più piccolo intero positivo tale che nG = 0
Generazione di chiavi
Le coppie di chiavi sono generate come descritto:
1) Si seleziona un intero d in maniera casuale con 1 < d < n – 1
2) Si calcola Q = dG, questo è il punto Eq (a,b)
3) La chiave pubblica è Q e quella privata d.
Generazione della firma digitale e autenticazione
Data la chiave pubblica di dominio e la chiave privata chi vuole firmare può generare
la firma (320 bytes), per farlo bisogna:
1) Selezionare un intero k casualmente tale che 1 < k < n – 1
2) Calcolare il punto P = (x,y) = kG e r = x mod n. se r = 0 allora bisogna
selezionare un altro k
3) Calcolare t come l’inverso di k t = k-1 mod n
4) Calcolare la hash e = H(m), dove H è SHA-1 che |e| = 160 bytes
5) Calcolare s = k-1 (e + dr) mod n. se s è 0 bisogna tornare al punto 1
6) La firma è la coppia (r,s).
Per la verifica vedere la figura sopra.
Algoritmo di firma digitale RSA-PSS (RSA Probabilistc signature scheme)
Questo schema è uno degli ultimi (uno dei più nuovi) schemi basati su RSA e quello
raccomandato, poiché uno dei più sicuri. Per tutti gli schemi basati su RSA precedenti
a PSS, non era possibile sviluppare una prova matematica che lo schema di firma una
prova matematica che l’algoritmo di firma fosse sicuro come la primitiva di cifratura /
decifratura che utilizzava (RSA). Questo schema a differenza degli altri proposti basati
su RSA introduce un processo randomizzato che dimostra che la sicurezza dello
schema è strettamente collegato alla primitiva di cifratura RSA.
Scambio di chiavi simmetriche con cifratura a chiave pubblica
Data l’inefficienza dei sistemi crittografici a chiave pubblica, il loro utilizzo è limitato
all’invio di blocchi di dati di piccola dimensione, uno degli utilizzi che si fa
maggiormente è quello di cifrare le chiavi simmetriche che vengono utilizzate per lo
scambio dei dati effettivo.
Simple secret key distribution
1) A genera la coppia (chiave pubblica, chiave privata) e trasmette chiave pubblica
e un’identificatore di A a B.
2) B genera la chiave segreta Ks e la trasmette cifrandola con la chiave pubblica di
A.
3) A decifra la chiave privata utilizzando la sua chiave privata D (PR a, E (PUa, Ks))
per recuperare la chiave privata di B, siccome solo A conosce la sua chiave
privata siamo sicuri che solo A e B condividano la chiave K s
4) A scarta le chiavi PUa e PKa e B scarta PUa
A questo punto A e B possono comunicare utilizzando la cifratura tradizionale e la
chiave di sessione Ks, quando la sessione termina Ks viene scartata. Il rischio di
compromissione della chiave è minimo, nessuna chiave esiste prima dell’inizio della
comunicazione e questa viene subito scartata non appena la comunicazione termina.
Questo protocollo è però insicuro contro attacchi di tipo man in the middle.
Un avversario D può compromettere la comunicazione senza essere rilevato, nel
seguente modo:
1) A genera la coppia di chiavi e invia un messaggio destinato a B contenente (PU a,
IDa)

2) D intercetta il messaggio e genera la sua coppia di chiavi (PU d, PKd) e trasmette


(PUd, IDa) a B

3) B genera la chiave segreta Ks e trasmette E (PUd, Ks)

4) D intercetta il messaggio e calcola Ks = D (PRd, E (PUd, Ks))

5) D trasmette E (PUa, Ks) ad A

A e B a questo punto conoscono Ks, ma anche D per cui A e B inziano a scambiarsi


messaggi e D può ascoltare tutti i messaggi, senza intervenire attivamente nella
comunicazione. (non c’è più riservatezza)
Distribuzione di chiavi con autenticazione e riservatezza

Questo schema fornisce protezioni da attacchi passivi e attivi, supponiamo che A e B


si siano già scambiati le chiavi pubbliche, dopo di questo:
1) A utilizza la chiave pubblica di B per cifrare un messaggio contenente
l’identificatore di A IDa e un nonce N1, il quale viene utilizzato per identificare la
transazione in modo univoco.
2) B invia un messaggio ad A cifrato con la chiave pubblica di A e contenente il
nonce inviato precedentemente da A N1 e un nuovo nonce generato da B N2.
Siccome solo B può avere decifrato il messaggio di prima (serviva la chiave
privata di B) la presenza di N1 in questo messaggio è una garanzia per A che il
messaggio è arrivato proprio da B
3) A genera un nuovo messaggio in cui restituisce N 2 a B (stesse motivazioni del
punto 2)
4) A seleziona una chiave segreta Ks e manda M = E (PUb, E (PRa, Ks)) a B, il fatto
che A utilizza la chiave pubblica di B per cifrare ci assicura che solo B possa
leggere il messaggio e il fatto che poi Ks sia cifrato con la chiave privata di A
assicura a B che sia A il mittente del messaggio
5) B decifra il messaggio D (PUa, D (PRb, M)) e recupera Ks
In questo modo sia riservatezza che autenticazione sono garantite.
Schema ibrido
Questo schema utilizza un centro di distribuzione di chiavi (KDC) che condivide un
secret master key con ogni utente e distribuisce le chiavi simmetriche di sessione
cifrandole con il master key. Per distribuire il master key si utilizza uno schema a
chiave pubblica. I motivi che spingono questo approccio a 3 livelli sono:
1) Performance, ci sono molte applicazioni, nelle quali la chiave di sessione
cambia spesso, la distribuzione delle chiavi di sessione mediante chiave
pubblica potrebbe far peggiorare le performance del sistema a lungo andare per
colpa dell’alto costo computazionale dovuto alla cifratura / decifratura a chiave
pubblica. In questo schema ibrido, il meccanismo a chiave pubblica viene
utilizzato ogni tanto per distribuire le chiavi master
2) Backward compatibility, Lo schema si può facilmente adattare su un KDC
esistente senza dover modificare troppo il software.
Distribuzione delle chiavi pubbliche
Furono proposte molte soluzioni per la condivisione delle chiavi pubbliche, possiamo
raggrupparle in 4 categorie:
1) Public announcement
2) Publicly avaiable directory
3) Public-key authority
4) Public-key certificates
Annuncio pubblico di chiavi pubbliche
Il punto fondamentale della cifratura a chiave pubblica è che la chiave pubblica è
pubblica. Infatti, se c’è qualche algoritmo ampiamente accettato, come RSA qualsiasi
partecipante può inviare la sua chiave pubblica a qualsiasi altro partecipante oppure
inviarla in broadcast alla community.
Questo approccio è molto conveniente, di contro è che chiunque può falsificare
un annuncio, cioè un utente malevolo potrebbe fingere di essere un altro
utente ed inviare la sua chiave pubblica ad altri utenti. Finché A non si accorge
della falsificazione e allerta gli altri partecipanti l’utente malevolo può leggere
tutti i messaggi indirizzati ad A e può usare la chiave falsificata come
meccanismo di autenticazione.
Public Avaiable Directory
Cartella pubblica contenente le chiavi pubbliche. Il mantenimento e
distribuzione delle chiavi pubbliche dovrebbe essere responsabilità di
un’organizzazione fidata

Un meccanismo del genere ha 4 elementi


1) L’autorithy mantiene una cartella con una entry {nome, chiave pubblica}
per ogni utente
2) Ogni partecipante registra la sua chiave pubblica con l’authority, la
registrazione dovrebbe avvenire tramite canali sicuri
3) Un partecipante può rimpiazzare la entry con una nuova chiave in
qualsiasi momento. Questo perché la chiave è stata utilizzata per molti
scambi di dati e desidera rimpiazzarla oppure perché la chiave privata
corrispondente è stata in qualche modo compromessa.
4) I partecipanti potrebbero anche accedere alla directory in modo
elettronico, per cui l’autorithy deve fornire una comunicazione
autenticata all’utente.
Questo schema ha delle vulnerabilità seppur più sicuro degli annunci pubblici,
se in qualche modo l’attaccante riesce ad ottenere la chiave privata della
cartella authority allora l’attaccante può distribuire chiavi contraffatte e
impersonare chiunque nella rete.
Public Key authority
Una sicurezza maggiore può essere fornita fornendo controlli maggiori nella
distribuzione delle chiavi. Come prima abbiamo una directory centrale che mantiene le
chiavi pubbliche in più ogni partecipante conosce la chiave pubblica dell’authority e
solo l’authority conosce la propria chiave privata.

1) A invia un messaggio all’authority contenente un messaggio con il timestamp e


una richiesta per la chiave pubblica di B
2) L’autorithy risponde con un messaggio contenente la chiave pubblica di B, la
quale servirà ad A per cifrare messaggi da inviare a B, La richiesta originale
fatta da A all’authority, in questo modo A può verificare che la richiesta non sia
stata alterata prima di arrivare all’authority e il timestamp originale così che ha
possa verificare che non sia un vecchio messaggio dall’authority contenente
una chiave diversa da quella di B. Il messaggio è cifrato con la chiave privata
dell’authority in questo modo A è sicuro che il messaggio sia stato creato
dall’authority.
3) A memorizza la chiave pubblica di B e la usa per cifrare un messaggio
contenente un identificatore IDa e un nonce N1 utilizzato per identificare la
transazione.
4) B ricava la chiave pubblica di A dall’authority nello stesso modo fatto da A, a
questo punto le chiavi sono state scambiate e potrebbero iniziare a comunicare
5) B invia un messaggio cifrato con la chiave pubblica di A e contenente il nonce
N1 prima inviato da A, in questo modo A è sicuro di star comunicando con B
poiché soltanto conosce la chiave privata necessaria a leggere quel nonce ed
allega anche un altro nonce N2
6) A restituisce N2 a B .
I primi 5 messaggi sono inviati meno frequentemente, poiché i partecipanti possono
salvarsi le chiavi pubbliche. Comunque, un utente dovrebbe periodicamente richiedere
copie aggiornate delle chiavi, non si sa mai che le chiavi siano cambiate.
Certificati
Lo scenario precedente è vulnerabile alla manomissione, inoltre l’authority costituisce
un collo di bottiglia per il sistema. Un approccio alternativo è quello di usare i
certificati che possono essere usati dai partecipanti per scambiarsi le chiavi senza
passare da un’authority, in maniera affidabile, come se le chiavi provenissero da
un’authority. I certificati contengono:
1) Una chiave pubblica
2) Un identificatore del possessore della chiave
3) L’intero blocco firmato da un’entità di terze parti verificata, solitamente
un’agenzia governativa o un istituto finanziario.
Un utente può presentare la sua chiave pubblica ad un’authority, in una maniera
sicura, ed ottenere un certificato. Una volta ottenuto il certificato l’utente può
pubblicarlo oppure inviarlo ad un altro utente. Chiunque abbia bisogno de certificato
può scaricarlo e verificare che sia valido attraverso la firma dell’authority. Questo
schema necessità dei seguenti requisiti:
1) Qualsiasi partecipante può leggere un certificato per determinare il nome e
chiave pubblica del proprietario del certificato
2) Qualsiasi partecipante può verificare che il certificato sia stato creato
dall’authority e che non sia contraffatto
3) Solo l’authority dei certificati può creare e modificare i certificati.
4) Qualsiasi partecipante può verificare la versione del certificato
Gli utenti che desiderano il certificato fanno una richiesta all’authority contenente la
chiave pubblica dell’utente stesso, la richiesta deve avvenire mediante canali sicuri.
L’authority risponde con il certificato. L’utente A può poi inviare il suo certificato, chi
riceve il certificato può poi leggerlo e verificarlo in questo modo:
D (PUauth, CA) = D (PUauth, E (PRauth, [T || IDA || PUa])) = (T || IDA || PUa).
Siccome il certificato è leggibile soltanto con la chiave pubblica dell’authority questo
prova che il certificato proviene proprio dall’authority. Il timestamp serve per
verificare la validità del certificato, prevenendo il seguente scenario:
A genera una nuova coppia di chiavi, nel frattempo un attaccante invia il vecchio
certificato di A a , se B utilizza la chiave pubblica compromessa A l’avversario sarà in
grado di leggere tutti i messaggi destinati ad A. In questo contesto il Timestamp
funziona un po’ come una data di scadenza.
Certificati X.509
X.509 fa parte di X.500 il quale definisce una directory server, cioè una directory che
si occupa di mantenere informazioni sugli utenti. X.509 definisce un framework per
permettere alla directory server di fornire meccanismi di autenticazione (certificati
utente). In aggiunta X.509 definisce dei protocolli basati sull’utilizzo dei certificati.
Figura 9 come vengono ottenuti i certificati X.509

I certificati vengono creati da una qualche CA e messi nella directory dalla CA o


dall’utente.
Versione 3
La versione 2 non fornisce tutte le informazioni necessarie nei design moderni. I
seguenti requisiti non vengono soddisfatti:

Al posto che aggiungere questi campi la versione 3 include un certo numero di


estensioni opzionali, che possono essere aggiunte ai certificati della versione 2. Ogni
estensione consiste di:
1) Identificatore dell’estensione
2) Critically indicator, questo indica se l’estensione può essere ignorata.
Supponiamo che la nostra implementazione non riconosca quest’estensione ci
basta guardare questo campo per vedere se invalidare il certificato o ignorare il
campo.
3) Valore dell’estensione.
Infrastruttura a chiave pubblica
L’infrastruttura a chiave pubblica è l’insieme di hardware, persone, procedure e policy
necessarie per gestire, memorizzare, distribuire e creare i certificati basato su
cifratura a chiave pubblica. L’obbiettivo chiave per costruire un PKI è quello di abilitare
l’acquisizione efficiente di chiavi pubbliche. Un modello molto importante di PKI è il
PKIX, cioè quello basato su
X.509.
1) End entity, entità
(persona o applicazione
(server)), tipicamente
fornisce supporto a
servizi PKI
2) Certification authority,
colui che rilascia il
certificato e anche colui
che li revoca.
3) Registration authority,
componente opzionale
che svolge funzioni
amministrative di
supporto alla CA, spesso
è collegato ad una end
entity.
4) CRL issuer, componente
opzionale al quale la CA delega il compito di pubblicare il CRLs (lista di certificati
da rimuovere)
5) Repository, metodo per memorizzare i certificati e le CRLs.

User authentication
Vogliamo autenticare un utente sulla rete, l’autenticazione costituisce la prima linea di
difesa.
L’autenticazione è il processo di verificare l’identità che un entita dice di essere ad un
sistema. L’autenticazione consiste di 2 passi:
1) Identificazione, presentare un’identificatore al sistema di sicurezza
2) Verificazione, generare le informazioni di autenticazione che confermano il
legame tra l’entità e l’identificatore.
(L’autenticazione utente è differente dall’autenticazione di messaggi). Ci
sono quattro tipi di autenticazione utente che possono essere utilizzati da soli o in
combinazione:
1) Qualcosa che l’utente conosce, per esempio: password, codice pin o risposta ad una
domanda precedentemente costruita.
2) Qualcosa che l’individuo possiede, come per esempio: chiavi di cifratura, carte
elettroniche o chiavi fisiche questo tipo di autenticazione è anche detto token.
3) Qualcosa che l’utente è (sistemi biometrici): impronta digitale, analisi della retina o
faccia.
4) Qualcosa che l’utente fa (sistemi biometrici dinamici), riconoscimento del pattern di
voce, caratteristiche della scrittura e ritmo di battitura.

Ognuno di questi metodi se ben implementato può fornire l’autenticazione sicura dell’utente.
Ognuno di questi ha però un problema: un avversario potrebbe rubare la password o un token.
Inoltre, c’è un alto consumo di risorse amministrative per la gestione delle informazioni di
password e token nei sistemi, soprattutto per quanto concerne rendere sicure queste
informazioni.

Nei sistemi biometrici invece abbiamo il problema dei falsi positivi, falsi negativi, costi inoltre
se il sistema è fatto male potrebbe risultare scomodo per l’utente e praticità.

Per gli utenti che si vogliono autenticare su sistemi che si trovano sulla rete il metodo più
importante coinvolge chiavi di cifratura e qualcosa che l’utente conosce come la password.

Autenticazione Reciproca

Un importante area di applicazione è quella dell’autenticazione reciproca dei protocolli. Questi


protocolli permettono alle parti che comunicano di autenticare se stessi in modo reciproco e
scambiare le chiavi di sessione.

Nel problema dello scambio di chiavi di autenticazione sono 2 problemi:

1) Riservatezza
2) Tempestività

1)Per prevenire la compromissione delle chiavi di sessione, le informazioni di identificazione


essenziali e le informazioni sulla chiave di sessione deveno essere comunicate in modo cifrato.

2)Serve per prevenire gli attacchi di ripetitura dei messaggi,cioè quegli attacchi in cui blocchi
di dati sono ritardati o ripetuti esempio:

 L’avversario copia un messaggio e lo ripete più tardi


 Un avversario può ripetere un messaggio nella finestra di tempo di validatà del
timestamp. Se questa cosa succede, l’incidente che si viene a creare non può essere
salvata su file di log
 Come prima solo che l’avversario trattiene il messaggio originale
 L’avversario ripete il messaggio all’indietro, cioè lo invia a chi lo aveva inviato. Questo
attacco è possibile se si usa la cifratura simmetrica e il mittente non si accorge
facilmente della differenza tra i messaggi ricevuti e inviati sulla base del contenuto

Questi attacchi possono permettere all’attaccante di impersonare un utente sulla rete oppure
invalidare la sessione.

Per evitare questo tipo di attacco si utilizza uno dei due approcci:

1) Timestamps, Ricevente A accetta il messaggio solo se esso contiene un timestamp che


secondo A è abbastanza vicino al tempo di cui è a conoscenza A. Questo richiede che
destinatario e ricevente abbiano gli orologi sincronizzati (solitamente si usa qualche
protocollo).
2) Challenge/response. Il ricevente A che si aspetta un messaggio da B invia ad B un nonce
e richiede che il messaggio seguente (la risposta di B) contenga quel nonce.

Vantaggi e svantaggi dei due approcci


Nel primo caso abbiamo una gestione complicata, serve un protocollo per mantenere la
sincronizzazione tra i clocks dei processi, questo protocollo dev’essere tollerante ai guasti
perché nella rete ci possono essere guasti e dev’essere sicuro per prevenire attacchi. In più la
probabilità che un attacco vada a buon fine aumenta se c’è una temporanea perdita di
sincronizzazione dovuta a guasti nella rete in più dobbiamo ammettere una certa finestra
temporale per cui i messaggi vengono accettati comunque perché nella rete ci possono essere
ritardi non calcolabili.

Il secondo approccio non funziona per applicazioni senza connessione poiché abbiamo
bisogno di un handshake prima di ogni messaggio.
Sicurezza delle reti

I sistemi di informazione nelle agenzie hanno conosciuto negli ultimi anni un importante
sviluppo:

1) Sistemi centralizzati di processamento dei dati, con un mainframe centrale che supporta
un certo numero di terminali direttamente connessi
2) LAN che connettono PC e termali l’uno all’altro e al mainframe
3) Reti locali costituiti da più LAN che interconnettono PC, servers e mainframes
4) Reti aziendali, costituiti da più reti locali, distribuite geograficamente, e connesse
tramite una rete privata WAN
5) Reti connesse a internet, le quali potrebbero essere connesse a una wan privata.

Le aziende moderne nessitano della connetività ad internet. Benchè sia possibile fornire ad
ogni workstation e server nella rete forti meccanismi di sicurezza non è economicamente
conveniente, supponendo che nella rete ci siano migliaia di macchine, ognuna con sistemi
operativi diversi, quando viene scoperta una falla nella sicurezza tutti i sistemi interessati
devono essere aggiornati, benchè esso sia possibile è molto complesso (host based system)
Un approccio migliore è quello di utilizzare un firewall. Un firewall erige un perimetro di
sicurezza tra la rete internet e la rete locale, il firewall potrebbe essere un solo pc o più pc che
collaborano.

Caratteristiche del firewall

1) Tutto il traffico da e verso la rete dev’essere fatta transitare per il firewall


2) Solo il traffico autorizzato, cioè quello che rispetta le policy di sicurezza definite da chi
configura il firewall può passare
3) Il firewall dev’essere impenetrabile.

Ci sono 4 tecniche che i firewall utilizzano per controllare il traffico:

1) Service control, determina i servizi internet ai quali si può fare accesso nella rete, il
firewall in questo contesto può filtrare i pacchetti per: indiririzzo IP, porta; potrebbe
utilizzare un proxy che processa ogni richiesta prima di passarla al firewall.
2) Direction control, Determina la direzione in cui le richieste di un particolare servizio
possano essere permesse di passare nel firewall.
3) User Control, Controllare l’accesso ad un servizio sulla base di quale utente sta
richiedendo quel particolare servizio.
4) Behavior control, controlla come determinati servizi sono usati, esempio un firewall
potrebbe rimuovere lo spam.

I firewall hanno però i loro limiti

1) I firewall non proteggono contro attacchi che bypassano il firewall, all’interno del
sistema ci potrebbero essere macchine con possibilità di accesso da remoto ad un ISP.
2) Minacce interne
3) Reti wirless poco protette potrebbero essere accessibili dall’esterno dell’organizzazione
4) Laptops potrebbero essere infettati al di fuori dell’organizzazione.

Filtro di pacchetti

Un filtro di pacchetti applica delle serie di regole ai pacchetti IP in arrivo e in uscita. Le regole
applicate si basano sui campi del pacchetto IP:

1) IP di sorgente, l’indirizzo IP del sistema che ha originato il pacchetto


2) IP di destinazione
3) Numeri di porta a livello di trasporto
4) Protocollo a livello di trasportp
5) Interfaccia, da quale interfaccia del firewall il pacchetto arriva, oppure da quale
interfaccia del firewall il pacchetto è destinato

Tipicamente il packet filtering avviene definendo delle regole basate su questi campi se
quando arriva un pacchetto c’è una regola che definisce come trattarlo sulla base dei valori
dell’header TCP oppure IP allora si richiama la regola per stabilire se il pacchetto sarà
forwardato o bloccato. Se non c’è una corrispondenza colle regole allora viene intrapresa
un’azione di default, la quale è definita tramite una policy, i valori di default possono essere:

1) Forward, ciò che non è espressamente proibito è permesso


2) Scarta, ciò che non è espressamente proibito non è permesso

La politica di forward fornisce agli utenti più facilità di utilizzo, ma è più vulnerabile a livello di
sicurezza, l’amministratore di sistema deve reagire tempestivamente ad ogni nuovo problema
di sicurezza, questa policy potrebbe essere utilizzata da organizzazioni aperte come per
esempio università.

La politica di Scarto è più restrittiva e potrebbe essere ostica per gli utenti finali, ma offre
sicurezza maggiore. Inizialmente tutti i pacchetti vengono scartati poi caso per caso si
aggiungono le regole. Più utilizzata dalle aziende.

Il set di regole C permette ad un attaccante di mandare pacchetti malevoli sulla rete attraverso
la porta 25, il set di regole D previene questa situazione specificando che i segmenti TCP
devono contenere nell’header ACK in questo modo i pacchetti saranno accettati solo se la
connessione è già avvenuta.

Il set di regole D cerca di gestire le connessioni FTP che utilizzano due connessioni TCP, una per
configurare il trasferimento del file e l’altro per il trasferimento dei dati vero e proprio. Le porte
più attaccate sono quelle con numero di porta basso, quindi le regole specificano di scartare i
pacchetti in arrivo sulla rete interna con numero di porta < 1024.

Il packet filtering è molto semplice e veloce, ma ha delle vulnerabilità:

1) Siccome un packet filter non può controllare i dati ma si basa solo header TCP/UDP e IP
non possono prevenire attacchi che sfruttano vulnerabilità di applicazioni o funzioni,
esempio potrei inviare sulla rete interna dei comandi dannosi da far eseguire ad un
servizio.
2) Siccome delle limitate informazioni del firewall i file di log contengono poche
informazioni.
3) Molti filtri di pacchetti non supportano schemi di autenticazione avanzata.
4) I packet filter sono vulnerabili ad attacchi di tipo spoofing.
5) La configurazione delle regole potrebbe essere fatta male.

Attacchi

1) IP address spoofing, l’attaccante invia sulla rete pacchetti che hanno come sorgente
l’indirizzo IP di una macchian interna alla rete aziendale, in questo modo spera che ci
siano delle regole che accettino il pacchetto poiché viene da una sorgente trusted. Una
soluzione può essere di scartare i pacchetti se hanno come sorgente un ip interno, ma
vengono da un’interfaccia di rete esterna. Questa contromisura è spesso attuata nel
firewall esterno.
2) Source routing attacks, l’attaccante suggerisce al pacchetto la direzione che esso
deve compiere all’interno della rete nella speranza che questo bypassi le misure di
sicurezza. Una contromisura è quella di scartare i pacchetti che utilizzano
quest’opzione.
3) Tiny fragments attacks, l’attaccante frammenta il pacchetto IP in frammenti molto
piccoli e forza il TCP header a stare in un altro frammento, questo si fa poiché i packets
filter esaminano il primo frammento e poi sulla base di questo lasciano passare gli altri,
l’attaccante spera che il primo frammento che non contiene l’header TCP venga lasciato
passare e di conseguenza tutti gli altri. Per evitare questo si impone che un frammento
debba contenere almeno una certa percentuale di header TCP.

Firewall basing

È buona norma utilizzare una macchina a se stante per il firewall sulla quale girano sistemi
operativi sicuri come linux.

Bastion host

Un bastion host è un sistema identificato dall’amministratore del firewall come un punto critico
nella sicurezza di rete. Tipicamente viene utilizzato come piattaforma per un application-level
gateway o circuit level gateway. I bastion host hanno alcune caratteristiche comuni:

1) L’hardware del bastion host esegue una versione sicura del sistema operativo,
rendendolo più resistente.
2) Solo i servizi che l’amministratore di sistema ritiene essenziali sono installati sul bastion
host DNS, FTP, http e SMTP
3) Il bastion host potrebbe richiedere

DMZ
Un firewall viene posizionato ai limiti di una reta locale, dentro il router di confine che connette
la rete locale a qualche wan. Uno o più firewall proteggono la rete locale tra questi firewall ci
sono delle regioni di rete accessibili esternamente, contenenti dispositivi, tipicamente i sistemi
che si trovano nella DMZ richiedono connettività esterna, esempio un web server, e-mail server
oppure DNS server.

Il firewall esterno serve per fornire misure di accesso controllato e protezione ai servizi sulla
DMZ dovuto alla necessità di questi sistemi di acceddere alla rete esterna. Il firewall fornisce
anche una protezione di base per i dispositivi sulla rete dell’organizzazione. In questa
configurazione i firewall locali forniscono i seguenti servizi:

1) I firewall forniscono servizi di packet filtering più severi rispetto al firewall esterno al fine
di proteggere le workstations e i servers che si trovano sulla rete aziendale
2) I firewall interni forniscono una doppia protezione rispetto alla DMZ
a. Proteggono dagli attacchi lanciati dai sistemi sulla DMZ
b. Proteggono la DMZ dagli attacchi lanciati dalla rete interna
3) Possono essere utilizzati per proteggere porzioni di reti interne tra di loro, per esempio
un firewall interno può essere configurato, in modo che i server interni protetti dalle
workstations e viceversa. Una pratica come è di mettere la DMZ in un’interfaccia di rete
diversa sul firewall esterno rispetto a quella usata per accedere alla
rete interna.