Algorisme Hash segur
El terme SHA ( acrònim de l’ anglès Secure Hash Algorithm ) indica una família de cinc funcions de hash criptogràfiques diferents desenvolupades des de 1993 per la National Security Agency (NSA) i publicades per NIST com a estàndard federal pel govern dels Estats Units ( FIPS PUB 180-4 ).
Com qualsevol algorisme de hash , SHA produeix un resum de missatges de longitud fixa, o "petjada de missatge ", a partir d'un missatge de longitud variable. La seguretat d’un algorisme de hash rau en el fet que la funció no és invertible (és a dir, no és possible tornar al missatge original sabent només aquestes dades) i que mai no s’ha de poder crear intencionadament dos missatges diferents amb el mateix resum . Els algoritmes de la família s’anomenen SHA-1 , SHA-224 , SHA-256 , SHA-384 i SHA-512 : les darreres 4 variants se solen anomenar genèricament SHA-2 , per distingir-les de la primera. El primer produeix un resum del missatge de només 160 bits , mentre que els altres produeixen un resum de longitud en bits igual al nombre indicat a la seva abreviatura (SHA-256 produeix un resum de 256 bits). SHA-1 és l'algorisme més estès de la família SHA i s'utilitza en nombroses aplicacions i protocols tot i ser ara insegur i aviat serà substituït per altres més moderns i eficients.
La seguretat de SHA-1 ha estat compromesa per criptanalistes . [1] Tot i que encara no es coneixen els atacs a variants SHA-2, tenen un algorisme similar al de SHA-1, de manera que s'estan realitzant esforços per desenvolupar algoritmes de hash alternatius i millorats. [2] [3] Un concurs obert per a la implementació d'una nova funció SHA-3 va ser anunciat al Registre Federal el 2 de novembre de 2007 [4] per NIST i mitjançant una competència pública , similar a la adoptada per al procés de desenvolupament de l' AES , [5] va portar el 2 d'octubre de 2012 a anunciar l'algorisme Keccak com a guanyador. El treball d'un equip d'analistes italians i belgues, Keccak [6] , sembla, doncs, destinat a ser inclòs gradualment i adoptat en les més variades solucions de seguretat informàtica.
El 23 de febrer de 2017, un equip de Google va anunciar la primera tècnica pràctica per generar una col·lisió de hash . [7] [8]
SHA-0 i SHA-1
L'especificació d'algoritme original es va publicar el 1993 com a Secure Hash Standard , FIPS PUB 180, per NIST . Aquesta versió se sol anomenar SHA-0 per distingir-la de versions posteriors. Va ser retirada per la NSA poc després de la publicació i va ser suplantada per una versió revisada, publicada el 1995 (FIPS PUB 180-1) i coneguda normalment com SHA-1 . SHA-1 es diferencia de SHA-0 només per una rotació de bit únic en el procés de preparació de missatges de la seva funció de compressió unidireccional; això es va fer, segons la NSA, per corregir un defecte en l'algoritme original, que reduïa la seguretat criptogràfica de SHA-0. No obstant això, la NSA no va proporcionar cap altra explicació aclaridora. Posteriorment es van informar de les debilitats tant del codi SHA-0 com del SHA-1. SHA-1 sembla oferir una major resistència a l'atac, donant suport a l'afirmació de la NSA que el canvi augmentava la seguretat.
SHA-1 (així com SHA-0) produeix un resum de 160 bits a partir d’un missatge amb una longitud màxima de 2 64 -1 bits i es basa en principis similars als utilitzats per Ronald L. Rivest del MIT en el disseny del Algoritmes MD4 i MD5 .
Operació
Pas 1 (farciment): els bits de "farcit" s'afegeixen al missatge original de manera que la longitud final del missatge sigui congruent amb 448 mòdul 512, de manera que, si es fa la longitud de bits de "missatge + farcit" dividida per 512, es restarà 448.
Pas 2 (Afegir longitud): a la seqüència de bits (missatge + farciment) creada al pas 1 s’afegeix un nombre enter de 64 bits sense signar que conté la longitud del missatge original. Al final d’aquests dos primers passos obtenim una seqüència de bits que és múltiple de 512.
Pas 3 (inicialització del buffer MD): es crea un buffer de 160 bits dividit en 5 registres de 32 bits cadascun per emmagatzemar alguns passos intermedis. Els cinc registres s’indicaran convencionalment amb (A, B, C, D, E) i s’inicialitzaran amb els següents valors hexadecimals:
- A = 67452301
- B = EFCDAB89
- C = 98BADCFE
- D = 10325476
- E = C3D2E1F0
Pas 4 (Processament dels blocs de 512 bits): la seqüència de bits "missatge + farcit + longitud del missatge" es divideix en blocs de 512 bits, que identificarem amb B n amb n que oscil·la entre 0 i L. El nucli de l'algorisme SHA-1 s’anomena funció de compressió i es compon de 4 cicles de 20 passos cadascun. Els bucles tenen una estructura molt similar entre si, excepte pel fet que utilitzen una funció lògica primitiva diferent. Tots els 4 cicles prenen cada bloc com a paràmetre d’entrada juntament amb una constant K i els valors dels 5 registres. Al final del càlcul obtindrem nous valors per A, B, C, D, E que utilitzarem per al càlcul del següent bloc fins al bloc final F
El conjunt SHA-2
El 2001 , NIST va llançar quatre funcions de hash addicionals de la família SHA, cadascuna amb un resum més llarg que l'original, coneguda col·lectivament com SHA-2 (tot i que aquest terme mai es va estandarditzar oficialment). Aquestes variants es coneixen, com es va esmentar, amb la longitud en bits del resum generat seguint el codi hash oficial: SHA-224 , SHA-256 , SHA-384 i SHA-512 , amb hash de 224, 256 respectivament, 384 i 512 bits. Cal assenyalar que els darrers tres algorismes es van formalitzar com a estàndard el 2002 mentre que el SHA-224 es va introduir el febrer del 2004 : aquest últim té un hash de longitud idèntica a la de 2 claus Triple DES .
Totes aquestes variants estan patentades pel govern dels Estats Units, però es publiquen sota una llicència gratuïta. [9] .
Els algoritmes SHA-256 i SHA-512 funcionen, respectivament, amb paraules de 32 i 64 bits: utilitzen un nombre diferent de rotacions i constants addicionals, però la seva estructura és substancialment idèntica. Els algoritmes SHA-224 i SHA-384 són simplement versions truncades dels dos anteriors, amb hashs calculats amb diferents valors inicials.
Els algoritmes SHA-2 no han rebut, a diferència del SHA-1, molta atenció per part de la comunitat de criptanalistes, de manera que la seva seguretat criptogràfica no s’ha comprovat del tot. Gilbert i Handschuh ( 2003 ) van estudiar aquestes noves variants i no van trobar cap vulnerabilitat [10] .
SHA-3
La competició que va portar al llançament del nou estàndard SHA-3 es va llançar oficialment el 2 de novembre de 2007 [4] . El 2 d'octubre de 2012, NIST va anunciar l' algorisme Keccak SHA-3 com a guanyador.
Comparació de funcions SHA
La taula següent mostra les característiques principals dels algoritmes de la família SHA ( Estat intern significa la suma interna després de cada compressió d'un bloc de dades).
Algorisme e variant | Mida de sortida (bits) | Mida de l'estat intern (bit) | Mida del bloc (bit) | Mida màxima del missatge (bits) | Mida de la paraula (bit) | Passos | Operacions | S'han trobat col·lisions | |
---|---|---|---|---|---|---|---|---|---|
SHA-0 | 160 | 160 | 512 | 2 64 - 1 | 32 | 80 | +, i, o, xor, rotl | Sí | |
SHA-1 | 160 | 160 | 512 | 2 64 - 1 | 32 | 80 | +, i, o, xor, rotl | Atac 2 53 [11] | |
SHA-2 | SHA-256/224 | 256/224 | 256 | 512 | 2 64 - 1 | 32 | 64 | +, i, o, xor, shr, rotr | Cap |
SHA-512/384 | 512/384 | 512 | 1024 | 2 128 - 1 | 64 | 80 | +, i, o, xor, shr, rotr | Cap |
Aplicacions
SHA-1 és l'algorisme més utilitzat de la família SHA. Forma la base de moltes aplicacions i protocols, inclosos TLS i SSL , PGP , SSH , S / MIME i IPsec . SHA-1 també s'utilitza en sistemes de control de versions , com Git , per identificar la revisió de programari i com a suma de verificació per verificar la integritat de fitxers grans en catàlegs en línia.
Els algoritmes SHA també s’utilitzen en algorismes per a la signatura digital de documents, com ara HMAC , i s’han pres com a base per als xifrats de blocs SHACAL .
Exemples i pseudocodi
Mostra de hash
Aquest és un exemple d'un resum generat per SHA-1 (tots els missatges estan codificats en ASCII ):
SHA1 ("Cantami o diva del pelide Aquil·les la ira fatal") = 1f8a690b7366a2323e2d5b045120da7e93896f47
Fins i tot la més mínima variació del missatge genera inevitablement un hash completament diferent a causa d’una reacció en cadena coneguda com a efecte d’allau . Per exemple, substituint Cantami
per Contami
obtenim:
SHA1 ("C o ntami o diva del pelis Aquil·les la ira fatal") = e5f08d98bf18385e2f26b904cad23c734d530ffb
El resum corresponent a la cadena buida és:
SHA1 ("") = da39a3ee5e6b4b0d3255bfef95601890afd80709
Pseudocodi de SHA-1
Pseudocodi de l'algorisme SHA-1:
Notes: totes les variables són de 32 bits sense signar i s’ajusten el mòdul 2 32 quan es calcula
Inicialitzar variables:
h0 = 0x67452301
h1 = 0xEFCDAB89
h2 = 0x98BADCFE
h3 = 0x10325476
h4 = 0xC3D2E1F0
Pre-processament: afegiu el bit '1' al missatge afegiu k bits '0', on k és el nombre mínim ≥ 0 tal que el missatge resultant longitud (en bits ) és congruent amb 448 (mod 512) afegiu la longitud del missatge (abans del processament previ), en bits , com a enter de 64 bits d'endian
Processar el missatge en trossos posteriors de 512 bits:
trencar el missatge en trossos de 512 bits
per cada tros
divideix trossos en setze paraules de 32 bits de gran endi w [i], 0 <= i <= 15
Amplieu les setze paraules de 32 bits en vuitanta paraules de 32 bits:
per a i de 16 a 79
w [i] = (w [i-3] xor w [i-8] xor w [i-14] xor w [i-16]) esquerra 1
Inicialitzeu el valor de resum per a aquest fragment:
a = h0
b = h1
c = h2
d = h3
e = h4
Bucle principal:
per a i de 0 a 79
si 0 ≤ i ≤ 19 aleshores
f = (b i c) o (( no b) i d)
k = 0x5A827999
en cas contrari, si 20 ≤ i ≤ 39
f = b xor c xor d
k = 0x6ED9EBA1
en cas contrari, si 40 ≤ i ≤ 59
f = (b i c) o (b i d) o (c i d)
k = 0x8F1BBCDC
en cas contrari, si 60 ≤ i ≤ 79
f = b xor c xor d
k = 0xCA62C1D6
temp = (a esquerra 5) + f + e + k + w [i] e = d d = c c = b esquerra 30 b = a a = temp
Afegiu el hash d'aquest fragment per obtenir resultats fins ara:
h0 = h0 + a
h1 = h1 + b
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e
Produeix el valor hash final (big-endian):
digereix = hash = h0 afegir h1 afegir h2 afegir h3 afegir h4
Les fórmules següents es poden utilitzar per calcular f
al cicle principal publicat anteriorment en lloc de les originals publicades al document oficial FIPS PUB 180-1:
(0 ≤ i ≤ 19): f = d xor (b i (c xor d)) (alternativa 1) (0 ≤ i ≤ 19): f = (b i c) xor (( no b) i d) (alternativa 2) (0 ≤ i ≤ 19): f = (b i c) + (( no b) i d) (alternativa 3) (40 ≤ i ≤ 59): f = (b i c) o (d i (b o c)) (alternativa 1) (40 ≤ i ≤ 59): f = (b i c) o (d i (b xor c)) (alternativa 2) (40 ≤ i ≤ 59): f = (b i c) + (d i (b xor c)) (alternatives 3) (40 ≤ i ≤ 59): f = (b i c) xor (b i d) xor (c i d) (alternativa 4)
Pseudocodi de SHA-256 (una variant de SHA-2)
Pseudocodi de l'algorisme SHA-256. Fixeu-vos en l’augment de barreja de bits de paraules w[16..63]
en comparació amb SHA-1.
Notes: totes les variables són de 32 bits sense signar i s’ajusten el mòdul 2 32 quan es calcula
Inicialitzar variables (primers 32 bits de les parts fraccionàries de les arrels quadrades dels primers 8 primers 2..19): h0: = 0x6a09e667 h1: = 0xbb67ae85 h2: = 0x3c6ef372 h3: = 0xa54ff53a h4: = 0x510e527f h5: = 0x9b05688c h6: = 0x1f83d9ab h7: = 0x5be0cd19
Inicialitza la taula de constants rodones (primers 32 bits de les parts fraccionàries de les arrels cubes dels primers 64 primers 2..311): k [0..63]: = 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
Pre-processament: afegiu el bit '1' al missatge afegiu k bits '0', on k és el nombre mínim> = 0 tal que el missatge resultant longitud (en bits ) és congruent amb 448 (mod 512) afegiu la longitud del missatge (abans del processament previ), en bits , com a enter de 64 bits d'endian
Processar el missatge en trossos posteriors de 512 bits:
trencar el missatge en trossos de 512 bits
per cada tros
divideix trossos en setze paraules de 32 bits de gran endi w [0..15]
Amplieu les setze paraules de 32 bits en seixanta-quatre paraules de 32 bits:
per a i de 16 a 63
s0: = (w [i-15] trencant a la dreta 7) xor (w [i-15] trotant a la dreta 18) xor (w [i-15] righthift 3)
s1: = (w [i-2] gir a la dreta 17) xor (w [i-2] gir a la dreta 19) xor (w [i-2] righthift 10)
w [i]: = w [i-16] + s0 + w [i-7] + s1
Inicialitzeu el valor de resum per a aquest fragment:
a: = h0
b: = h1
c: = h2
d: = h3
e: = h4
f: = h5
g: = h6
h: = h7
Bucle principal:
per a i de 0 a 63
s0: = (a la dreta 2) xor (a la dreta 13) xor (a la dreta 22)
maj: = (a i b) xor (a i c) xor (b i c)
t2: = s0 + maj
s1: = (e rtrtrate 6) xor (e rtrtrate 11) xor (e rtrtrate 25)
ch: = (e i f) xor (( no e) i g)
t1: = h + s1 + ch + k [i] + w [i]
h: = g g: = f f: = e e: = d + t1 d: = c c: = b b: = a a: = t1 + t2
Afegiu el hash d'aquest fragment per obtenir resultats fins ara:
h0: = h0 + a
h1: = h1 + b
h2: = h2 + c
h3: = h3 + d
h4: = h4 + e
h5: = h5 + f
h6: = h6 + g
h7: = h7 + h
Produeix el valor hash final (big-endian):
resum = hash = h0 afegir h1 afegir h2 afegir h3 afegir h4 afegir h5 afegir h6 afegir h7
Les funcions ch
i maj
es poden optimitzar tal com es descriu per a les del SHA-1.
El SHA-224 és idèntic al SHA-256 excepte:
- els valors inicials de les variables
h0
-h7
són diferents i - la sortida es construeix ometent
h7
.
El SHA-512 té una construcció idèntica, però:
- tots els números tenen una longitud de 64 bits,
- Es realitzen 80 passos en lloc de 64,
- els valors inicials i les constants a afegir s’amplien a 64 bits i
- les quantitats de rotacions ( girades ) i de desplaçaments ( desplaçaments ) són diferents.
El SHA-384 és idèntic al SHA-512 excepte:
- els valors inicials
h0
-h7
són diferents i - la sortida es construeix ometent
h6
ih7
.
Nota
- ↑ Criptoanàlisi de SHA-1 (Schneier)
- ↑ Schneier sobre seguretat: NIST Hash Workshop Liveblogging (5)
- ^ The H: Notícies de seguretat i desenvolupaments de codi obert
- ^ a b Document
- ^ Bounce to index.html Arxivat el 5 de febrer de 2008 a Internet Archive .
- ^ La família de funcions esponja Keccak
- ^ (EN) Anunciant la primera col·lisió SHA1 a security.googleblog.com, el 23 de febrer de 2017. Consultat el 17 de març de 2017.
- ^ (EN) Shattered , a shattered.it. Consultat el 17 de març de 2017 .
"Hem trencat SHA-1 a la pràctica". . - ^ Declaració de llicència per a la patent nord-americana 6829355 .. Consultat el 17 de febrer de 2008 .
- ↑ Henri Gilbert, Helena Handschuh, Anàlisi de seguretat de SHA-256 i germanes , a Lecture notes in computer science , Springer, Berlín, ISSN 0302-9743 . Consultat el 30 de gener de 2008 (arxivat de l' original el 18 d'octubre de 2011) .
- ^ Weblog for dkg - HOWTO prep for migration for SHA-1 in OpenPGP
Bibliografia
- Florent Chabaud, Antoine Joux: col·lisions diferencials a SHA-0. CRYPTO 1998 pp56-71
- Eli Biham , Rafi Chen, Near-Collisions of SHA-0, Cryptology ePrint Archive, Informe 2004/146, 2004 (aparegut a CRYPTO 2004) [1]
- Joux, Carribault, Lemuet, Jalby: col·lisió per l'algorisme SHA-0 complet, CRYPTO 2004 [2]
- Xiaoyun Wang , Hongbo Yu i Yiqun Lisa Yin, atacs de cerca de col·lisions eficients a SHA-0, CRYPTO 2005 [3]
- Xiaoyun Wang , Yiqun Lisa Yin i Hongbo Yu, trobant col·lisions al SHA-1 complet, CRYPTO 2005 [4]
- Henri Gilbert , Helena Handschuh : Anàlisi de seguretat de SHA-256 i Sisters. Àrees seleccionades en criptografia 2003: pp175–193
- Proposta de revisió de l’estàndard federal de processament d’informació (FIPS) 180, Norma Hash segura [ enllaç trencat ] , a Federal Register , vol. 59, núm. 131, 11 de juliol de 1994, pp. 35317-35318. Recuperat el 26-04-2007 .
Articles relacionats
Enllaços externs
Llocs d'Internet per al càlcul de hash
- Hash'em tots! - Hashing en línia de text i fitxers amb diversos algoritmes
- Web4Human :hash en línia amb algoritmes SHA1, SHA224, SHA256 i SHA512
- https://web.archive.org/web/20071216092901/http://www.johnmaguire.us/tools/hashcalc/index.php : permet la codificació de cadenes de longitud zero
- Cerca SHA-1 : base de dades amb diversos hash SHA-1 de diversos milions. Implementat com a cerca inversa en línia.
- Calculadora de hash simple , a hash.spugesoft.com . Consultat el 5 de maig de 2019. Arxivat de l' original el 28 de juny de 2012 .
- SHA-1 Línia de fitxer de text per línia : permet sha1-hash totes les línies d'un fitxer de text.
Estàndard: SHA-0, SHA-1, SHA-2, SHA-3 ...
- Especificacions per a un estàndard Secure Hash (SHS) : esborrany de l'estàndard SHS proposat (SHA-0)
- Secure Hash Standard (SHS) : estàndard SHS proposat (SHA-0)
- RFC 3174 , "EUA Secure Hash Algorithm 1 (SHA-1)"
- RFC 4634 , "Algoritmes Hash segurs dels EUA (SHA i HMAC-SHA)"
- CSRC Cryptographic Toolkit : lloc oficial NIST per al Secure Hash Standard
- FIPS 180-2: Secure Hash Standard (SHS) ( PDF , 236 kB): versió actual del Secure Hash Standard (SHA-1, SHA-224, SHA-256, SHA-384 i SHA-512), 1 d'agost 2002, modificat el 25 de febrer de 2004
- NIST secure hash Pàgina sobre algorismes de hash NIST
- Competició NIST Cryptographic Hash Project SHA-3
Criptoanàlisi
- Entrevista amb Yiqun Lisa Yin sobre l'atac SHA-1 , a news.zdnet.com . Consultat el 30 de gener de 2008 (arxivat de l' original el 16 de desembre de 2007) .
- Resum d’impacte de Lenstra dels resultats criptanalítics de febrer de 2005 ( PDF ), a cm.bell-labs.com . Consultat el 30 de gener de 2008 (arxivat de l' original el 28 de febrer de 2008) .
- Explicació dels atacs reeixits contra SHA-1 (3 pàgines, 2006)
Implementacions
- El projecte OpenSSL : la extensa biblioteca OpenSSL inclou programari lliure i de codi obert amb implementació de SHA-1, SHA-224, SHA-256, SHA-384 i SHA-512
- Crypto ++ Crypto ++, biblioteca C ++ gratuïta amb esquemes criptogràfics
- Bouncy Castle La biblioteca Bouncy Castle és una biblioteca gratuïta Java i C # que conté implementacions de SHA-1, SHA-224, SHA-256, SHA-384 i SHA-512, i altres algoritmes de hash.
Tutorial i exemples de codis
- Comparació de la funció SHA en diferents idiomes
- Implementacions C i C ++ de SHA-1, inclosos els binaris Win32 i Linux de Paul E. Jones (coautor de RFC)
- Implementació de SHA de Brian Gladman
- Implementació de Visual Basic de SHA-1 de John Taylor
- Implementació JavaScript de Chris Veness de SHA-1
- Implementació de JavaScript de les funcions HASH (md4, md5, sha-1, sha-2) , a cryptojs.altervista.org .
Prova de vectors
Els vectors de prova del projecte NESSIE per SHA-1 , SHA-256 , SHA-384 i SHA-512 .