ystème de chiffrement par blocs Université de Lille-1 IL PAC 19 février 2015 1 Réseaux de eistel Question 1: La fonction f a-t-elle besoin d être inversible? Expliquez comment on peut procéder au déchiffrement. Question 2: Expliquez comment distinguer un tour de réseau de eistel d une permutation aléatoire Question 3: Même question avec deux tours. Question 4: En supposant que la fonction f renvoie des sorties aléatoires, qu observe-t-on au bout de 3 tours de réseau de feistel? Question 5: i on a le droit de faire déchiffrer ce qu on veut, montrer comment distinguer trois tours de réseau de eistel. 2 Un Block Cipher maison Vos enseignants ont conçu un système de chiffrement par bloc, juste pour vous. Ce système est inspiré par l AE. Il chiffre des blocs de 8 octets avec des clefs de 8 octets. Quand on a un bloc x (ou une clef k) de 8 octets, on numérote les différents octets x 0,..., x 7 (et k 0,..., k 7, respectivement). Notre système fonctionne en appliquant des fonctions de tour plusieurs fois de suite sur le bloc à chiffrer. Plus précisément, le chiffrement fonctionne comme ça : 1: function Encrypt(k, x) 2: for i = 0 to r 1 do 3: x R i (k, x) 4: return x 5: end function La i-ème fonction de tour, elle, est décrite par le programme suivant (la figure ci-dessous en donne une représentation graphique) : 1: function R i (k, x) 2: y 0 (x 0 k 0 ) i 3: for j = 1 to 7 do 4: y j (x j k j ) 5: for j = 1 to 7 do 6: z j y j 1 y j 7: z 0 y 0 y 7 8: return z 9: end function Dans cette fonction, on suppose que (... ) désigne la -boite de l AE. 1
i k 0 k 1 k 2 k 3 k 4 k 5 k 6 k 7 x 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 Question 6: Combien d opérations nécessite (en gros) une recherche exhaustive pour retrouver la clef secrète? Quelle(s) information(s) sont nécessaire(s) pour effectuer cette recherche? Question 7: Expliquez comment on peut effectuer le déchiffrement sachant qu on dispose de 1, qui est la -boite inverse de l AE. Question 8: upposons qu on connaisse k 0,..., k 6, c est-à-dire toute la clef sauf k 7. On applique la fonction de tour sur un bloc clair X, qu on choisit. Que peut-on connaître dans R 0 (X)? Question 9: Même question pour R 0 (R 1 (X))? Question 10: Maintenant, on essaye de prendre le problème à l envers. On a sous la main un bloc de chiffré, Z, et on suppose qu on connaît k 1,..., k 7 (toute la clef sauf k 0 ). Que peut-on connaître dans R 0 1 (Z)? Question 11: Même question avec R 1 1 ( R 0 1 (Z) )? Question 12: Même question avec R 6 1 ( (R 0 1 (Z) ) )? z 0 z 1 z 2 z 3 z 4 z 5 z 6 z 7 On suppose maintenant que notre block-cipher a 7 tours (r = 7 dans l algorithme). On veut monter une attaque qui retrouve la clef (sensiblement) plus vite que la recherche exhaustive. Question 6: Décrivez une fonction Test qui prend en argument k 1,..., k 7 ainsi qu une paire clair/chiffré et qui indique si oui ou non les valeurs de la clef si correctes. Votre procédure a le droit de se tromper avec probabilité 1/256. Le pseudo-code de l attaque est le suivant. Ici, (X, Z) est une paire clair-chiffré : 1: procedure Attack(X, Z) 2: for all k 1,..., k 7 do 3: if Test(X, Z, k 1,..., k 7 ) then 4: for all k 0 do 5: if Encrypt(k 0,..., k 7, X) = Z then 6: print la clef est peut-être, (k 0,..., k 7 ). 7: end if 8: end if 9: end procedure Question 7: Quelle est la complexité de l attaque? Est-ce qu elle réussit toujours? Est-elle plus rapide que la recherche exhaustive. Question 8: D après vous, quel est le principal défaut de ce système de chiffrement par bloc?
3 GOT GOT est un Block Cipher conçu en UR peu après le développement du DE, vers la fin des années 1970. Il chiffre des blocs de 64 bits avec des clefs de 256 bits. Le chiffrement GOT opère en appliquant 4 fois un autre Block Cipher plus faible, qu on note G, et qui chiffre lui aussi 64 bits avec des clefs de 256 bits : 1: function GOT(m,k) 2: a G(m, k) 3: b G(a, k) 4: c G(b, ( k) ) 5: d G c, k 6: return d 7: end function La clef k se décompose naturellement en 8 mots de 32 bits (k 0, k 1, k 2, k 3, k 4, k 5, k 6, k 7 ), et le message m en deux mots de 32 bits (m 0, m 1 ). On note k la clef «mirroir» : k = (k7, k 6, k 5, k 4, k 3, k 2, k 1, k 0 ) Les concepteurs de GOT ont choisi d inverser l ordre des clefs dans le dernier tour pour rendre le tout «moins symétrique». On va voir que c est pourtant ça qui va causer tous leurs problèmes. La première «attaque» plus rapide que la recherche exhaustive contre GOT a été découverte en 2011. C est celle-ci qui est étudiée ici. m 0 m 1 k 0 k 1 k 2 k 3 k 4 k 5 k 6 k 7 3.1 Préliminaires La fonction G est décrite par le dessin ci-dessus à droite. La fonction est complètement arbitraire (c est un tour de PN, en gros). Question 9: En supposant qu on puisse faire appel à la fonction G 1, qui est le déchiffrement de G, écrivez le déchiffrement de GOT. La fonction G est en fait un réseau de feistel à 8 tours, qui figure sur la colonne de droite. La fonction n a pas besoin d être spécifiée. Question 10: Expliquez comment fonctionne G 1. i vous êtes coincé, imaginez d abord que G n a qu un seul tour. Passez ensuite à deux, puis trois, etc. Question 11: On considère deux blocs x et y de 64 bits. Combien y a-t-il (en moyenne) de clefs k de 256 bits telles que y = GOT (x, k)? Vous pouvez supposer que GOT (x, k) est une valeur aléatoire parmis l ensemble des chaines de 64 bits pour chaque nouvelle clef k. Question 12: Combien faut-il de paires clair / chiffré pour espérer retrouver la clef k de manière (à peu près) unique? Question 13: Quelle est la complexité de la recherche exhaustive sur la clef quand on dispose de suffisament de paires clair/chiffré? 3.2 aiblesse de G G, pris isolément, n est pas un bon Block Cipher. On va voir qu il est possible de récupérer la clef plus vite que la recherche exhaustive par un moyen simple. On suppose ici qu on a sous la main suffisament de paires clair/chiffré, que la fonction est bijective et qu on sait calculer efficacement son inverse. Question 14: Montrez comment récupérer k 7 à partir de k 0,..., k 6.
Question 15: Déduisez-en une une attaque sur G qui retrouve l ensemble de la clef secrète plus vite que la recherche exhaustive. Quelle est sa complexité? 3.3 Propriété de «reflexion» On dit qu un bloc de 64 bits m = (m 0, m 1 ) est symétrique si m 0 = m 1 (c.a.d. si les deux moitiés qui entrent dans le réseau de eistel qui forme G sont égales). Question 16: Montrez que G(m, k) 1 ( = G m, k ) lorsque m est symétrique. Question 17: Justifiez que lorsque c est symétrique, alors b = d (dans la description de haut-niveau de GOT donnée au début) Question 18: Quelle est la probabilité qu un bloc de 64 bits choisi au hasard soit symétrique? (vous pouvez imaginer que la première moitié est choisie d abord, et la deuxième ensuite). Question 19: upposons qu on chiffre x pour obtenir y = GOT (x, k). Justifiez pourquoi, lorsque c est symétrique, on a G(x, k) = G 1 (y, k) 3.4 Principe de l attaque sur GOT complet Cette propriété de reflexion est l ingrédient-clef d une procédure qui permet de récupérer la clef secrète de GOT à partir d un «petit» nombre de clairs connus. 1: function Break-GOT 2: Obtenir une nouvelle paire clair/chiffré (x, y) avec y = GOT (x, k) 3: for all bloc a {0, 1} 64 do 4: Déterminer toutes les solutions de () : { a = G(x, k) y = G(a, k) 5: for all solution k de () do 6: Tester k avec des paires clair/chiffré connues. En cas de succès, s arrêter et renvoyer k. 7: Retourner à l étape 2 8: end function On va voir dans la suite qu il est possible d exécuter l étape 4 en grosso-modo 2 128 opérations, et que le nombre de solutions k du système () de l étape 4 est lui aussi environ 2 128. Question 20: Justifiez que cette procédure est correcte : quand elle renvoie une valeur de k, alors c est la bonne. Question 21: Justifiez que si la paire clair/chiffré choisir à l étape 2 conduit à une valeur de c symétrique, alors une bonne solution sera trouvée à l étape 6 et la procédure s arrêtera. Question 22: Déterminer la complexité (moyenne) en temps de cette procédure. Combien de paires clair/chiffré sont-elles nécessaires au total? 3.5 Attaque par le milieu de G Pour que l attaque de GOT soit complète, il reste à être capable de résoudre efficacement le système () de l étape 4. On va voir qu on peut même faire quelque chose d un peu plus général, et qu on peut résoudre «efficacement» le système suivant : ( ) : { t = G(s, k) v = G(u, k) où s, t, u et v sont quatres blocs de 64 bits arbitraires dont on connaît la valeur (et s u). Question 23: Justifiez que si on sait résoudre ( ), alors on sait résoudre () avec la même complexité.
Question 24: i on choisissait une clef k au hasard, quelle serait la probabilité que ce soit une solution? Déduisez-en que si on testait toutes les clefs possibles on pourrait s attendre à obtenir en moyenne 2 128 solutions. Question 25: Montrez qu on peut «découper «G en deux. Pour cela, montrer qu on peut construire une fonction R qui prend seulement 128 bits de clef, telle que : G k (x) = R k4,k 5,k 6,k 7 ( ( R k0,k 1,k 2,k 3 (x) ) Vous pouvez dessiner une représentation de R. Concluez-en que le système ( ) est équivalent à : ( ) : { R 1 (t) R 1 (v) = R k0,k 1,k 2,k 3 (s) = R k0,k 1,k 2,k 3 (u) Pour trouver les solutions rapidement, on utilise la technique dite «Meet-In-The-Middle» : 1: function olve(s,t,u,v) 2: Allouer un (gros) dictionnaire D 3: for all valeur de (k 0, k 1, k 2, k 3 ) {0, 1} 128 do 4: oit i = (R k0,k 1,k 2,k 3 (s) R k0,k 1,k 2,k 3 (u)) 5: Ajouter (k 0, k 1, k 2, k 3 ) à D[i] 6: for all valeur ( de (k 4, k 5, k 6, k 7 ) {0, 1} 128 ) do 7: oit i = R 1 (t) R 1 (v) 8: for all quadruplet(k 0, k 1, k 2, k 3 ) dans D[i] do 9: Considérer k = (k 0, k 1, k 2, k 3, k 4, k 5, k 6, k 7 ) comme une solution potentielle de ( ). 10: end function Question 26: Justifiez que les solutions signalées par cette procédure sont correctes (ce sont vraiment des solutions de ( ). Question 27: ans rentrer trop dans les détails, donnez des éléments de justification permettant de se convaincre que chaque case du dictionnaire D contient en moyenne une seule entrée. Question 28: Justifiez que cette procédure signale en moyenne 2 128 solutions.