• Aucun résultat trouvé

4.2 Hiding

4.2.2 Application à AES - État de l’art

Nous allons à présent aborder deux techniques différentes issues de la litté-rature et qui ont pour objectif de provoquer la désynchronisation des traces en modifiant l’ordre des instructions lors de chaque exécution de l’algorithme cryptographique. Ces deux techniques réalisent le mélange d’instructions

(shuf-fling en anglais) indépendantes.

Les deux travaux en question sont les travaux de Herbst, Oswald et Man-gard [27] et de Tillich, Herbst et ManMan-gard [68]. Ces deux travaux ont la particularité d’utiliser, tous les deux, un schéma de masking, que nous ver-rons en détails dans la prochaine section, conjointement à deux techniques de shuffling : l’exécution de fausses instructions et le mélange d’instructions indépendantes.

Indice de départ aléatoire

Le premier article, [27], utilise la technique dite de l’indice de départ aléatoire (Random Start Index (RSI) en anglais). RSI choisit aléatoirement un indice et exécute ensuite les autres opérations de manière séquentielle sur les données suivantes. Dans le cadre d’AES, pour l’opération d’addRoundKey, au lieu de commencer à la position (0, 0) de la matrice STATE et d’ensuite parcourir ligne par ligne et colonne par colonne les bytes de STATE pour leur ajouter la clé de tour, RSI propose de commencer à n’importe quel indice dans STATE et de continuer ensuite de manière classique, c’est-à-dire ligne par ligne et colonne par colonne. En procédant de la sorte, il existe alors 16 possibilités différentes d’exécution (en fonction de la case de départ). Cette manipulation est égale-ment valable pour les autres opérations d’AES. Pour shiftRows et pour mixCo-lumns qui, a priori, n’offrent que quatre possibilités (car les opérations ont lieu sur une ligne ou sur une colonne entière), il est possible de jouer sur l’ordre de calcul et d’écriture des valeurs dans STATE pour fournir 16 possibilités dif-férentes également.

Pour des raisons de performance et de calcul, procéder de la sorte (ligne par ligne et colonne par colonne, à partir d’une position aléatoire dans STATE) n’est peut-être pas la manière idéale de réaliser la chose. Il est alors possible de choisir par quelle ligne (ou par quelle colonne) commencer et d’itérer, ensuite, dans la matrice en exécutant séquentiellement les opérations ligne par ligne

(ou colonne par colonne). Il est également possible de choisir à quelle posi-tion commencer dans les lignes (ou colonnes). Pour addRoundKey, on pourrait par exemple commencer par la deuxième ligne, suivie, dans l’ordre, de la troi-sième, de la quatrième et de la première ligne, et décider de commencer par le dernier byte de chaque ligne. Ainsi, le choix de la ligne de départ offre 4 possibilités, qui sont complétées par 4 possibilités dans le choix du byte de départ, ce qui permet bien d’avoir 16 possibilités différentes.

C’est cette approche que les auteurs de [27] ont adoptée. Néanmoins, dans leur proposition, le shuffling n’a lieu que pour le addRounKey initial, les sub-Bytes et mixColumns du premier tour, le mixColumns et le addRoundKey de l’avant dernier tour et les subBytes et addRoundKey du dernier tour. De plus, les auteurs ont choisi d’appliquer en une fois les opérations d’addRoundKey, de subBytes et de mixColumns sur chaque colonne de STATE, au début de l’al-gorithme4, en choisissant la colonne initiale de manière aléatoire, ainsi que le byte de départ dans chaque colonne (ce byte est le même pour toutes les colonnes).

La figure 4.1 illustre l’entièreté du schéma proposé par les auteurs. Comme nous pouvons le constater, deux zones de randomisation sont renseignées : une au début de l’exécution et une autre à la fin. Les masques appliqués à STATE sont indiqués par un trait discontinu à chaque changement. Des opérations pour les actualiser sont nécessaires, mais ne sont pas indiquées sur la figure5. Les figures 4.2 et 4.3 montrent en détails ce qu’il se passe dans les deux zones de randomisation. Une variable M axOps est définie au préalable et permet de définir combien de fausses instructions vont être exécutées. Afin de minimiser la divulgation d’information sur le fait que l’exécution en cours a lieu sur la matrice STATE ou sur la fausse version de celle-ci (destinée aux faux calculs), les auteurs indiquent avoir choisi des adresses en mémoire ayant le même poids de Hamming pour les deux matrices. Lors de l’exécution des opérations sur la colonne, un indice est choisi aléatoirement, afin de sélectionner la ligne de départ par laquelle les opérations vont être exécutées.

4. Rien n’est mentionné dans l’article à ce propos, mais nous supposons que le même choix est pris à la fin de l’algorithme pour l’addRoundKey et et mixColumns de l’avant dernier tour et le subBytes et l’addRoundKey du dernier tour.

5. Il est possible d’envisager que chaque opération d’AES réalise la mise à jour des masques pour l’opération suivante.

FIGURE4.1 – Schéma général de AES, issu de [27] AddRoundKey SubBytes MixColumns ShiftRows AddRoundKey SubBytes MixColumns ShiftRows AddRoundKey SubBytes ShiftRows MixColumns AddRoundKey SubBytes FinalKeyAdd ShiftRows Texte clair Texte chiffré Round 1 Round 2 Round 9 Round 10 Z o n e d e ra n d o mi sa ti o n 1 Z o n e d e ra n d o mi sa ti o n 2 M1', M2', M3' , M4' M M' M1, M2, M3, M4 M1', M2', M3' , M4' M1', M2', M3' , M4' M1', M2', M3' , M4' M1, M2, M3, M4 M1, M2, M3, M4 M M M M' M' M'

FIGURE4.2 – Zoom sur la première zone de randomisation du schéma de AES, issu de [27]

i = MaxOPS

Choisir une colonne

Choisir STATE ou FauxSTATE AddRoundKey SubBytes MixColumns pour la colonne sélectionnée

Choisir la colonne suivante

Décrémenter i

i > 0 NON OUI

FIGURE4.3 – Zoom sur la seconde zone de randomisation du schéma de AES, issu de [27]

i = MaxOPS

Choisir une colonne

Choisir STATE ou FauxSTATE MixColumns AddRoundKey SubBytes AddRoundKey pour la colonne sélectionnée

Choisir la colonne suivante

Décrémenter i

i > 0 NON OUI

Le surcoût du shuffling dans le schéma proposé n’est pas présenté de manière isolée par les auteurs qui analysent le surcoût des contre-mesures combinées : masking et shuffling (randomisation et exécution d’instructions inutiles). Leur schéma est deux à trois fois plus lent, en nombre de cycles d’horloge, que des implantations d’AES non protégées [27]. Le fait de randomiser

l’exécu-tion seulement lors du premier et dernier tour, plutôt que sur l’ensemble du chiffrement, aide à atteindre ce résultat. La probabilité qu’une instruction se trouve à un certain endroit dans la trace est de p = 1/(16 + 4 × n), où n est le nombre de fausses colonnes pour lesquelles on exécute les opérations dans un ordre aléatoire. Ceci vient du fait qu’il existe (16 + 4 × n) possibilités pour exécuter une instruction. Il faut, en théorie, (16 + 4 × n)2 plus de traces, afin de mener à bien l’attaque [27, 45]. L’évaluation pratique des contre-mesures confirme les hypothèses théoriques.

Permutation Aléatoire

La permutation aléatoire (Random Permutation (RP) en anglais) des instruc-tions indépendantes est suggérée par Tillich, Herbst et Mangard [68], mais dans la pratique, les auteurs ont décidé de suivre la même approche en ma-tière de shuffling que Herbst, Oswald et Mangard dans [27], pour des raisons d’efficacité. Cette approche est également suggérée, et mise en pratique, par Rivain, Prouf et Doget dans [60], qui associent également un schéma de mas-king au shuffling, mais nous ne considérons ici que le schéma de shuffling. Dans les deux cas (suggestion de [68] et mise en pratique de [60]), les au-teurs proposent de mélanger l’ordre des opérations du même type entre elles, c’est-à-dire que lors de chaque addRoundKey, l’exécution de l’opération sur les 16 bytes de STATE se fera dans un ordre aléatoire. Ceci vaut également pour chaque opération subBytes. Pour ces deux opérations, il existe alors 16! possi-bilités différentes d’exécuter chaque addRoundKey ou chaque subBytes, dont on désire rendre l’exécution aléatoire (certains schémas ne faisant du shuffling que pour les premiers et derniers tours, à l’image de [27,68]). Les shiftRows et mixColumns shufflés ont, quant à eux, 24 (=4!) possibilités différentes d’exé-cutions.

L’indice de départ aléatoire et la permutation aléatoire d’instructions font tous les deux en sorte qu’un byte attaqué se retrouve à 16 endroits différents dans la trace, en supposant pour RP que l’on s’attaque au addRoundKey ou au sub-Bytes. En revanche, le nombre d’ordonnancements des opérations diffère lar-gement d’un schéma à l’autre : il existe 16 ordonnancements différents pour RSI (car l’indice de départ est pris aléatoirement et qu’ensuite les opérations sont réalisées dans un ordre séquentiel), alors qu’il existe 16! ordonnance-ments différents pour RP. Cette différence a son importance lorsque l’on désire réaliser des attaques d’ordre deux ou supérieur, la tâche étant plus ou moins compliquée selon le cas. En effet, pour RSI, on peut tirer parti du fait que les colonnes sont traitées séquentiellement, sans connaissance de la colonne initiale : dans la trace, et faisant la simplification que chaque opération fuite un point dans la trace, les informations relatives aux bytes d’une même ligne

sont facilement retrouvables, car il existe un décalage de quatre points entre un byte et le suivant sur la même ligne. On sait donc que les premiers, cin-quièmes, neuvièmes et treizièmes points d’une trace (de la partie relative à l’opération attaquée) appartiennent à la même ligne. Le même raisonnement se tient pour les autres bytes et les autres lignes. RP, de part la nature entiè-rement aléatoire de l’ordonnancement des opérations, ne permet pas ce genre de raccourci.

Définition 7 Une attaque d’ordre un est une attaque qui recherche une valeur

cible (donnée sensible) dans les traces. Une attaque d’ordre supérieur est une attaque qui vise plusieurs valeurs cibles dans les traces, l’ordre de l’attaque étant défini par le nombre de telles valeurs cibles.

Enfin, n’oublions pas que la génération des permutations et l’utilisation des nombres aléatoires, réalisées, a priori, sur le même appareil, engendrent éga-lement des fuites d’informations. Il est dés lors possible d’attaquer les nombres aléatoires et/ou les permutations, dans un premier temps, pour trouver des informations sur l’ordonnancement, avant d’attaquer ensuite les données sen-sibles en utilisant les informations récoltées au préalable (comme nous l’avons réalisé dans notre attaque [41], sur laquelle nous reviendrons en section 5.2). Il apparait évident que le shuffling seul ne suffit pas et qu’il doit être appliqué conjointement au masking comme réalisé, entre autres, dans [27, 68].