POLITECNICO DI MILANO Funzioni di hash sicure: MD5 e SHA-1 CEFRIEL - Politecnico di Milano cerri@cefriel.it http://www.cefriel.it/~cerri/ Funzioni di hash Una funzione di hash (o message digest) è una funzione H che, dato un input M di dimensione qualsiasi, produce un output h (l hash) di dimensione fissa: h = H(M) Lo scopo di una funzione di hash è di creare un impronta (fingerprint) del messaggio. Dato che l output ha lunghezza fissa (in genere dell ordine di una o poche centinaia di bit), esisteranno necessariamente diversi messaggi che generano lo stesso hash... ma non è detto che si riesca a trovarli... - 2-1
Unidirezionalità Una funzione di hash sicura deve essere unidirezionale (one-way), cioè: dato un qualsiasi M, deve essere computazionalmente semplice calcolare H(M); dato un qualsiasi h, deve essere computazionalmente impraticabile calcolare un M tale che h = H(M); L idea è che l hash di un messaggio sia in sostanza una corrispondenza pseudocasuale, per cui non è possibile prevedere in alcun modo il risultato se non calcolando l hash. Messaggi diversi, anche per un solo bit, devono generare hash non correlati. - 3 - Assenza di collisioni (1) Una funzione di hash sicura deve essere senza collisioni (collision-resistant): dato un qualsiasi M, deve essere computazionalmente impraticabile trovare un M M tale che H(M ) = H(M) (funzione debolmente senza collisioni); deve essere computazionalmente impraticabile trovare una coppia (M, M ), con M M, tale che H(M) = H(M ) (funzione fortemente senza collisioni). L idea è che, anche se necessariamente esistono messaggi diversi che producono lo stesso hash, non è praticabile trovarli. - 4-2
Assenza di collisioni (2) Le due proprietà sull assenza di collisioni (debole e forte), corrispondono a due diversi tipi di attacchi a forza bruta: attacco a forza bruta semplice : trovare un messaggio che produca un dato hash (cioè un hash uguale a quello di un messaggio dato); attacco del compleanno (birthday attack): trovare due messaggi che producano lo stesso hash, indipendentemente dal valore di questo hash. La complessità dei due attacchi è molto diversa! se l hash è lungo m bit, la complessità del primo è 2 m, quella del secondo è 2 m/2. - 5 - Che cosa NON è un hash Un hash non è né una firma né un MAC (Message Authentication Code), di per sè non garantisce autenticazione e/o integrità. Nel calcolo di un hash non si inserisce nessuna informazione segreta, per cui chiunque può generare l hash corretto di qualunque messaggio. Una funzione di hash non è un algoritmo di cifratura. Calcolare l hash di un messaggio non equivale a cifrarlo: il calcolo di un hash non include nessuna chiave, e soprattutto è un operazione non invertibile. - 6-3
MD5 e SHA-1 Le due funzioni di hash sicure attualmente più diffuse sono MD5 e SHA-1, che hanno una struttura simile. costante messaggio ( padding) hash hash 512 bit 512 bit hash 512 bit message digest - 7 - MD5 MD5 (Message Digest 5) è stato progettato da Ron Rivest, ed è definito in RFC 1321 (1992). Il messaggio viene elaborato a blocchi di 512 bit. L hash è di 128 bit 128 bit. Ad ogni iterazione si calcola una funzione che prende in ingresso il blocco corrente del messaggio e il valore dell hash all iterazione precedente. L hash finale è quello risultante dall ultima iterazione. Non è più considerato molto sicuro (128 bit di hash non sono molti). - 8-4
MD5: padding Prima di iniziare l elaborazione, si aggiunge al messaggio un padding in modo che la lunghezza totale risulti un multiplo di 512 bit: si aggiunge un bit a 1 e poi tanti bit a 0 quanto basta perché la lunghezza risulti di 64 bit minore rispetto a un multiplo di 512 bit (se la lunghezza originale è già corretta si aggiungono comunque 512 bit); si aggiungono 64 bit contenenti la lunghezza originale del messaggio (modulo 2 64 ). 1-512 bit 64 bit messaggio originale 1000...0 lunghezza multiplo di 512 bit - 9 - Elaborazione MD5 (1) Un iterazione MD5 (cioè l elaborazione su un blocco del messaggio) è composta da 4 passi. Indichiamo con: d i : i-esima parola (32 bit) del digest (i=0-3); m i : i-esima parola di un blocco di messaggio (i=0-15); T i = 2 32 sen i, (i=1-64); x: rotazione sinistra di x posizioni (su 32 bit); : somma modulo 2 32 ;,,, : rispettivamente AND, OR, NOT, XOR (calcolati bit a bit). - 10-5
Elaborazione MD5 (2) Il valore del digest viene così inizializzato: d 0 = 0x67452301, d 1 = 0xEFCDAB89, d 2 = 0x98BADCFE, d 3 = 0x10325476. Ogni passo prende in ingresso il valore corrente del digest e il blocco corrente del messaggio, e modifica (fornendolo in uscita) il valore corrente del digest. Il valore del digest in uscita dal quarto passo viene poi sommato (indipendentemente per le 4 parole d 0, d 1, d 2, d 3 ) al valore di ingresso al primo passo dell iterazione corrente; il risultato è il valore di uscita dell iterazione. - 11 - Elaborazione MD5 (3) Ogni passo è composto da 16 operazioni 16 operazioni. La i-esima (i=0-15) operazione ha la forma: d (-i) mod 4 = d (1-i) mod 4 (d (-i) mod 4 f p (d (1-i) mod 4, d (2-i) mod 4, d (3-i) mod 4 ) m j T k ) S p (i mod 4) ogni operazione: aggiorna uno dei 4 blocchi del digest (in ogni passo ogni blocco del digest viene aggiornato 4 volte); utilizza uno dei 16 blocchi del messaggio m j (in ogni passo ogni blocco viene usato una volta); utilizza una delle 64 costanti T k ; utilizza una funzione f p diversa per ogni passo; effettua una rotazione il cui valore è determinato da una funzione S p diversa per ogni passo; - 12-6
Elaborazione MD5 (4) A (e.g. d 0 ) B (e.g. d 1 ) C (e.g. d 2 ) D (e.g. d 3 ) m j f p schema di una operazione MD5 T k S p (i mod 4) A (e.g. d 3 ) B (e.g. d 0 ) C (e.g. d 1 ) D (e.g. d 2 ) - 13 - Elaborazione MD5: passo 1 Definiamo F(x,y,z) = (x y) ( x z). Per i=0-15 si esegue: d (-i) mod 4 = d (1-i) mod 4 (d (-i) mod 4 F(d (1-i) mod 4, d (2-i) mod 4, d (3-i) mod 4 ) m i T i1 ) S 1 (i mod 4) dove S 1 (0) = 7, S 1 (1) = 12, S 1 (2) = 17, S 1 (3) = 22. Le prime 5 di 16 operazioni sono quindi: d 0 = d 1 (d 0 F(d 1, d 2, d 3 ) m 0 T 1 ) 7 (i=0) d 3 = d 0 (d 3 F(d 0, d 1, d 2 ) m 1 T 2 ) 12 (i=1) d 2 = d 3 (d 2 F(d 3, d 0, d 1 ) m 2 T 3 ) 17 (i=2) d 1 = d 2 (d 1 F(d 2, d 3, d 0 ) m 3 T 4 ) 22 (i=3) d 0 = d 1 (d 0 F(d 1, d 2, d 3 ) m 4 T 5 ) 7 (i=4) - 14-7
Elaborazione MD5: passo 2 Definiamo G(x,y,z) = (x z) (y z). Per i=0-15 si esegue: d (-i) mod 4 = d (1-i) mod 4 (d (-i) mod 4 G(d (1-i) mod 4, d (2-i) mod 4, d (3-i) mod 4 ) m (5i1) mod 16 T i17 ) S 2 (i mod 4) dove S 2 (0) = 5, S 2 (1) = 9, S 2 (2) = 14, S 2 (3) = 20. Le prime 5 di 16 operazioni sono quindi: d 0 = d 1 (d 0 G(d 1, d 2, d 3 ) m 1 T 17 ) 5 (i=0) d 3 = d 0 (d 3 G(d 0, d 1, d 2 ) m 6 T 18 ) 9 (i=1) d 2 = d 3 (d 2 G(d 3, d 0, d 1 ) m 11 T 19 ) 14 (i=2) d 1 = d 2 (d 1 G(d 2, d 3, d 0 ) m 0 T 20 ) 20 (i=3) d 0 = d 1 (d 0 G(d 1, d 2, d 3 ) m 5 T 21 ) 5 (i=4) - 15 - Elaborazione MD5: passo 3 Definiamo H(x,y,z) = x y z. Per i=0-15 si esegue: d (-i) mod 4 = d (1-i) mod 4 (d (-i) mod 4 H(d (1-i) mod 4, d (2-i) mod 4, d (3-i) mod 4 ) m (3i5) mod 16 T i33 ) S 3 (i mod 4) dove S 3 (0) = 4, S 3 (1) = 11, S 3 (2) = 16, S 3 (3) = 23. Le prime 5 di 16 operazioni sono quindi: d 0 = d 1 (d 0 H(d 1, d 2, d 3 ) m 5 T 33 ) 4 (i=0) d 3 = d 0 (d 3 H(d 0, d 1, d 2 ) m 8 T 34 ) 11 (i=1) d 2 = d 3 (d 2 H(d 3, d 0, d 1 ) m 11 T 35 ) 16 (i=2) d 1 = d 2 (d 1 H(d 2, d 3, d 0 ) m 14 T 36 ) 23 (i=3) d 0 = d 1 (d 0 H(d 1, d 2, d 3 ) m 1 T 37 ) 4 (i=4) - 16-8
Elaborazione MD5: passo 4 Definiamo I(x,y,z) = y (x z). Per i=0-15 si esegue: d (-i) mod 4 = d (1-i) mod 4 (d (-i) mod 4 I(d (1-i) mod 4, d (2-i) mod 4, d (3-i) mod 4 ) m (7i) mod 16 T i49 ) S 4 (i mod 4) dove S 4 (0) = 6, S 4 (1) = 10, S 4 (2) = 15, S 4 (3) = 21. Le prime 5 di 16 operazioni sono quindi: d 0 = d 1 (d 0 I(d 1, d 2, d 3 ) m 0 T 49 ) 6 (i=0) d 3 = d 0 (d 3 I(d 0, d 1, d 2 ) m 7 T 50 ) 10 (i=1) d 2 = d 3 (d 2 I(d 3, d 0, d 1 ) m 14 T 51 ) 15 (i=2) d 1 = d 2 (d 1 I(d 2, d 3, d 0 ) m 5 T 52 ) 21 (i=3) d 0 = d 1 (d 0 I(d 1, d 2, d 3 ) m 12 T 53 ) 6 (i=4) - 17 - SHA-1 SHA-1 (Secure Hash Algorithm 1) è stato progettato dal NIST (l algoritmo SHA originale è stato sostituito con SHA-1 dal NIST stesso per via di una vulnerabilità non pubblicata). Il messaggio (che deve essere di lunghezza inferiore a 2 64 bit) viene elaborato a blocchi di 512 bit. L hash è di 160 bit 160 bit. Ad ogni iterazione si calcola una funzione che dipende dal blocco corrente del messaggio e dal valore dell hash all iterazione precedente; il risultato viene sommato (per singola parola) al valore dell iterazione precedente. - 18-9
SHA-1: inizializzazione Al messaggio viene aggiunto un padding (uguale a quello di MD5) Le 5 parole di 32 bit del digest (A, B, C, D, E) vengono inizializzate con: A = 0x67452301, B = 0xEFCDAB89, C = 0x98BADCFE, D = 0x10325476, E = 0xC3D2E1F0. Ogni iterazione calcola dei valori di A, B, C, D, E che vengono sommati ai precedenti prima di passare all iterazione successiva. Alla fine, la concatenazione di A, B, C, D, E costituisce il digest del messaggio. - 19 - SHA-1: schema iterazione (1) Il blocco corrente di messaggio (512 bit) viene utilizzato per costruire una stringa di 5 x 512 bit (80 parole di 32 bit). Le prime 16 parole coincidono con il blocco del messaggio, le successive sono calcolate così: W i = (W i-3 W i-8 W i-14 W i-16 ) 1 (i=16-79) la rotazione di un bit è stata aggiunta in SHA-1 (è l unica differenza tra SHA e SHA-1). Si scorre la stringa di 80 parole una parola alla volta (80 operazioni), calcolando i nuovi valori A, B, C, D, E. Alla fine, i nuovi valori verranno aggiunti agli A, B, C, D, E precedenti. - 20-10
SHA-1: schema iterazione (2) Ogni iterazione è composta da 80 operazioni. Per i=0-79: B, C, D, E sono calcolati così: B = A C = B 30 D = C E = D A viene calcolato così: A = E (A 5) W i K i f i (B, C, D) dove K i vale: 30 30 2 2 ( i = 0 19) 2 3 ( i = 20 39) 30 30 2 5 i = 40 59 2 10 i = 60 79 e f i (B, C, D) vale: B C ~ B D ( ) ( ) ( ) ( i = 0 19) B C D ( i = 20 39, i = 60 79) ( B C) ( B D) ( C D) ( i = 40 59) ( ) - 21 - SHA-1: schema operazione A B C D E f i schema di una operazione SHA-1 5 30 W i K i A B C D E - 22-11
MD5 vs. SHA-1 lunghezza hash lunghezza massima messaggio dimensione blocco messsaggio numero operazioni numero costanti additive numero funzioni primitive MD5 128 bit illimitata 512 bit 64 64 4 SHA-1 160 bit 2 64-1 bit 512 bit 80 4 4 (di cui 2 uguali) - 23-12