Passa al contenuto principale

4. Message Padding and Parsing (Riempimento e analisi del messaggio)

Le funzioni hash specificate nel presente documento vengono utilizzate per calcolare un message digest per un messaggio o file di dati fornito come input. Il messaggio o file di dati dovrebbe essere considerato come una stringa di bit. La lunghezza del messaggio è il numero di bit nel messaggio (il messaggio vuoto ha lunghezza 0). Se il numero di bit in un messaggio è un multiplo di 8, per compattezza possiamo rappresentare il messaggio in esadecimale. Lo scopo del riempimento del messaggio è rendere la lunghezza totale di un messaggio riempito un multiplo di 512 per SHA-224 e SHA-256 o un multiplo di 1024 per SHA-384 e SHA-512.

Quanto segue specifica come deve essere eseguito questo riempimento. In sintesi, un "1" seguito da m "0" seguito da un intero di 64 bit o 128 bit vengono aggiunti alla fine del messaggio per produrre un messaggio riempito di lunghezza 512n o 1024n. L'intero aggiunto è la lunghezza del messaggio originale. Il messaggio riempito viene quindi elaborato dalla funzione hash come n blocchi di 512 bit o 1024 bit.

4.1. SHA-224 e SHA-256

Supponiamo che un messaggio abbia lunghezza L < 2^64. Prima di essere immesso nella funzione hash, il messaggio viene riempito a destra come segue:

a. Viene aggiunto "1". Esempio: se il messaggio originale è "01010000", questo viene riempito a "010100001".

b. Vengono aggiunti K "0" dove K è la più piccola soluzione non negativa dell'equazione

( L + 1 + K ) mod 512 = 448

c. Quindi viene aggiunto il blocco di 64 bit che è L in rappresentazione binaria. Dopo aver aggiunto questo blocco, la lunghezza del messaggio sarà un multiplo di 512 bit.

Esempio: Supponiamo che il messaggio originale sia la stringa di bit

01100001 01100010 01100011 01100100 01100101

Dopo il passaggio (a) questo dà

01100001 01100010 01100011 01100100 01100101 1

Poiché L = 40, il numero di bit in quanto sopra è 41 e vengono aggiunti K = 407 "0", portando il totale ora a 448. Questo dà quanto segue in esadecimale:

61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000

La rappresentazione di 64 bit di L = 40 è esadecimale 00000000 00000028. Pertanto, il messaggio riempito finale è il seguente esadecimale:

61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000028

4.2. SHA-384 e SHA-512

Supponiamo che un messaggio abbia lunghezza L < 2^128. Prima di essere immesso nella funzione hash, il messaggio viene riempito a destra come segue:

a. Viene aggiunto "1". Esempio: se il messaggio originale è "01010000", questo viene riempito a "010100001".

b. Vengono aggiunti K "0" dove K è la più piccola soluzione non negativa dell'equazione

( L + 1 + K ) mod 1024 = 896

c. Quindi viene aggiunto il blocco di 128 bit che è L in rappresentazione binaria. Dopo aver aggiunto questo blocco, la lunghezza del messaggio sarà un multiplo di 1024 bit.

Esempio: Supponiamo che il messaggio originale sia la stringa di bit

01100001 01100010 01100011 01100100 01100101

Dopo il passaggio (a) questo dà

01100001 01100010 01100011 01100100 01100101 1

Poiché L = 40, il numero di bit in quanto sopra è 41 e vengono aggiunti K = 855 "0", portando il totale ora a 896. Questo dà quanto segue in esadecimale:

61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000

La rappresentazione di 128 bit di L = 40 è esadecimale 00000000 00000000 00000000 00000028. Pertanto, il messaggio riempito finale è il seguente esadecimale:

61626364 65800000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000028