Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
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
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)
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
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.
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.
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 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.
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
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.
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.
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.
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.
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
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)
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
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.
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.
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:
HMAC algoritmo
L’HMAC può essere definito come segue:
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:
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
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.
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
1) Riservatezza
2) Tempestività
2)Serve per prevenire gli attacchi di ripetitura dei messaggi,cioè quegli attacchi in cui blocchi
di dati sono ritardati o ripetuti esempio:
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:
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.
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.
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:
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:
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.
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.