Asdas
Asdas
Per definire le caratteristiche di una funzione hash definiamo un modello matematico chiamato oracolo casuale.
Quando chiedo per la prima volta all’oracolo di calcolare la funzione h di un testo in chiaro questo mi genera un
numero casuale di n bit. Questa operazione è ripetuta per ogni messaggio in chiaro diverso in cui l’oracolo mi
risponde con una diversa stringa casuale; nel caso in cui io ripresenti la stessa stringa m l’oracolo genera
nuovamente la stringa che ha generato prima. Dunque, la funzione è una funzione non invertibile poiché dal
numero randomico non posso risalire al messaggio m corrispondente (one-way function) e nasconde tutte le
informazioni semantica del messaggio originale (quindi una cifratura non decifrabile).
Una seconda caratteristica è quello di evitare le collisioni, infatti se io produco 2^(n+1) genero sicuramente una
collisione; dunque, a seconda del numero di messaggi che devo gestire scelgo il parametro di sicurezza n
adeguato. A livello probabilistico bisogna definire il parametro n in modo tale da ridurre al minimo la probabilità
di collisione.
Dato un gruppo di 23 persone, qual è la probabilità che almeno due (qualsiasi) di esse festeggino il compleanno
nello stesso giorno?
Dato un gruppo di N elementi, con N grande, e due gruppi di r scelte casuali (con ripetizione) di tali elementi, la
probabilità che almeno una scelta del primo gruppo coincida con una del secondo è circa pari a 1 – e– λ, con λ =
r2/N. La probabilità che ci siano esattamente i scelte coincidenti tra il primo gruppo ed il secondo è invece circa
pari a (λ i * e – λ / i!). Se r è dell’ordine √𝑁, allora la probabilità di avere almeno una scelta coincidente è
significativa. Ad esempio, se N = 365 e r = 30, la probabilità di avere almeno una coincidenza è pari al 91.5%
Il paradosso del compleanno è importante in quanto un attaccante per individuare una collisione su una funzione
di hash non necessità di 2𝑛 tentativi ma 2√𝑛 e dunque è necessario scegliere il parametro di sicurezza n tenendo
conto che il valore da prendere in considerazione è la sua radice.
• Alice crea la sua funzione e sfida l’attaccante a trovare una collisione mostrandogli la chiave e la
funzione. L’attaccante deve trovare due X2=! X1 in modo tale che H (k, X1) = H (k, X2) in questo modo
ha trovato una collisione. La probabilità di trovare una collisione dipende dal parametro di sicurezza,
l’attaccante può sfruttare il paradosso del compleanno (ordine di radice di 2^n). Questo significa che
h(m) è fortemente resistente alle collisioni (collision resistance).
• In un'altra sfida Alice invia X1 e l’attaccante deve rispondere con X2 (la sfida, quindi è più difficile da
vincere poiché l’attaccante non può usare il paradosso del compleanno quindi probabilità di 2^n). In tal
caso la funzione h si dice debolmente resistente alle collisioni (second pre-image resistance).
• Una terza possibilità Alice invia h(X1) e chiede all’attaccante di trovare X2 tale per cui h(X2) =h(X1).
Questo significa che h(m) è una funzione unidirezionale (one-way function), ovvero che è resistente
all’inversione (pre-image resistance).
Per creare una funzione hash si parte definendo un algoritmo di compressione con due ingressi di n, m bit ed
un’uscita ad n bit. L’algoritmo usa una funzione f (n, m) che produce n bit in output pseudocasuali. Nel caso di
un messaggio più lungo di n si frammenta in blocchi più piccoli o padding nel caso di messaggi più piccoli.
Basandosi su questa funzione definiamo lo schema di Merkel-Damgard dove la chiave è il vettore di
inizializzazione e in sequenza le funzioni di compressione per ogni blocco del messaggio. Poiché alla fine si
aggiunge un blocco con la rappresentazione binaria della lunghezza del messaggio in modo da evitare la
collisione generata dal padding.
Nella pratica sono stati definiti una serie di algoritmi con dei valori di n e K fissi come ad esempio MD5, SHA-1,
SHA-2 in cui la chiave è data da un vettore di inizializzazione.
HMAC
Il message authentication code usa i tre algoritmi base:
L’idea è di validare il messaggio ricevuto, calcolandosi il tag T e confrontandolo con quello ricevuto (ovviamente
la chiave K utilizzata deve essere la stessa). La versione HMAC dell’algoritmo applica come algoritmo di cifratura
la funzione hash in quanto è più rapida l’esecuzione del controllo di integrità del messaggio. La chiave K è
concatenata con il messaggio M ed è applicata una funzione hash collision resistance che genera un tag di
dimensione pari al parametro di sicurezza ad n bit -> H(K||M) = T. Tuttavia, tale meccanismo non risulta
abbastanza sicuro per la verifica dell’integrità (si pensava che si dovessero usare due chiavi segrete ma alla fine
si è optati con una chiave con delle particolari caratteristiche). In realtà si applica due volte la chiave segreta in
due modi diversi. La chiave è in somma modulo 2 con un opad e poi concatenata con una seconda applicazione
di H con la chiave in XOR con ipad e concatenata al messaggio.
Quando il messaggio viene inviato si invia anche il tag in modo tale che il destinatario possa verificare l’integrità
del messaggio.
Nel caso in cui oltre all’integrità volessi garantire anche la confidenzialità devo combinare la tecnica di cifratura
con quella di HMAC. Tale tecnica è chiamata authenticated encryption in cui abbiamo diverse opzioni
(ovviamente si usano due chiavi una per la cifratura ed una per calcolare il tag):
- In un'opzione posso cifrare e poi calcolare il MAC. In questo caso posso fare la verifica dell’integrità
prima di decifrare il messaggio. In questo caso la verifica può essere disaccoppiata e la verifica può
avvenire al livello di trasporto e la decifratura a livello applicativo.
- Oppure posso calcolare il MAC e poi cifrare. Nel caso in cui calcoli il tag a partire dal messaggio in chiare
e se questo contenesse delle informazioni sul messaggio in chiaro, allora dovrei cifrare anche il tag
poiché potrebbe essere rischioso trasmetterlo in chiaro. In ogni caso per fare la verifica del tag il
messaggio lo devo prima decifrare.
- CYPHERTEXT-ONLY: L’attaccante tenta di dedurre le informazioni a partire dal testo cifrato. (PASSIVO)
- KNOWN-PLAINTEXT: In questo caso l’attaccante oltre al testo cifrato ha a disposizione degli esempi in
cui c’è sia il testo in chiaro che quello cifrato corrispondente. In questo caso è necessario utilizzare un
algoritmo non deterministico di cifratura. (PASSIVO)
- CHOSEN PLAINTEXT: Il difensore e l’attaccante interagiscono tra di loro. L’attaccante chiede al
difensore di cifrare dei messaggi a sua scelta.
- CHOSEN CYPHERTEXT: L’attaccante ha la possibilità di chiedere al difensore di decifrare dei messaggi
cifrati che ha scelto.
Un buon algoritmo di cifratura resiste ai primi tre attacchi, ma combinando l’algoritmo di cifratura con un
algoritmo di MAC in realtà possiamo resistere agli attacchi CCA in quanto se l’attaccante non ha a disposizione
la chiave del MAC non può generare un testo cifrato autentico.