SHA-2 ( Secure Hash Algorithm ) è una famiglia di funzioni hash che sono state progettate dalla United States National Security Agency (NSA), sul modello delle funzioni SHA-1 e SHA-0 , esse stesse fortemente ispirate alla funzione MD4 di Ron Rivest (che ha dato parallelamente MD5 ). Come descritto dal National Institute of Standards and Technology (NIST), include le funzioni SHA-256 e SHA-512 i cui algoritmi sono simili ma operano su parole di dimensioni diverse (32 bit per SHA-256 e 64 bit per SHA-512 ), SHA-224 e SHA-384 che sono essenzialmente versioni dei precedenti con output troncato, e più recentemente SHA-512/256 e SHA-512/224 che sono versioni troncate di SHA-512. L'ultimo suffisso indica il numero di bit nell'hash.
Gli algoritmi della famiglia SHA-2, SHA-256, SHA-384 e SHA-512, sono descritti e pubblicati dalla società SHA1 come un governo federale standard degli Stati Uniti ( Federal Information Processing Standard ) nel FIPS 180-2 (Secure Hash Standard) del 2002 (nel 2001 è stata fatta una pre-pubblicazione per i commenti). La funzione SHA-224 viene aggiunta un po 'più tardi. L'ultima versione fino ad oggi, FIPS 180-4 (Secure Hash Standard) risale amarzo 2012 e aggiunge le funzioni SHA-512/256 e SHA-512/224.
Nel 2005 sono stati evidenziati i problemi di sicurezza di SHA-1 : esiste un attacco teorico per la ricerca sulle collisioni che è significativamente più veloce del generico attacco del compleanno alle funzioni hash. Sebbene l'algoritmo SHA-2 condivida somiglianze con quello di SHA-1, attualmente questi attacchi non possono essere estesi a SHA-2. Il NIST, tuttavia, ha indetto una competizione per selezionare una nuova funzione hash, SHA-3 . Alla fine del 2012, il concorso ha portato alla scelta di una nuova famiglia di funzioni il cui design è molto diverso da SHA-1 e SHA-2. La nuova famiglia di funzioni si presenta come un'altra possibile scelta, non mette in discussione l'utilizzo di SHA-2 almeno per il momento.
Come tutte le funzioni hash, le funzioni SHA-2 prendono come input un messaggio di dimensione arbitraria, con un limite (tutto teorico) per esso, e producono un risultato (chiamato " hash ", hash , condensate o anche fingerprint ...) di fixed dimensione. La dimensione dell'hash è indicata dal suffisso: 224 bit per SHA-224, 256 bit per SHA-256, 384 bit per SHA-384 e 512 bit per SHA-512.
Gli algoritmi della famiglia SHA-2 sono molto simili, ci sono fondamentalmente due diverse funzioni, SHA-256 e SHA-512, le altre sono variazioni dell'una o dell'altra. Le funzioni SHA-256 e SHA-512 hanno la stessa struttura ma differiscono per la dimensione delle parole e dei blocchi utilizzati. Questa struttura è abbastanza simile a quella di SHA-1, ma un po 'più complessa ed evita alcune note debolezze. Si riferisce più in generale a una famiglia di funzioni hash ispirate a MD4 e MD5 di Ron Rivest . Troviamo come primitive l'addizione per interi di dimensione fissa n, cioè un'addizione modulo 2 n , un'operazione non lineare (nel senso di algebra lineare ) sul campo di Booleani F 2 , nonché operazioni bit per bit (xor e altre).
Come tutte le funzioni di questa famiglia (eccetto SHA-3, basata su una funzione spugna ), seguono uno schema iterativo che segue la costruzione di Merkle-Damgård (senza un'operazione di finalizzazione). La funzione di compressione iterata ha due input di dimensione fissa, con il secondo input della stessa dimensione dell'output della funzione:
Gli ingressi della funzione di compressione sono suddivisi
La funzione di compressione ripete le stesse operazioni un determinato numero di volte, si parla di giro o giro , 64 giri per SHA-256, 80 giri per SHA-512. Ogni turno comporta come primitive l'intera addizione per interi di dimensione fissa, vale a dire un'addizione modulo 2 32 o modulo 2 64 , operazioni bit per bit: operazioni logiche, offset con perdita di parte dei bit e offset circolari e predefiniti costanti, utilizzate anche per l'inizializzazione.
Prima dell'elaborazione, il messaggio viene completato da un riempimento in modo che la sua lunghezza sia un multiplo della dimensione del blocco elaborato dalla funzione di compressione. L'imbottitura riprende la lunghezza (in binario) della parola da elaborare: è il potenziamento del Merkle-Damgård ( (en) Merkle-Damgård rinforzo ), che permette di ridurre la resistenza alle collisioni della funzione hash a quella della funzione di compressione. Questa lunghezza è memorizzata alla fine del riempimento su 64 bit nel caso di SHA-256 (come per SHA-1), oltre 128 bit nel caso di SHA-512, che "limita" la dimensione dei messaggi da elaborato a 2 64 bit per SHA-256 (e SHA-224) ea 2128 bit per SHA-512 (e SHA-384).
La funzione SHA-256 diventa nel 2002 uno standard federale di elaborazione delle informazioni ( FIPS del NIST ). Produce un hash a 256 bit . Le caratteristiche di SHA-256 sono le seguenti:
L'algoritmo può essere suddiviso in due fasi
a, b, c, ..., h = variabili di lavoro (in questo caso parole w-bit), utilizzate nel calcolo dell'hash
= il valore hash # i. è il valore iniziale dell'hash. è l'ultimo valore hash.
= parola (w bit) # j del valore hash # i, dove è la parola più significativa (a sinistra) del valore hash i.
= costanti iterative in base al valore di t, utilizzato nel calcolo dell'hash
k = numero di 0 aggiunti al messaggio durante la preelaborazione (complemento)
l = lunghezza del messaggio M, in bit
m = numero di bit contenuti in un blocco, ovvero 512 bit
M = messaggio da elaborare = blocco n ° i (m bit), messaggio M = parola (w bit) n ° j, blocco (m bit) n ° i, messaggio M
n = numero di bit di spostamento o rotazione da applicare alla parola quando associata a una funzione binaria
N = numero di blocchi di m bit contenuti nel messaggio M dopo il complemento
T = variabile temporanea , parola di w bit, utilizzata nel calcolo dell'hash
w = numero di bit contenuti in una parola, cioè 32 bit. = la parola n ° t della tabella dedotta dal messaggio
La notazione esadecimale utilizzata qui sarà:
esempio:= operazione binaria AND = operazione binaria OR = operazione binaria XOR = complemento binario = addizione modulo = spostamento binario a sinistra, dove si ottiene rimuovendo gli n bit sinistri di x e aggiungendo n zeri a destra. = spostamento binario a destra, dove si ottiene rimuovendo gli n bit di destra di x e aggiungendo n zeri a sinistra.
Le operazioni utilizzate sono le seguenti:
Questa sezione descrive le funzioni utilizzate durante il calcolo dei valori hash. SHA-256 utilizza 6 funzioni logiche che lavorano su parole a 32 bit indicate con x, y, z. Il risultato di ciascuna di queste funzioni è una nuova uscita di parola a 32 bit.
Costanti
SHA-256 utilizza 64 valori costanti di parole a 32 bit, annotato . questi numeri rappresentano i primi 32 bit della parte decimale delle radici cubiche dei primi 64 numeri primi . I seguenti valori sono espressi in notazione esadecimale (base 16).
0x428a2f98 | 0x71374491 | 0xb5c0fbcf | 0xe9b5dba5 | 0x3956c25b | 0x59f111f1 | 0x923f82a4 | 0xab1c5ed5 | |
0xd807aa98 | 0x12835b01 | 0x243185be | 0x550c7dc3 | 0x72be5d74 | 0x80deb1fe | 0x9bdc06a7 | 0xc19bf174 | |
0xe49b69c1 | 0xefbe4786 | 0x0fc19dc6 | 0x240ca1cc | 0x2de92c6f | 0x4a7484aa | 0x5cb0a9dc | 0x76f988da | |
0x983e5152 | 0xa831c66d | 0xb00327c8 | 0xbf597fc7 | 0xc6e00bf3 | 0xd5a79147 | 0x06ca6351 | 0x14292967 | |
0x27b70a85 | 0x2e1b2138 | 0x4d2c6dfc | 0x53380d13 | 0x650a7354 | 0x766a0abb | 0x81c2c92e | 0x92722c85 | |
0xa2bfe8a1 | 0xa81a664b | 0xc24b8b70 | 0xc76c51a3 | 0xd192e819 | 0xd6990624 | 0xf40e3585 | 0x106aa070 | |
0x19a4c116 | 0x1e376c08 | 0x2748774c | 0x34b0bcb5 | 0x391c0cb3 | 0x4ed8aa4a | 0x5b9cca4f | 0x682e6ff3 | |
0x748f82ee | 0x78a5636f | 0x84c87814 | 0x8cc70208 | 0x90befffa | 0xa4506ceb | 0xbef9a3f7 | 0xc67178f2 |
Questa operazione si svolge in tre passaggi: completare il messaggio M, dividere il risultato in blocchi e inizializzare i valori hash.
MarmellataCiò comporta il completamento del messaggio M in modo che abbia una dimensione multipla di 512 bit. Il riempimento utilizza la rappresentazione binaria dell'intero l che è la lunghezza in bit del messaggio M (rinforzo Merkle-Damgård ). Per fare ciò aggiungiamo successivamente:
Esempi:
Il messaggio completato è diviso in N blocchi di 512 bit, annotati . Ciascun blocco di 512 bit viene quindi diviso in 16 parole di 32 bit, annotate .
InizializzazioniAlle otto variabili seguenti vengono assegnati valori iniziali come segue:
Per questo trattamento useremo
Gli N blocchi di M vengono elaborati successivamente secondo le seguenti fasi
Per i = 1 a N
{
}
Dopo aver ripetuto i quattro passaggi precedenti per gli N blocchi del messaggio M, (ovvero, dopo l'elaborazione di ), il digest a 256 bit di M viene ottenuto dalla concatenazione dei valori
La funzione SHA-224 è stata rilasciata per la prima volta nel 2004. L'output (hash, hash o hash) è di 224 bit . È stato appositamente progettato per fornire un'impronta digitale la cui dimensione corrisponde a quattro chiavi DES di 56 bit ciascuna. L'algoritmo è quello di SHA-256 con solo differenze
La funzione SHA-512 è apparsa insieme a SHA-256 e nel 2002 è diventata uno standard federale di elaborazione delle informazioni ( FIPS il NIST ). Produce un hash a 512 bit .
L'algoritmo è molto simile a quello di SHA-256 ma con un'importante differenza nella dimensione dei dati elaborati: la dimensione del blocco è di 1024 bit (non 512 bit), e l'algoritmo opera su parole a 64 bit (la parola memoria dimensione di molti processori moderni). In particolare, le operazioni aritmetiche, particolarmente ottimizzate su questi processori, vengono eseguite su 64 bit.
La struttura dell'algoritmo è la stessa di SHA-256 ma
La funzione SHA-384 è apparsa insieme a SHA-256 e SHA-512. Produce un hash a 384 bit . L'algoritmo è quello di SHA-512 con solo differenze
SHA-256 è diventato il nuovo standard consigliato per l'hashing crittografico dopo gli attacchi a MD5 e SHA-1 . Gli altri membri della famiglia SHA sono stati relativamente non crittografati rispetto a SHA-0 e SHA-1 . Nel 2003 , Helena Handschuh e Henri Gilbert hanno pubblicato un'analisi di SHA-256, 384 e 512. Il loro studio mostra che altri membri di SHA non sono influenzati dagli attacchi che erano stati dimostrati su altre funzioni hash ( MD4 , MD5 e SHA-1 tra gli altri). La crittoanalisi lineare e differenziale non si applica.
D'altra parte, i due crittografi hanno evidenziato punti deboli significativi sulle versioni modificate. Modificando le costanti oi parametri di inizializzazione per renderli simmetrici sostituendo l'aggiunta modulare con uno XOR , otteniamo un hash che produce un'impronta digitale simmetrica se anche il messaggio di input è simmetrico.