# SHA-1

SHA-1 (Secure Hash Algorithm, prononcé /ʃa.œ̃/) 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.
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 pourrait ne plus être suffisamment sûr pour continuer à l'utiliser dans le futur. Depuis 2010, de nombreuses organisations ont recommandé son remplacement par SHA-2 ou SHA-3$^,$$^,$. Microsoft, Google et Mozilla$^,$$^,$ ont annoncé que leurs navigateurs respectifs cesseraient d'accepter les certificats SHA-1 au plus tard en 2017.

## Origine : SHA-0 et SHA-1

Le SHA-1 est le successeur du SHA-0 qui a été rapidement mis de côté par le NIST pour des raisons de sécurité insuffisante. Le 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 du SHA-0 et certains constats que l'on attribue à la NSA, le SHA-0 s'est vu modifié peu après sa sortie (1993) et complexifié pour devenir le SHA-1 (1995). Une collision complète sur le SHA-0 a été découverte par Antoine Joux et al. en août 2004. 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 plus efficace que l'attaque des anniversaires (l'attaque générique de référence). L'attaque complète sera publiée à Crypto 2015. Le NIST pour sa part recommande de passer sur un algorithme SHA-2 ou SHA-3 quand c'est possible. Depuis 2013, Microsoft a déclaré l’obsolescence du SHA-1 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) d'application au 1er juillet 2014. Enfin, Google annonce que ses versions de Chrome n'accepteront plus, de façon graduelle, le SHA-1 jusqu'à le refuser pour les certificats expirant après le 1er janvier 2017.
En février 2017 Google et le Centrum voor Wiskunde en Informatica annoncent une attaque effective et la première collision sur SHA-1.

## Exemples

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.

## Fonctionnement du SHA-1

Le SHA-1 prend un message d'un maximum de 2$^{64}$ bits en entrée. Son fonctionnement est similaire à celui du MD4 ou MD5 de Ronald Rivest. Quatre fonctions booléennes sont définies, elles prennent 3 mots de 32 bits en entrée et calculent un mot de 32 bits. Une fonction spécifique de rotation est également disponible, elle permet de déplacer les bits vers la gauche (le mouvement est circulaire et les bits reviennent à droite). Une de ces rotations n'était pas présente dans le SHA-0, elle permet de casser certaines caractéristiques linéaires dans la structure. Cela permet d'éviter une attaque sur les bits neutres décrite par Eli Biham, technique reprise pour calculer la collision complète sur SHA-0 (Antoine Joux et al.).
Le SHA-1 commence par ajouter à la fin du message un bit à 1 suivi d'une série de bits à 0, puis la longueur du message initial (en bits) codée sur 64 bits. La série de 0 a une longueur telle que la séquence ainsi prolongée a une longueur multiple de 512 bits. L'algorithme travaille ensuite successivement sur des blocs de 512 bits.
Pour chaque bloc l'algorithme calcule 80 tours (ou rondes, « rounds » en anglais) successifs et applique une série de transformations sur l'entrée. La première étape consiste à calculer 80 valeurs sur 32 bits. Les 16 premières valeurs sont obtenues directement à partir du bloc « message » en entrée. Les 64 autres sont calculées successivement. Le SHA-1 les obtient grâce à une rotation (absente dans SHA-0) qui est appliquée sur le résultat d'un XOR, il utilise pour cela 4 mots obtenus dans les itérations précédentes. On définit ensuite cinq variables qui sont initialisées avec des constantes (spécifiées par le standard), le SHA-1 utilise encore 4 autres constantes dans ses calculs. Si un bloc de 512 bits a déjà été calculé auparavant, les variables sont initialisées avec les valeurs obtenues à la fin du calcul sur le bloc précédent.
Il s'ensuit 80 tours qui alternent des rotations, des additions entre les variables et les constantes. Selon le numéro du tour, le SHA-1 utilise une des quatre fonctions booléennes. L'une de ces fonctions est appliquée sur 3 des 5 variables disponibles. Les variables sont mises à jour pour le tour suivant grâce à des permutations et une rotation. En résumé, le SHA-1 change sa méthode de calcul tous les 20 tours et utilise les sorties des tours précédents.
À la fin des 80 tours, on additionne le résultat avec le vecteur initial. Lorsque tous les blocs ont été traités, les cinq variables concaténées (5 × 32 = 160 bits) représentent la signature.

## Caractéristiques

Les caractéristiques de SHA-1 sont les suivantes :
* taille du message : 2$^{64}$ bits maximum
* taille des blocs : 512 bits
* taille des mots : 32 bits
* taille du condensé : 160 bits
* niveau de sécurité : collision en 2$^{63}$ opérations.
L’attaque générique des anniversaires permet de trouver une collision en 2$^{80}$ 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 2$^{69}$ connue depuis 2005, qui a été améliorée en une attaque en 2$^{63}$ opérations. Ces attaques, bien que théoriques, ouvrent la possibilité que de réelles collisions soient découvertes (ce qui est également une question de temps et de moyens).

## Détails de l'algorithme

Les spécifications de SHA-1 sont décrites pour la première fois en avril 1995 dans le document officiel du NIST FIPS 180-1 pour un standard de fonction de hachage cryptographique. Elles sont reprises dans les versions successives de ce document, FIPS-180-2, FIPS-180-3 et FIPS-180-4.
L'algorithme SHA-1 transforme un message de longueur inférieure à 2$^{64}$ bits en un haché, ou condensé de ce message, qui est de longueur 160 bits. Il adopte la construction de Merkle-Damgård : schéma itératif à partir d'une fonction de compression dont l'entrée est de taille fixe, et ajout en fin de message de sa longueur (renforcement de Merkle-Damgård, (en)Merkle-Damgård strengthening) ce qui permet de réduire la résistance aux collisions de la fonction de hachage à celle de la fonction de compression.
Cet algorithme peut être découpé en deux phases : le prétraitement et le calcul du condensé.
* Le prétraitement implique
** de compléter le message par des informations le rendant compatible avec l'algorithme SHA-1 (remplissage)
** son analyse pour le découper en blocs de 512 bits
** l'initialisation de variables de travail
* Le calcul du condensé génère un tableau à partir du message complété, puis le transforme via l'utilisation de fonctions, de constantes, d'opérations binaires détaillées plus loin. L'ensemble effectué de manière itérative permet de générer des séries de valeurs de hachage à chaque tour. Le condensé final est le dernier état de ces valeurs de hachage.

### Symboles et termes utilisés
#### Paramètres

* a, b, c, d, e = variables de travail (en l'occurrence des mots de w bits), utilisées dans le calcul des hachés.
* $H^{(i)}$ = la valeur de hachage n°i. $H^{(0)}$ est la valeur initiale du hachage. $H^{(N)}$ est la dernière valeur de hachage.
* $H_{j}^{(i)}$ = le mot (w bits) n°j de la valeur de hachage n°i, où $H_{0}^{(i)}$ est le mot de poids le plus fort (à gauche) de la valeur de hachage i.
* $K_{t}$ = constantes itératives selon la valeur de t, utilisées dans le calcul de hachage
* k = nombre de 0 ajoutés au message lors du prétraitement (complément)
* l = longueur du message M, en bits
* m = nombre de bits contenus dans un bloc, soit 512 bits
* M = message à traiter
* $M^{(i)}$ = bloc n°i (m bits), du message M
* $M_{j}^{(i)}$ = mot (w bits) n°j, du bloc (m bits) n°i, du message M
* n = nombre de bits de décalage ou de rotation à appliquer au mot quand associé à une fonction binaire
* N = nombre de blocs de m bits contenus dans le message M après complément
* T = variable temporaire, mot de w bits, utilisée dans le calcul de condensé
* w = nombre de bits contenus dans un mot, soit 32 bits.
* $W_{t}$ = le mot n°t du tableau déduit du message

#### Symboles

La notation hexadécimale utilisée ici sera: ${\mbox{0x}}$ (exemple : $H_{0}^{(0)}={\mbox{0x12ab34ef}}$)
* $\wedge$ = opération binaire AND
* $\vee$ = opération binaire OR
* $\oplus$ = opération binaire XOR
* $\lnot$ = complément binaire
* $+$ = addition modulo $2^{w}$
* $<<$ = décalage binaire à gauche, où $x<<n$ s'obtient en supprimant les n bits de gauche de x et ajoutant n zéros à droite.
* $>>$ = décalage binaire à droite, où $x>>n$ s'obtient en supprimant les n bits de droite de x et ajoutant n zéros à gauche.

### Opérations sur les mots

Elles utilisent les conventions suivantes :
* opérations binaires bit à bit (cf. symboles)
* addition modulo $2^{w}$, soit $2^{32}$ L'opération $x+y$ est définie comme suit. Soient deux mots $x{\mbox{ et }}y$ représentant les nombres entiers $X{\mbox{ et }}Y$, tels que $0\leq X<2^{32}$ et $0\leq Y<2^{32}$, on a $Z$ le résultat de l'addition modulo $2^{32}$ de $X{\mbox{ et }}Y$. $Z=(X+Y){\mbox{ mod }}2^{32}{\mbox{, }}0\leq Z<2^{32}$. On convertit $Z$ en un mot $z$, et on définit alors $z=x+y$
* l'opération de rotation binaire par la gauche $ROTL^{n}(x)$, où x est un mot de 32 bits et $0\leq n\leq 32$, est définie par: $ROTL^{n}(x)=(x<<n)\vee (x>>32-n)$

### Fonctions et constantes
#### Fonctions

Cette section décrit les fonctions utilisées lors du calcul des valeurs de hachage. SHA-1 utilise une succession de fonctions logiques $f_{0},f_{1},...,f_{79}~$. Chaque fonction $f_{t}~$, où $0\leq t\leq 79$, travaille sur trois variables entières de 32 bits $(b,c,d)~$ et retourne un entier de 32 bits :
    $f_{t}=\left\{{\begin{array}{lcl}{\text{Choix}}&{\text{si}}&0\leq t\leq 19\\{\text{Parité}}&{\text{si}}&20\leq t\leq 39\\{\text{Majorité}}&{\text{si}}&40\leq t\leq 59\\{\text{Parité}}&{\text{si}}&60\leq t\leq 79\\\end{array}}\right.~$
définie par une des trois fonctions binaires classiques suivantes, où
    ${\begin{array}{lcl}Choix(b,c,d)&=&(b\wedge c)\vee ((\lnot b)\wedge d)\\&=&(b\wedge c)\oplus ((\lnot b)\wedge d)\\&=&(b\wedge c)+((\lnot b)\wedge d)\\&=&d\oplus (b\wedge (c\oplus d))\\&=&\operatorname {vec_{--}sel} (d,c,b)\\\end{array}}~$
est la fonction binaire (plusieurs formules équivalentes ci-dessus) de choix entre les bits correspondants des deux premières variables, selon la valeur du bit correspondant de la troisième variable,
    ${\begin{array}{lcl}Majorite(b,c,d)&=&(b\wedge c)\vee (b\wedge d)\vee (c\wedge d)\\&=&(b\wedge c)\oplus (b\wedge d)\oplus (c\wedge d)\\&=&(b\wedge c)\vee (d\wedge (b\vee c))\\&=&(b\wedge c)\vee (d\wedge (b\oplus c))\\&=&(b\wedge c)\oplus (d\wedge (b\oplus c))\\&=&(b\wedge c)+(d\wedge (b\oplus c))\\&=&\operatorname {vec_{--}sel} (c,b,c\oplus d)\\&=&Choix(c\oplus d,b,c)\\\end{array}}~$
est la fonction binaire (plusieurs formules équivalentes ci-dessus, ainsi que d'autres car elle est commutative sur ses 3 variables) indiquant si la majorité (au moins deux) des trois bits correspondants des trois variables sont à 1, et
    $Parite(b,c,d)=b\oplus c\oplus d~$
est la fonction binaire (commutative sur toutes ses variables) d'union exclusive ou parité des trois variables.

#### Constantes

SHA-1 utilise quatre valeurs réparties dans les 80 constantes $K_{0},K_{1},...,K_{79}~$, d'après la règle
$K_{t}=\left\{{\begin{matrix}{\mbox{0x5a827999}},&{\mbox{si }}0\leq t\leq 19\\{\mbox{0x6ed9eba1}},&{\mbox{si }}20\leq t\leq 39\\{\mbox{0x8f1bbcdc}},&{\mbox{si }}40\leq t\leq 59\\{\mbox{0xca62c1d6}},&{\mbox{si }}60\leq t\leq 79\end{matrix}}\right.$

### Prétraitement

Cette opération se déroule en trois étapes : compléter le message M, découper le résultat en blocs, et initialiser les valeurs de hachage $H^{(0)}~$

#### Complément de M

Il s'agit ici d'ajouter des informations à M pour qu'il soit d'une taille multiple de 512 bits. pour ce faire, l'on ajoute un bit "1" à la fin du message M, puis k zéros, où k est la plus petite solution non négative de l'équation: l + 1 + k = 448 mod 512, avec l = taille de M en bits. On ajoute alors un bloc de 64 bits correspondant à la représentation binaire de l.
Exemples :
* M = "abc", l = 8 x 3 = 24, k = 448 - (l + 1) = 448 - (24 + 1) = 423 On ajoute "1", puis quatre cent vingt trois "0", puis 64 bits finissant par "011000" (pour 24) à M. On obtient alors un message complété à 512 bits.
* M quelconque tel que l = 500 bits, k = 448 - (l + 1) = 448 - (500 + 1) = -53 Comme k ne peut pas être négatif, on lui ajoute 512 en prenant en compte le modulo de l'équation, pour obtenir $k=459$ On ajoute "1", puis quatre cent cinquante neuf "0", puis 64 bits finissant par "111110100" (pour 500) à M. On obtient alors un message complété à 512 bits.

#### Découpage en blocs

Le message complété est découpé en N blocs de 512 bits, notés $M^{(1)},M^{(2)},...,M^{(N)}~$. Chaque bloc de 512 bits est ensuite découpé en 16 mots de 32 bits, notés $M_{0}^{(i)},M_{1}^{(i)},...,M_{15}^{(i)}$.

#### Initialisation

Le vecteur initial est défini comme suit :
    $\left({\begin{matrix}H_{0}^{(0)}\\H_{1}^{(0)}\\H_{2}^{(0)}\\H_{3}^{(0)}\\H_{4}^{(0)}\end{matrix}}\right):=\left({\begin{matrix}{\mbox{0x67452301}}\\{\mbox{0xefcdab89}}\\{\mbox{0x98badcfe}}\\{\mbox{0x10325476}}\\{\mbox{0xc3d2e1f0}}\end{matrix}}\right)~$

### Calcul du condensé (haché)

Pour ce traitement on utilisera :
* la fonction d'expansion d'un bloc de 16 mots du message en un bloc intermédiaire de 80 mots :
    $W_{t}^{(i)}=\left\{{\begin{matrix}M_{t}^{(i)}&{\text{si}}&0\leq t\leq 15\\ROTL^{1}\left(W_{t-3}\oplus W_{t-8}\oplus W_{t-14}\oplus W_{t-16}\right)&{\text{si}}&16\leq t\leq 79\\\end{matrix}}\right.$
* la fonction suivante de compression d'un bloc intermédiaire de 80 mots sur un vecteur de 5 mots :
    $C_{t}\left(W,\left({\begin{matrix}a\\b\\c\\d\\e\end{matrix}}\right)\right)=\left({\begin{matrix}\operatorname {ROTL} ^{5}(a)+f_{t}(b,c,d)+e+K_{t}+W_{t}\\a\\\operatorname {ROTL} ^{30}(b)\\c\\d\end{matrix}}\right)~$
    où $f_{t}~$ notée ci-après est la fonction binaire, décrite plus haut.
* cinq variables contenant les valeurs de hachage, notées $H_{0}^{(i)}$ et initialisées précédemment en $H_{0}^{(0)}$. Ces variables contiendront itérativement de nouvelles valeurs de hachage, $H^{(i)}~$, pour finalement contenir le condensé de M, dans $H^{(N)}~$.
On traite successivement les blocs de M selon les étapes suivantes, pour $1\leq i\leq N~$ :
* On étend un bloc $M^{(i)}~$ de 16 mots du message en un bloc temporaire $W_{t}^{(i)}$ de 80 mots où $0\leq t\leq 79~$, selon
    $W_{t}^{(i)}=\left\{{\begin{matrix}M_{t}^{(i)}&{\text{si}}&0\leq t\leq 15\\ROTL^{1}\left(W_{t-3}\oplus W_{t-8}\oplus W_{t-14}\oplus W_{t-16}\right)&{\text{si}}&16\leq t\leq 79\\\end{matrix}}\right.$
* On initialise un vecteur temporaire avec les valeurs de hachage du tour précédent :
    $\left({\begin{matrix}a\\b\\c\\d\\e\end{matrix}}\right):=\left({\begin{matrix}H_{0}^{(i-1)}\\H_{1}^{(i-1)}\\H_{2}^{(i-1)}\\H_{3}^{(i-1)}\\H_{4}^{(i-1)}\end{matrix}}\right)~$
* On réduit le bloc temporaire $W_{t}^{(i-1)}$ sur ce vecteur temporaire :
    $\left({\begin{matrix}a\\b\\c\\d\\e\end{matrix}}\right):=\left({\begin{matrix}\operatorname {ROTL} ^{5}(a)+f_{t}(b,c,d)+e+K_{t}+W_{t}\\a\\\operatorname {ROTL} ^{30}(b)\\c\\d\end{matrix}}\right)~$
    où $f_{t}~$ notée ci-après est la fonction logique, décrite plus haut.
* On combine le vecteur obtenu avec le condensé intermédiaire par une simple addition :
    $\left({\begin{matrix}H_{0}^{(i)}\\H_{1}^{(i)}\\H_{2}^{(i)}\\H_{3}^{(i)}\\H_{4}^{(i)}\end{matrix}}\right):=\left({\begin{matrix}H_{0}^{(i-1)}\\H_{1}^{(i-1)}\\H_{2}^{(i-1)}\\H_{3}^{(i-1)}\\H_{4}^{(i-1)}\end{matrix}}\right)+\left({\begin{matrix}a\\b\\c\\d\\e\end{matrix}}\right)~$
Après répétition des quatre étapes ci-dessus pour les N blocs du message M, le condensé de 160 bits de M est obtenu par concaténation des valeurs
    $H_{0}^{(N)}||H_{1}^{(N)}||H_{2}^{(N)}||H_{3}^{(N)}||H_{4}^{(N)}~$
Remarque : Il existe d'autres méthodes de calcul du condensé SHA-1 donnant des résultats identiques.
* On doit noter notamment que la rotation de 30 bits vers la gauche $c=ROTL^{30}(b)~$ calculée sur 32 bits est trivialement équivalente à une rotation de 2 bits vers la droite $c=ROTR^{2}(b)~$.
* Comme le montrent Laurent et Peyrin dans leur article de 2019, les opérations de chacune des 80 boucles de l'étape 3 sont également réductibles, de façon équivalente, à une seule opération
    $A_{t+1}=ROTL^{5}\left(A_{t-1}\right)+f_{t}\left(A_{t-1},\,ROTR^{2}\left(A_{t-2}\right),\,ROTR^{2}\left(A_{t-3}\right)\right)+ROTR^{2}\left(A_{t-4}\right)+K_{t}+W_{t}~$
    où les 5 variables $(a,b,c,d,e)~$ sont en fait parties d'un unique registre d'état $A_{t}~$ de 160 bits, dont on ne doit mémoriser à chaque boucle que les 4 valeurs précédentes
    Cela ne nécessite que de connaitre les valeurs d'initialisation des 3 « valeurs précédentes » associées à la valeur initiale $A_{0}$ du registre pour les 3 première boucles, ce qui est possible car les valeurs initiales (de l'étape 2) sont inversibles pour la fonction $f_{0}=Ch~$ sur seulement 3 étapes, cette même fonction étant utilisée sans changement pour les 20 premières boucles dont les 3 premières, et toutes les fonctions $f_{t}~$ définies à l'origine sur 32 bits sont extensibles sans changement à 160 bits).
    D'autre part, les rotations de cette dernière formule (réduite à une opération) portent sur des valeurs de 160 bits (et non 32 bits), de sorte qu'alors $ROTR^{2}(A_{t})=ROTL^{158}(A_{t})~$.
* La fonction de compression obtenue par ces 80 boucles est donc une composition récursive de fonctions à une seule variable de 160 bits (portant sur l'expansion triviale et inversible à 160 bits $W^{(i)}~$, à l'étape 1, d'un bloc de 32 bits $M^{(i)}~$ extrait du message en clair), terminée par l'addition de la valeur de hachage intermédiaire du message jusqu'au bloc précédent (ou la valeur initiale constante $H^{(0)}~$ de la fonction de hachage) :
    $H^{(i)}=\left(Parity^{20}\,\circ \,Maj^{20}\,\circ \,Parity^{20}\,\circ \,Ch^{20}\right)\left(W^{(i)}\right)+H^{(i-1)}~$
    Noter que dans cette définition, les fonctions initialement définies sur 32 bits $Parity,Maj,Ch$ sont modifiées pour être étendues à 160 bits en utilisant la formule à une seule opération, où viennent s'ajouter les rotations sur 5 bits vers la gauche ou 2 bits vers la droite des valeurs précédentes de $A_{t}$ et les additions de constantes $K_{t}~$.
* La résistance aux collisions de SHA-1 est liée directement à la non-inversibilité (conjecturée) de la fonction composée obtenue $Parity^{20}\,\circ \,Maj^{20}\,\circ \,Parity^{20}\,\circ \,Ch^{20}~$, puisque la fonction d'expansion $W^{(i)}~$des messages $M^{(i)}~$est trivialement inversible.

## Attaques

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 $2^{80}$.
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 $2^{80}$ opérations.
En février 2005, 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 $2^{69}$ opérations au lieu de $2^{80}$ par l’attaque des anniversaires
* une collision dans le SHA-0 complet avec seulement $2^{39}$ opérations
* une collision dans une version simplifiée du SHA-1 (58 tours) avec $2^{33}$ opérations
La description de l'attaque a été publiée en juin 2005.
Le 17 août 2005, une amélioration de l'attaque a été annoncée par Wang et al. à la conférence CRYPTO 2005, la complexité passe ainsi de 2$^{69}$ à 2$^{63}$, soit une division par 64 de la complexité originale.
Lors de l'Eurocrypt 2009 (avril), une amélioration de l'attaque aurait permis de réduire à nouveau sa complexité jusqu'à atteindre $2^{52}$. Toutefois, ces résultats furent démentis et l'article fut retiré à 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 23 février 2017 qu'ils avaient réussi à obtenir une collision entre deux documents$^,$.
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 avril 2019 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 $2^{66.9}$ et $2^{69.4}$, 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 décembre 2019, ces mêmes chercheurs ont annoncé avoir amélioré leur attaque et pouvoir obtenir une collision en $2^{63.7}$ opérations, pour un coût de 45k$. 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$^,$. Un code libre de démonstration et des données d'analyse seront bientôt mis en ligne sur GitHub afin d'évaluer correctement son impact notamment dans la sécurité de protocoles Internet comme TLS (utilisé notamment par HTTPS) et des certificats de serveurs, avec la possibilité alors de créer à bas coût une autorité de certification (CA) malveillante, notamment pour créer des failles de contournement de la sécurité de sites Internet (dont 5 % des plus connus et les plus visités utilisent encore en mai 2019 des certificats basés sur SHA-1, plusieurs années après la fin de leur recommandation, y compris encore Microsoft pour certains de ses services connectés comme Skype) ainsi que l'utilisabilité de la méthode pour casser d'autres algorithmes de hachages connus qui restent recommandés (dont RIPEMD-160, SHA-2 et SHA-3) et d'autres qui ne le sont pas encore.

### Conséquences

Même si un gain de 2$^{17}$ opérations permettait de diviser le temps de recherche par un facteur de 131 072, l'attaque de 2009 avec ses 2$^{63}$ opérations était à la limite de ce qui était réalisable. Adi Shamir a toutefois laissé entendre que l'attaque pouvait probablement être abordée via un calcul distribué à l'échelle planétaire. Mais maintenant (en avril 2019 avec la méthode publiée par Leurent et Peyrin) avec un gain d'au moins 2$^{33}$ opérations (soit un facteur d'accélération voisin de dix milliards), une telle attaque est tout à fait réalisable de façon pratique avec des moyens facilement accessibles, d'autant plus qu'en 10 ans la performance des systèmes s'est considérablement accrue, avec en plus l'arrivée massive et à bas coût sur le marché mondial des GPU (ainsi qu'avec la multiplication des offres peu onéreuses d'hébergement d'applications privées sur le « cloud » permettant de les utiliser), capables de réaliser localement des calculs massivement parallèles et de façon discrète, sans faire nécessairement appel à des ressources externes distribuées (également détournées de façon illégale et aujourd'hui à très grande échelle) accessibles sur un réseau planétaire où une telle mise en œuvre pourrait être détectée assez facilement.
La règle veut qu'une attaque plus rapide que les attaques génériques (celle des anniversaires en l'occurrence) rende l'algorithme non sûr du point de vue cryptographique. De plus, la structure de SHA-1 reste assez proche de celle de MD5 (qui est déconseillé pour les nouvelles applications) pour lequel on a trouvé effectivement des collisions. Depuis l'annonce de l'attaque de Wang et al., SHA-1 a tendance à être retiré progressivement, au moins de certaines applications cryptographiques, essentiellement au profit de SHA-256 (d'autres fonctions de hachage sont également utilisées comme Whirlpool, Tiger, RIPEMD-160, et d'autres plus récentes comme ChaCha20, Curve25519, NTRU, ainsi que BLAKE2b ou BLAKE2s qui sont suggérés en mai 2019 pour les empreintes de mots de passe et pour la sécurisation des échanges de clés de chiffrement, en remplacement de SHA-1 et même de SHA-2 ou SHA-3). SHA-1 reste malheureusement encore largement utilisé, d'autant que la sécurité de certaines applications repose sur la résistance à la recherche de préimage (ce qui n'est plus le cas depuis avril 2019 si cette recherche est techniquement réalisable), et non sur la seule résistance aux collisions.
Vu les faiblesses constatées sur SHA-1, et la conception de SHA-2 qui est voisine, une compétition a été organisée par la NIST, afin de trouver un nouveau standard de hachage (SHA-3) comme cela fut le cas il y a quelques années pour la cryptographie symétrique avec AES. Toutefois les révélations d'Edouard Snowden concernant la manipulation par la NSA des constantes utilisées dans des algorithmes de sécurité standardisés par le NIST (y compris dans les algorithmes de chiffrement récents, et dans des algorithmes de génération de nombres pseudo-aléatoires basés sur les courbes elliptiques nécessaires à la production des clés de chiffrement) ont levé le doute sur la réelle sécurité des fonctions de hachage de la famille SHA : ainsi concernant SHA-1, les constantes d'initialisation n'obéissent de façon évidente à aucun critère cryptographique satisfaisant et ont un intérêt seulement mnémonique, elles pourraient ainsi constituer des portes dérobées volontairement introduites ou laissées par la NSA pour faciliter la découverte de collisions avec les moyens techniques dont disposait alors la NSA au moment de sa standardisation et sa publication par le NIST en 1995.
L'attaque produite par Wang et al. ne concerne que des collisions quelconques (tout comme leur fameuse collision complète sur le MD5). C’est-à-dire que l'on peut trouver deux messages au contenu aléatoire qui produisent la même signature. En revanche, à partir d'une signature donnée, il était considéré comme impossible (jusqu'en avril 2019) de forger un second message qui conduise à la même valeur, à condition d'utiliser un système d'authentification de messages (tel que HMAC) en complément de la fonction de hachage nécessaire à ce système. Or, c'est ce type d'attaque qui pourrait mettre en péril les applications comme PGP et l'authenticité des données.

## Le SHA-1 en mode chiffrement

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.