SHA-1

(Redirigé depuis SHA1)

SHA-1 (Secure Hash Algorithm, prononcé /ʃa.œ̃/[1]) est une fonction de hachage cryptographique conçue par la National Security Agency des États-Unis (NSA), et publiée par le gouvernement des États-Unis comme un standard fédéral de traitement de l'information (Federal Information Processing Standard du National Institute of Standards and Technology (NIST)). Elle produit un résultat (appelé « hash » ou condensat) de 160 bits (20 octets), habituellement représenté par un nombre hexadécimal de 40 caractères.

Un tour de la fonction de compression de SHA-1 :
A, B, C, D, E sont des mots de 32 bits ;
<<<n désigne une rotation des bits par décalage de n bits vers la gauche ;
F est une fonction (non linéaire sur le corps F2 des booléens) qui dépend du numéro de tour t ;
⊞ est l'addition modulo 232 (l'addition des entiers machines non signés de 32 bits), qui est non linéaire sur F2 ;
Kt est une constante (32 bits) qui dépend du numéro de tour t ;
Wt est un mot de 32 bits qui dépend du numéro de tour t ; il est obtenu par une procédure d'expansion à partir du bloc de donnée (512 bits) dont le traitement est en cours.

SHA-1 n'est plus considéré comme sûr contre des adversaires disposant de moyens importants. En 2005, des cryptanalystes ont découvert des attaques sur SHA-1, suggérant que l'algorithme n'était pas suffisamment sûr pour continuer à l'utiliser[2]. Depuis 2010, de nombreuses organisations ont recommandé son remplacement par SHA-2 ou SHA-3[3],[4],[5]. Microsoft[6], Google[7] et Mozilla[8],[9],[10] ont annoncé que leurs navigateurs respectifs cesseraient d'accepter les certificats SHA-1 au plus tard en 2017.

Origine

modifier

La fonction de hachage SHA-1 succède à SHA-0 qui a été rapidement mise de côté par le NIST pour des raisons de sécurité insuffisante. SHA-0 était légitimement soupçonné de contenir des failles qui permettraient d'aboutir rapidement à des collisions (deux documents différents qui génèrent le même condensat). Face à la controverse soulevée par le fonctionnement de SHA-0 et certains constats que l'on attribue à la NSA, SHA-0 a été modifiée peu après sa sortie (1993) pour devenir SHA-1 (1995). Une collision complète sur SHA-0 a été effectivement découverte par Antoine Joux et al. en .

Abandon de SHA-1

modifier

En 2005, la cryptanalyste Xiaoyun Wang et ses co-auteurs Yiqun Lisa Yin et Hongbo Yu annoncent une attaque théorique pour la recherche de collisions pour SHA-1 qui est nettement plus efficace que l'attaque des anniversaires (l'attaque générique de référence)[11]. L'attaque complète sera publiée à Crypto 2015[12]. Le NIST pour sa part recommande de passer à SHA-2 ou SHA-3 quand c'est possible. Depuis 2013, Microsoft a déclaré l’obsolescence de SHA-1[13] et en 2014. L'ANSSI déconseille son utilisation dans la seconde version de son Référentiel Général de Sécurité (RGS)[14] d'application au . Enfin, Google annonce que ses versions de Chrome n'accepteront plus, de façon graduelle, SHA-1 jusqu'à refuser les certificats l'utilisant qui expirent après le [15].

En Google et le Centrum voor Wiskunde en Informatica annoncent une attaque effective et la première collision pour SHA-1[16].

Exemples

modifier

Voici la signature obtenue sur une phrase (codée en utf8) : SHA1("Wikipédia, l'encyclopédie libre et gratuite") = 6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.

En modifiant un caractère, la signature change radicalement : SHA1("Wikipédia, l'encyclopédie libre et gratuitE") = 11F453355B28E1158D4E516A2D3EDF96B3450406.

Le SHA-1 est un excellent générateur de nombres pseudo-aléatoires (comme beaucoup de fonctions de hachage) et il passe avec succès tous les tests statistiques.

Caractéristiques

modifier

En résumé les caractéristiques de SHA-1 sont les suivantes :

  • taille du message : 264 bits maximum
  • taille des blocs : 512 bits (le message en entrée est découpé en blocs de 512 bits)
  • taille des mots : 32 bits (SHA-1 est construite à partir d'opérations sur des mots de 32 bits)
  • taille du condensé : 160 bits
  • niveau de sécurité : collision en 263 opérations.

L’attaque des anniversaires, qui est l'attaque générique sur les fonctions de hachage cryptographique pour trouver une collision, permet de trouver (théoriquement) celle-ci en 280 opérations, ce qui est donc la sécurité attendue pour une telle fonction de hachage. Mais dans le cas de SHA-1, il existe une attaque (théorique) en 269 opérations connue depuis 2005[17]. C'est attaque a été améliorée en une attaque en 263 opérations, et une collision a effectivement été découverte en 2017.

Attaques

modifier

Une attaque brute basée sur le paradoxe des anniversaires permet de trouver une collision complète sur une clé SHA-1 complète (sur 160 bits) avec un nombre d'opérations de l'ordre de .

En 2005, Rijmen et Oswald ont publié une attaque sur une version simplifiée du SHA-1 (53 tours), leur attaque permet de trouver une collision avec moins de opérations.

En , Bruce Schneier a fait état d'une attaque sur la version complète du SHA-1 par l'équipe chinoise de Wang, Yin et Yu. Leur méthode permet de trouver :

  • une collision dans le SHA-1 complet de 128 bits avec opérations au lieu de par l’attaque des anniversaires
  • une collision dans le SHA-0 complet avec seulement opérations
  • une collision dans une version simplifiée du SHA-1 (58 tours) avec opérations

La description de l'attaque a été publiée en .

Le , une amélioration de l'attaque a été annoncée par Wang et al. à la conférence CRYPTO 2005, la complexité passe ainsi de 269 à 263, soit une division par 64 de la complexité originale.

Lors de l'Eurocrypt 2009 (avril), une amélioration[18] de l'attaque aurait permis de réduire à nouveau sa complexité jusqu'à atteindre . Toutefois, ces résultats furent démentis et l'article[19] fut retiré[20] à la suite de la découverte d'une erreur dans l'évaluation de cette complexité.

Une équipe composée de chercheurs de chez Google et du CWI (Centrum Wiskunde et Informatica) ont annoncé le qu'ils avaient réussi à obtenir une collision entre deux documents[21],[22].

Une équipe composée de chercheurs universitaires (Gaëtan Leurent de l'Inria en France et son collègue Thomas Peyrin de l'Université de Nanyang à Singapour) a annoncé en début avoir mis au point une attaque sur la version complète de SHA-1 (80 tours) permettant d'obtenir pour n'importe quelle valeur de hachage une collision sur des préfixes choisis en un nombre d'opérations situé entre et [23], ce qui réduit le coût d'obtention de collisions à moins de 150 000 $, à la portée d'une organisation de moyenne taille (ou de bandes organisées) et plus seulement de grandes organisations ou de gouvernements, basée sur une analyse différentielle multi-bloc (et non un bloc unique avec les tentatives précédentes), ce qui permet d'en améliorer l'efficacité en réduisant l'espace de recherche de façon incrémentielle. En , ces mêmes chercheurs ont annoncé avoir amélioré leur attaque et pouvoir obtenir une collision en opérations, pour un coût de 45k$[24]. Les investigations continuent pour déterminer le coût minimum de ce type d'attaque qui pourrait en pratique s'avérer même inférieur (des attaques similaires sont démontrées également sur d'autres algorithmes de hachage similaires, y compris MD5 qui était déjà connu pour être cassé mais qui le devient encore plus facilement). Toutefois l'attaque annoncée ne concerne pas encore les empreintes de messages (ou signatures) HMAC basées sur SHA-1[25],[23].

Description

modifier

La fonction de hachage SHA-1 est une fonction de hachage itérative, c'est-à-dire qu'elle itère sur le message en entrée découpé en blocs successifs de même taille une fonction, dite fonction de compression[26] pour produire un condensé, ou haché, ou empreinte de taille fixe. Plus précisément elle repose sur la construction de Merkle-Damgård, c'est-à-dire que l'entrée est complétée par un procédé dur de bourrage pour que sa longueur soit un multiple de la taille du bloc, le dernier bloc contenant une représentation binaire de la taille de l'entrée initiale[26],[27], ce qui permet de réduire la résistance aux collisions de la fonction de hachage à celle de la fonction de compression[27]. Son fonctionnement est similaire à celui des fonctions MD4 et MD5 de Ronald Rivest[28].

Dans le cas de SHA-1 on a :

  • taille de bloc : 512 bits ;
  • taille du haché : 160 bits ;
  • fonction de compression :{0,1}160+512 → {0,1}160 ;
  • taille maximale de l'entrée : 264 bits.

Cette dernière limitation (théorique) vient du fait que la longueur de l'entrée, ajoutée dans le dernier bloc, est stockée sur 64 bits.

La fonction de compression est construite à partir d'opérations sur des mots de 32 bits, qui représentent des entiers non-signés inférieurs à 232. Ces opérations sont :

  • les opérations bit à bit usuelles :
  • l'addition entière modulo 232, c'est-à-dire l'addition informatique usuelle sur des entiers non-signés de 32 bits ;
  • un décalage circulaire de s bits vers la gauche (0 ≤ s < 32)[26].

Ces opérations s'implémentent de façon extrêmement efficace, mais combinées de façon adéquate, elles permettent d'obtenir une sortie qui parait avoir les qualités recherchées pour une fonction de hachage[26] (en particulier résistance à la collision, résistance à la préimage).

Détails

modifier

Les spécifications de SHA-1 sont décrites pour la première fois en dans le document officiel du NIST FIPS 180-1 pour un standard de fonction de hachage cryptographique[29], puis reprises dans les versions successives de ce document jusqu'à la version de 2015 du FIPS-180-4[30]. Elles ne seront pas reprises dans la version suivante[31]. Elles sont largement accessibles sur Internet[26],[32].

Bourrage

modifier

Le bourrage consiste à compléter le message initial M de longueur en bits l< 264, pour obtenir un message M' dont la longueur est un multiple de 512 bits (la taille de bloc). L'injectivité du procédé est une condition nécessaire : on aurait une collision évidente si M ≠ N mais que, après bourrage M' = N'[33].

Le message complété M' est obtenu en concaténant à la fin du message M un bit à 1 suivi d'une suite de bits à 0 dont la longueur dépend de l, suivie de la représentation binaire de l, codée sur 64 bits, c'est-à-dre que les 64 derniers bits de M' sont réservés à cet usage. La longueur de la suite de bits à 0 est la plus petite pour laquelle la longueur du message complété M' est un multiple de 512.

Fonction de hachage itérative

modifier

Le message complété M' est découpé en n blocs de 512 bits consécutifs, soient M(1) , … , M(n). La concaténation est notée ||, on a :

M' = M(1) || … || M(n).

L'algorithme itère une fonction de compression, soit compress : {0,1}160 × {0,1}512 → {0,1}160, et utilise un vecteur d'initialisation IV de 160 bits. Il produit une suite Hi de valeurs de chaînage[34] de 160 bits, la dernière valeur étant le haché[34].

H(0) := IV
H(i+1) := compress(H(i), M(i+1)), pour 0≤ i < n
SHA-1(M) = H(n)[35].

Le vecteur d'initialisation de 160 bits IV est composé de 5 mots de 32 bits dont les valeurs sont données en hexadécimal (un chiffre hexadécimal représente 4 bits) dans les spécifications[36],[37].

Fonction de compression

modifier

Dans ce qui suit les opérations sur les mots de 32 bits utilisées sont notées :

  • ∧ pour le ET bit à bit ;
  • ∨ pour le OU bit à bit ;
  • ⊕ pour le OU exclusif bit à bit ;
  • ¬ pour le NON bit à bit ;
  • + pour l'opération sur les mots correspondant à l'addition arithmétique modulo 232 (l'addition informatique de deux entiers non signés de 32 bits) ;
  • x <<< s pour le décalage circulaire de s bits vers la gauche des bits de x, où x est un mot de 32 bits et 0 ≤ s < 32).

En notant << et >> les décalages ordinaires vers la gauche et vers la droite :

  • << : décalage binaire à gauche, x << s s'obtient en supprimant les s bits de gauche de x et ajoutant s bits à zéro à droite ;
  • >> : décalage binaire à droite, x >> s s'obtient en supprimant les s bits de droite de x et ajoutant s bits à zéro à gauche ;

alors x <<< s = (x << s) ∨ (x >> (32-s)).

La fonction de compression[38] prend en entrée une valeur de chaînage H, analysée en 5 mots de 32 bits, et un bloc de 512 bits B analysé en 16 mots de 32 bits. La première phase est une phase d'expansion : le bloc B est étendu en un tableau W de 80 mots de 32 bits par la précédure suivante :

fonction expand(B){   Le bloc B de 512 bits et vu comme un tableau de 16 mots de 32 bits B[0] … B[15]
  W est un tableau de 80 mots de 32 bits      W[0] … W[79] 
  pour i de 0 à 79 {
    si i < 16
      alors W[i]:= B[i]
      sinon W[i] :=  (W[i – 3] ⊕ W[i – 8] ⊕ W[i – 14] ⊕ W[i – 16]) <<< 1 Ce décalage circulaire vers la
                                                                             gauche de 1 bit est la seule
                                                                             différence avec SHA-0 sur
                                                                             l'ensemble de l'algorithme 
   }
   renvoyer(W)
 } 
fonction compress(H,B) {
  (a0,b0,c,d0,e0) := H             H est analysé comme 5 mots de 32 bits
  (a,b,c,d,e) = (a0,b0,c0,d0,e0) 
  W := expand(B)
  pour t de 0 à 79 {
    temp := (a <<< 5) + f(t, b, c, d) + e + K[t] + W[t] 
    (a, b, c, d, e) := (temp, a, b <<< 30, c, d)
    }
  H := (a+a0, b+b0, c+c0, d+d0, e+e0)
    renvoyer(H)
 }

La fonction f en jeu à chacun des 80 tours est calculée par opérations bit à bit sur ses 3 derniers arguments et prend 3 formes différentes, en fonction du numéro de tour (premier argument)[39],[40] :

  0 ≤ t < 20 : f(t, b, c, d)  = (b ∧ c) ⊕ (¬b ∧ d)  (= (b ∧ c) ∨ (¬b ∧ d) )
 20 ≤ t < 40 : f(t, b, c, d)  = b ⊕ c ⊕ d
 40 ≤ t < 60 : f(t, b, c, d)  = (b ∧ c) ⊕ (b ∧ d) ⊕ (c ∧ d) (= (b ∧ c) ∨ (b ∧ d) ∨ (c ∧ d ))
 60 ≤ t < 80 : f(t, b, c, d)  = b ⊕ c ⊕ d

Les constantes de 32 bits K[t] prennent 4 valeurs différentes suivant le numéro de tour t, elles sont définies dans les spécifications[41],[42].

Le SHA-1 en mode chiffrement

modifier

Les primitives des fonctions de hachage cryptographiques sont assez proches de celles des chiffrements symétriques. SHA-1, a été adaptée par Helena Handschuh et David Naccache pour obtenir un chiffrement par bloc appelé SHACAL.

Notes et références

modifier

E.A.Grechnikov,Collisions for 72-step and 73-step SHA-1: Improvements in the Method of Characteristics, (http://eprint.iacr.org/2010/413)

  1. ↑ [vidéo] « Qu'est-ce qu'un certificat de signature de code ? », à 54 s, GoDaddy Canada
  2. ↑ (en) Schneier, Bruce, « Schneier on Security : Cryptanalysis of SHA-1 », sur Schneier on Security, .
  3. ↑ (en) « NIST.gov - Computer Security Division - Computer Security Resource Center »
  4. ↑ (en) Marc Stevens1, Pierre Karpman et Thomas Peyrin, « The SHAppening: freestart collisions for SHA-1 » (consulté le )
  5. ↑ (en) Bruce Schneier, « SHA-1 Freestart Collision », Schneier on Security, sur Schneier on Security, .
  6. ↑ (en) « Windows Enforcement of Authenticode Code Signing and Timestamping » [archive du ], sur microsoft.com via Internet Archive, Microsoft, (consulté le ).
  7. ↑ (en) « Intent to Deprecate: SHA-1 certificates », Google, (consulté le )
  8. ↑ (en) « Bug 942515 - stop accepting SHA-1-based SSL certificates with notBefore >= 2014-03-01 and notAfter >= 2017-01-01, or any SHA-1-based SSL certificates after 2017-01-01 », sur mozilla.org (consulté le ).
  9. ↑ (en) « CA : Problematic Practices - MozillaWiki », sur mozilla.org (consulté le ).
  10. ↑ (en) « Phasing Out Certificates with SHA-1 based Signature Algorithms », sur Mozilla Security Blog, (consulté le ).
  11. ↑ (en) « Cryptanalysis of SHA-1 - Schneier on Security », sur www.schneier.com, (consulté le ).
  12. ↑ « Finding Collisions in the Full SHA-1 », sur www.iacr.org (consulté le )
  13. ↑ « SHA1 Deprecation Policy - Windows PKI blog - Site Home - TechNet Blogs », sur blogs.technet.com (consulté le )
  14. ↑ ANSSI, « Liste des documents constitutifs du RGS v.2.0 », ANSSI,‎ (lire en ligne, consulté le )
  15. ↑ « Google Groupes », sur groups.google.com (consulté le )
  16. ↑ (en) « Announcing the first SHA1 collision », sur Google Online Security Blog (consulté le ).
  17. ↑ (en) « Security Considerations for the SHA-0 and SHA-1 Message-Digest Algorithms », Request for comments no 6194
  18. ↑ http://eurocrypt2009rump.cr.yp.to/837a0a8086fa6ca714249409ddfae43d.pdf
  19. ↑ http://www.ictlex.net/wp-content/iacrhash.pdf
  20. ↑ (en) « Cryptology ePrint Archive : Report 2009/259 - Differential Path for SHA-1 with complexity $O(2^{52})$ », sur iacr.org (consulté le ).
  21. ↑ Julien Cadot, « SHAttered : Google a cassé la méthode de chiffrement SHA-1 », sur numerama, (consulté le )
  22. ↑ (en) Elena Marchetti, « The SHAttered SHA-1 Collision, Explained », (consulté le ).
  23. 1 2 (en) Gaëtan Leurent et Thomas Peyrin, « From Collisions to Chosen-Prefix Collisions - Application to Full SHA-1. » [PDF], sur IACR.org, (consulté le ), pour EUROCRYPT 2019, paru dans Advances in Cryptology, pp. 5247-555 (DOI 10.1007/978-3-030-17659-4_18).
  24. ↑ (en) G. Leurent, « SHA-1 is a Shambles - First Chosen-Prefix Collision on SHA-1 and Application to the PGP Web of Trust », Usenix,‎ (lire en ligne)
  25. ↑ (en) Catalin Cimpanu, « SHA-1 collision attacks are now actually practical and a looming danger », sur ZDNet, (consulté le ).
  26. 1 2 3 4 5 Stinson et Paterson 2019, p. 156-157.
  27. 1 2 Stinson et Paterson 2019, p. 151.
  28. ↑ FIPS PUB 180-1, p. 1.
  29. ↑ FIPS 180-1.
  30. ↑ FIPS 180-4.
  31. ↑ (en) « Decision to Revise FIPS 180-4, Secure Hash Standard (SHS) », (consulté le ).
  32. ↑ Stinson et Paterson utilisent cet argument pour ne pas détailler l'algorithme. Outre les FIPS PUB 180-1 à 180-4 du NIST, les spécifications sont données dans la RFC 3174, qui les accompagne d'un programme C.
  33. ↑ Stinson et Paterson 2019, p. 150.
  34. 1 2 Aumasson 2018, p. 112.
  35. ↑ Stinson et Paterson 2019, p. 149 particularisé au cas de SHA-1.
  36. ↑ FIPS-PUB 180-4, p. 14.
  37. ↑ ,RFC 3174, p. 6.
  38. ↑ La présentation qui suit est inspirée de Aumasson 2018.
  39. ↑ FIPS PUB 180-4, p. 10.
  40. ↑ La RFC 3174, p. 5 donne les deux formes entre parenthèses, qui utilisent le ∨.
  41. ↑ FIPS-PUB 180-4, p. 11.
  42. ↑ RFC 3174, p. 5.

Bibliographie

modifier

Voir aussi

modifier

Articles connexes

modifier

Liens externes

modifier

Sources

modifier