SHA-3

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Keccak (prononciation: [kɛtʃak], comme “ketchak”)[1] est une fonction de hachage cryptographique conçue par Guido Bertoni, Joan Daemen, Michaël Peeters et Gilles Van Assche à partir de la fonction RadioGatún (en).

SHA-3 est issu de la NIST hash function competition qui a élu l'algorithme Keccak[2] le 2 octobre 2012. Elle n’est pas destinée à remplacer SHA-2, qui n’a à l'heure actuelle pas été compromise par une attaque significative, mais à fournir une alternative suite aux possibilités d'attaques contre les standards MD5, SHA-0 et SHA-1.

Keccak est une fonction éponge [3],[4] dans laquelle les blocs du messages sont XORés avec des bits initiaux, ensuite permutés de manière réversible.

La permutation par bloc de Keccak[modifier | modifier le code]

Keccak est une fonction éponge dont nous allons décrire la transformation, appelée f dans terminologie de la construction de l’éponge. Cette transformation est une permutation valable en choisissant un mot d’une taille qui soit une puissance de deux w = 2. Dans le cas de Keccak les mots sont de 64-bits, soit ℓ=6.

L’état interne de cette fonction sera vu comme une matrice de dimension 5×5×w. a[i][j][k] sera le bit (i*5+j)*w+k de l’entrée. Le calcul des index est effectué modulo 5 pour les deux premières dimensions, et modulo w pour la troisième.

La fonction f de Keccak est une permutation qui consiste en 12+2ℓ itérations (soit 24) de cinq sous routines assez simples :

La routine θ
Calculer la parité des 5×w colonnes (de 5 bits) de l’état, puis calculer le ou exclusif entre deux colonnes consécutives. a[i][j][k] \leftarrow a[i][j][k] \oplus parite(a[0..4][j-1][k]) \oplus parite(a[0..4][j+1][k-1])
La routine ρ
Décaler circulairement les 25 mots d’un nombre triangulaire (0, 1, 3, 6, 10, 15, …). a[0][0] n’est pas décalé, et :
pour chaque 0 ≤ t < 24 :\begin{pmatrix} i \\ j \end{pmatrix} \leftarrow \begin{pmatrix} 3 & 2 \\ 1 & 0 \end{pmatrix}^t \begin{pmatrix} 0 \\ 1 \end{pmatrix}
a[i][j][k] \leftarrow a[i][j][ k-(t+1)(t+2)/2]
La routine π
Permutation des 25 mots avec un motif fixé: a[3i+2j][i] = a[i][j]
La routine χ
Combiner bit à bit des lignes selon la formule a = a \oplus (\lnot b \& c):
a[i][j][k] \leftarrow a[i][j][k] \oplus  \lnot a[i][j+1][k]
Cette opération est la seule dite non linéaire.
La routine ι
Calculer le ou exclusif d’une constante avec un mot de l’état, qui dépend du numéro de l’itération ( n ):
pour chaque 0 ≤ m ≤ ℓ :a[0][0][2^m-1] est Xoré avec le bit numéroté m+7n d’une séquence LFSR de degré 8.
Cette dernière étape à pour objectif de casser les dernières symétries laissées par les précédentes.

Hacher des messages de taille variable[modifier | modifier le code]

Illustration d'une fonction éponge
La construction de l’éponge pour les fonction de hachages. Les pi sont l’entrée, les zi sont l’empreinte en sortie. La « capacité » c, inutilisée, devrait être le double de la résistance voulue aux collisions (en) ou aux attaques préimages (en).

SHA-3 utilise la construction de l’éponge, dans laquelle l’entrée est, métaphoriquement dans une première phrase absorbée par l’état, à une certaine vitesse, et dans une deuxième essorée, à la même vitesse.

Pour absorber r bits des données, la donnée est XORée dans les premiers bits de l’état, puis la permutation par blocs est appliquée si une sortie additionnelle est désirée.

La capacité de la fonction de hachage, les c=25w-r bits d’états qui ne sont jamais directement touchés par l’entrée ou la sortie, est un paramètre important. Elle peut être ajustée en fonction de la sécurité attendue de la construction, mais la norme SHA-3 la fixe raisonnablement à c=2n, avec n la taille de l’empreinte voulue.

Ainsi r, la quantité de bits du message traitée à chaque permutation, dépend de la taille d’empreinte désirée. Les différents choix de taux r sont 1152, 1088, 832, ou 576 (144, 136, 104 ou 72 octets) pour des tailles d’empreinte de 224, 256, 384 et 512 bits, respectivement, pour w fixé à 64.

Pour aligner le message sur une taille multiple de la taille d’un bloc de r bits, il est comblé (par bourrage, ou padding en anglais) avec le motif binaire 10...01 : un premier bit à 1, suivi éventuellement du nombre approprié de bits à 0 (au maximum r-1 bits), mais toujours suivi d’un autre bit à 1. Ce dernier bit est une précondition nécessaire à la preuve de sécurité de la construction de l’éponge (le dernier bloc de message doit être non nul).

L’algorithme se déroule ainsi : l’état est initialisé à 0, l’entrée est comblée, découpée en blocs de r bits. L’entrée est absorbée par l’état, c’est-à-dire que pour chaque bloc elle est XORée avec l’état puis la permutation est appliquée sur le résultat.

Une fois toutes les permutations effectuées, l’empreinte résultat est constituée des n premiers bits de l’état. r est toujours plus grand que n, il n’y a par conséquent jamais besoin d’appliquer plusieurs permutations lors de la phase de d’essorage. Dans d’autres applications comme Optimal Asymmetric Encryption Padding (OAEP) une sortie de taille variable est utile. Dans ce cas, n est un paramètre de sécurité plus qu’une simple taille de sortie.

Des variantes de la fonction de permutation permettant de générer des hachages plus petits sont également disponibles pour des tailles de hachage allant jusqu’à la moitié de la taille de leur état interne, si le taux r est suffisamment faible. Elles n’étaient pas nécessaire pour la candidature à la compétition SHA. Par exemple, il est possible de calculer une empreinte de 256 bits en utilisant 25 mots de 32 bits si r=800−2×256=288, soit 32 octets par itération.

SHA-3, instanciation la construction de l’éponge, pourrait s’écrire en pseudo-code :

fonction SHA-3(flux) :
paramètres de la construction :
f : une transformation de b bits → b bits, décrite dans la précédente section
r : le nombre de bits par bloc de sortie
pad : une fonction de comblement du flux d’entrée en blocs entiers de r bits
ns : le nombre de blocs de sorties
variables internes :
état : un tableau de b bits, initialisés à 0, divisé en état[1..r] et état[r+1..b]
blocs : un tableau de blocs de r bits chacun
z : une chaîne à retourner, de longueur ns×r, initialisée vide
algorithme :
(* phase d’absorption *)
blocsdécoupe pad(flux) en blocs de taille r bits
pour chaque p dans blocs :
étatf(étatp[1..r])
(* phase d’essorage *)
répéter ns fois :
zconcatène(z, état[1..r])
étatf(état)
retourne z

Articles connexes[modifier | modifier le code]

Notes et références[modifier | modifier le code]

  1. (en) Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche, « The Keccak sponge function family: Specifications summary », sur http://keccak.noekeon.org/ (consulté le 2011-05-11)
  2. Patrick Guignot, « Keccak remporte la mise et devient SHA-3 », sur Linuxfr
  3. (en) Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche, « Sponge Functions », Ecrypt Hash Workshop 2007
  4. (en) Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van Assche, « On the Indifferentiability of the Sponge Construction », EuroCrypt 2008

Liens externes[modifier | modifier le code]