• Aucun résultat trouvé

Caractérisation et évaluation de l’encodage dynamique

4.5.1 Implémentation de l’encodage dynamique . . . 87 4.5.2 Coût d’implémentation de l’encodage dynamique . . . 90 4.5.3 Résistance aux attaques par canaux auxiliaires . . . 91

Les registres à décalage sont utilisés dans les implémentations de nombreuses primitives cryp- tographiques conçues pour des circuits contraints en énergie et en surface. Par exemple, plu- sieurs algorithmes légers de chiffrement par flot, dont Trivium [29] et Grain [31], sont construits à partir de registres à décalage à rétroaction non-linéaire. C’est également le cas de certains algo- rithmes de chiffrement par bloc tels que KATAN [157], ou encore de fonctions de hachage comme QUARK [158]. Dans toutes ces implémentations, la surface et la consommation dues à la logique combinatoire sont négligeables par rapport à celles des bascules constituant les registres à dé- calage ; par exemple, tandis que Trivium contient 288 bascules pour seulement 3 portes ET et 10 portes XOR, une bascule a une consommation 10,5 fois plus élevée qu’une porte ET et 6,7 plus élevée qu’une porte XOR dans le nœud technologique 0,18µm, selon [8]. Par conséquent, les at- taques matérielles par analyse des canaux auxiliaires effectuées contre ces algorithmes [159, 160, 72, 70, 71] visent uniquement la consommation des bascules, et négligent celle de la logique com- binatoire. De même, les attaques en fautes contre ces algorithmes considèrent que l’injection de fautes est réalisée dans les registres eux-mêmes [85, 86, 161, 162, 87]. Or, peu de contre-mesures efficaces contre l’un ou l’autre de ces types d’attaques ont été proposés à ce jour en tenant compte des spécificités des registres à décalage.

D’un autre côté, comme nous l’avons vu dans le chapitre 3, les contre-mesures mixtes, proté- geant l’implémentation d’un algorithme à la fois contre les attaques par analyse des canaux auxi- liaires et par injection de fautes, sont peu nombreuses, et leur implémentation est généralement très coûteuse, autant du point de vue de la surface qu’en ce qui concerne la consommation, le temps d’exécution et l’utilisation de bits aléatoires. De plus, ces contre-mesures couvrent unique- ment certains modèles de fautes, mais sont vulnérables quand les fautes sortent de ces modèles, ce qui est réalisable en pratique pour un attaquant connaissant ces protections. Par exemple, les contre-mesures mixtes fondées sur du masquage, présentées dans le chapitre 3, consistent à re- présenter les données protégées sur d parts, ou sur d chemins de données redondants. Ces contre- mesures ne permettent pas la détection de fautes injectées simultanément sur ces d chemins de données. Or, de telles fautes globales peuvent être injectées avec un faible coût, par exemple en altérant la tension d’alimentation ou la fréquence d’horloge.

Nous proposons donc une nouvelle contre-mesure, appelée encodage dynamique, permettant de contrer à la fois les attaques par injection de fautes et par analyse des canaux auxiliaires. Elle consiste en un lissage algorithmique de la consommation sans précharge, et elle peut être implé- mentée en utilisant un flot de conception standard. L’encodage dynamique permet une détec- tion intrinsèque des fautes, avec une meilleure couverture des fautes que d’autres contre-mesures mixtes. Cette protection présente une surface et une consommation plus faible que les contre- mesures mixtes existantes ; elle ne rallonge pas le temps d’exécution ; et elle ne nécessite pas, ou très peu selon les variantes, de bits aléatoires. Elle offre une protection efficace des registres à dé- calage, mais également de la logique combinatoire, et est donc particulièrement adaptée pour la protection d’algorithmes légers, tels que ceux cités plus haut, dans le cadre de l’IoT.

Dans un premier temps, les principes de l’encodage dynamique sont détaillés uniquement pour la protection de registres à décalages, dans un soucis de simplicité. Une analyse de la sécurité contre les attaques en fautes est fournie, et le rajout d’aléa afin de renforcer cette contre-mesure est proposé. L’extension de cet encodage dynamique à la logique combinatoire est ensuite discutée. Pour conclure, l’implémentation matérielle de plusieurs variantes de l’encodage dynamique est décrite, et une évaluation du coût d’implémentation et de la protection apportée par cette contre- mesure est effectuée.

4.1 Encodage dynamique des registres à décalage

On considère ici un registre à décalage non protégé, avec un état interne S de k bits, notés S1, . . . , Sk. À chaque cycle d’horloge, les bits de l’état interne sont décalés d’une position vers la sortie (c’est-à-dire vers la droite dans les figures présentées dans nos travaux), le registre prend un bit x en entrée, et produit un bit z en sortie.

Une manière d’assurer une consommation constante dans ce registre à décalage est de trans- former chaque bit Si de son état interne avec une fonctionF en un code de n bits noté F (Si), avec n > 1. Ces codes doivent respecter les propriétés suivantes :

Propriété 1 Chaque bit Side l’état interne doit être encodé avec le même poids de Hamming, noté

HW pour Hamming Weight : ∃C | ∀i ∈ {1,...,k}, HW(F (Si)) = C.

Propriété 2 Deux bits consécutifs de l’état interne doivent être encodés avec une distance de Ham-

ming constante, notée HD pour Hamming Distance :

∃C | ∀i ∈ {1, . . . , k − 1}, HD(F (Si),F (Si +1)) = HW(F (Si) + F (Si +1)) = C.

Cet encodage est mis en œuvre en appliquant la fonctionF au bit d’entrée x du registre à décalage à protéger, à chaque cycle d’horloge. De même, la fonction inverseF−1est appliqué à la sortie encodéeF (z) afin d’obtenir un bit de sortie z. Ainsi, pour un code F (x) de n bits, n registres à décalage en parallèle sont nécessaires pour contenir l’état interne encodé. Par la suite, nous notons part le contenu de chacun de ces registres à décalage parallèles, et un codeF (x) est donc décomposé en n parts. L’encodage dynamique sur n parts du i -ième bit de l’état interne est notéF (Si) = (S1i, . . . , Sni), avecF (Si) ∈ GF(2n) et Sij ∈ GF(2) pour i ∈ {1, . . . , k} et j ∈ {1, . . . , n}. On notera que ces parts ne doivent pas être confondues avec les parts d’un masquage algorithmique tel que décrit dans la section 3.4.2. Dans les deux cas, plusieurs bits sont utilisés par les contre- mesures pour représenter un seul bit non protégé, mais la façon de calculer ces parts est différente, l’encodage dynamique ne reposant pas sur le principe de partage de secret.

Un exemple d’encodage fréquemment utilisé est l’encodage différentiel, où un bit "0" est en- codé en "01" et un "1" en "10". Celui-ci assure un poids de Hamming constant pour chaque bit encodé, et donc pour l’ensemble des bits encodés de cette manière. Cependant, cet encodage re- quiert un autre mécanisme, telle qu’une précharge à "0" ou à "1", afin de garantir également une distance de Hamming constante ; c’est le principe de la logique différentielle avec précharge dé- crite dans le chapitre 3. Nous appellerons cette manière d’encoder les bits un encodage statique, car chaque bit est toujours encodé de la même manière.

Afin d’équilibrer à la fois le poids et la distance de Hamming sans nécessiter de précharge, l’encodage dynamique consiste à encoder différemment deux bits entrants x et y consécutifs. De cette manière, quels que soient x et y et même si ces deux bits sont identiques, les propriétés 1 et 2 peuvent être respectées.

Un tel encodage dynamique doit être effectué sur au minimum 4 bits, ce qui signifie que F (x) ∈ GF(2n), avec n ≥ 4. En effet, la propriété 2 implique que deux bits identiques consécutifs soient encodés différemment parF ; par conséquent, il existe au minimum deux codes différents pour représenter un "0", et deux autres codes pour représenter un "1". Ces quatre codes diffé- rents doivent tous avoir le même poids de Hamming d’après la propriété 1. Or, il y a au plus deux codes respectant cette propriété dans GF(22), i.e. {10,01}, et trois dans GF(23), ceux-ci étant soit {001,010,100}, soit {110,101,011}. Plusieurs encodages dynamiques valides existent dans GF(24). Par exemple, avec deux manières d’encoder respectivement les bits "0" et "1" parmi {0001, 0010, 0100, 1000}, et en alternant entre ces deux manières d’encoder ces bits, l’encodage dynamique respecte les propriétés 1 et 2. On appellera cet encodage un encodage 1-sur-4. De la même ma- nière, un encodage dynamique peut être réalisé en choisissant judicieusement quatre codes parmi {0011, 1100, 1001, 0110, 1010, 0101}, ce que nous appellerons un encodage 2-sur-4. Enfin, un enco-

dage 3-sur-4 est également possible, en inversant simplement les codes de l’encodage 1-sur-4 ; ces

deux approches étant identiques, nous ne détaillerons pas l’encodage 3-sur-4 par la suite.

Le reste de nos travaux porte sur un encodage dynamique dans GF(24), qui est le plus petit en- codage dynamique possible, et donc le plus léger en surface et en consommation. Pour les mêmes raisons, nous considérons seulement deux manières différentes d’encoder respectivement les bits "0" et "1", soit quatre codes en tout, ce qui est suffisant pour équilibrer le poids et la distance de Hamming. Bien que l’encodage dynamique puisse être réalisé dans GF(2n) avec n > 4, et que l’encodage 2-sur-4 dans GF(24) puisse être réalisé avec les six codes {0011, 1100, 1001, 0110, 1010,

TABLEAU4.1 – Principe de l’encodage dynamique d’un bit x.

Temps T Temps T+1 x = 1 1000 0100

x = 0 0010 0001

TABLEAU4.2 – Exemple de table d’encodage dynamique 1-sur-4 d’un bit x.

c = 0 c = 1 x = 1 1000 0100

x = 0 0010 0001

0101}, ces solutions n’apportent a priori pas de gain significatif vis-à-vis de la protection contre les attaques par analyse des canaux auxiliaires.

Un exemple d’encodage dynamique 1-sur-4 est représenté dans le tableau 4.1. Chaque bit est encodé de deux manières différentes, et l’encodage dynamique consiste à alterner à chaque cycle d’horloge entre ces deux manières, donc entre les deux colonnes aux temps T et T+1 (modulo 2).

Une manière d’alterner entre des deux colonnes est l’utilisation d’un signal de contrôle c al- ternant entre "0" et "1" à chaque cycle d’horloge. Un tel signal peut être généré facilement avec une bascule et un inverseur. Une autre manière serait l’usage d’une machine à états finis, qui sé- lectionnerait l’encodage au temps T+1 en fonction de l’encodage au temps T. Nous choisissons l’utilisation d’un signal de contrôle alternant entre "0" et "1", moins complexe à implémenter qu’une machine à états finis, et donc moins coûteux en surface et en consommation. En pratique, l’exemple d’encodage donné précédemment dans le tableau 4.1 est donc réalisé en utilisant un bit

c selon le tableau 4.2. De la même manière, le tableau 4.3 présente deux types d’encodage 2-sur-4

différents. Par la suite, nous appellerons table d’encodage un tel tableau.

La fonction d’encodage dynamiqueF prend donc deux entrées, i.e. un bit x à encoder et le signal de contrôle c, afin de générer un encodage dynamique de x. La fonction de décodageF−1, quant à elle, produit le même résultat pour les deux codes représentant le même bit x, quelle que soit la valeur de c. Il serait donc possible d’appliquer cette fonctionF−1uniquement au bit encodé F (x), indépendamment de c. Cependant, nous choisissons d’utiliser à la fois le bit encodé F (x) et le signal de contrôle c comme arguments de cette fonction afin d’assurer une meilleure détection des fautes, tel qu’expliqué dans la section 4.2. Comme c alterne entre "0" et "1", à chaque cycle d’horloge, cette fonctionF−1 dépend de la taille du registre à décalage, c’est-à-dire du nombre de bascules entreF et F−1. Si ce nombre est pair, le signal de contrôle c a la même valeur lors de l’encodage et du décodage d’un bit donné, et le décodage est donc effectué avecF−1(F (x),c).

Si ce nombre est impair, le signal c prend des valeurs complémentaires lors de l’encodage et du décodage de ce bit, et le décodage est donc effectué avecF−1(F (x),c). Par la suite, nous noterons les fonctions d’encodage et de décodageFc etFc−1, indépendamment de la taille du registre à décalage, afin d’alléger les notations. De plus, nous notons parité d’un codeFc(x) la valeur de c utilisée lors de l’encodage avecFcd’un bit x. Par exemple, en reprenant l’exemple du tableau 4.2, le code "1000" a une parité de "0" pour représenter le bit "1", tandis que le code "0100" a une parité de "1".

Avec l’encodage 1-sur-4, les bits "0" et "1" sont encodés chacun de deux manières différentes parmi les quatre codes {0001, 0010, 0100, 1000} ; toutes les permutations de ces encodages sont possibles afin de garantir un poids et une distance de Hamming constants. Il existe donc 4! = 24 encodages dynamiques 1-sur-4 différents. En ce qui concerne l’encodage dynamique 2-sur-4, il n’est pas possible de choisir toutes les combinaisons de quatre codes parmi {0011, 1100, 1001, 0110, 1010, 0101} tout en respectant la propriété 2. En effet, il existe trois paires de codes com- plémentaires parmi les six codes possibles : {0011, 1100}, {1001, 0110} et {1010, 0101}. La distance de Hamming est de 4 entre deux codes complémentaires, et de 2 entre deux codes non complé- mentaires. Comme il n’existe que 6 codes possibles pour l’encodage dynamique 2-sur-4, au moins deux codes parmi les 4 sélectionnés doivent être complémentaires. Afin de s’assurer que la dis-

TABLEAU4.3 – Deux exemples de tables d’encodage dynamique 2-sur-4 d’un bit x. (a) c = 0 c = 1 x = 1 1001 1010 x = 0 0110 0011 (b) c = 0 c = 1 x = 1 0101 0011 x = 0 1010 1100 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 F𝒄 F𝒄 −𝟏 Parité Registre non protégé Registre encodé 1 1 0 0 1 0 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 1 0 1 0 1 F𝒄 F𝒄 −𝟏

(a) Encodage 1-sur-4 (b) Encodage 2-sur-4

FIGURE4.1 – Exemples d’un état interne encodé avec un encodage dynamique 1-sur-4 et un encodage dy- namique 2-sur-4.

tance de Hamming soit toujours égale à 2, il est possible d’avoir deux codes complémentaires uniquement pour une même valeur de c, car deux bits consécutifs sont encodés avec des valeurs de c différentes. Au total, il existe 144 encodages dynamiques 2-sur-4 valides, dont deux exemples sont donnés dans les tableaux 4.3a et 4.3b.

Un exemple de registre à décalage non protégé avec un état interne arbitraire, et d’un registre à décalage avec le même état interne protégé avec un encodage dynamique 1-sur-4, est donné sur la figure 4.1. Cette figure présente également un exemple du même registre encodé avec un encodage 2-sur-4. De manière générale, un encodage dynamique 1-sur-4 d’un registre à décalage de longueur k a un poids de Hamming constant de k, et une distance de Hamming constante de 2k. Un encodage dynamique 2-sur-4 a toujours un poids de Hamming égal à 2k, et une distance de Hamming également égale à 2k.

4.2 Sécurité contre les attaques par injection de fautes

La détection de fautes avec l’encodage dynamique est effectuée lors du décodage avec la fonc- tionFc−1 en sortie du registre protégé. Lorsqu’un code ne peut pas être décodé par la fonction F−1

c , c’est-à-dire lorsqu’il n’est pas parmi les deux codes possibles pour une parité donnée, cela signifie qu’une faute a été injectée et la fonctionFc−1 envoie un signal d’alerte. Par la suite, on considère qu’une faute est injectée avec succès sur un registre à décalage si cette faute n’est pas détectée lors du décodage.

Cette section aborde la sécurité de l’encodage dynamique d’un registre à décalage contre les attaques par injection de fautes, selon plusieurs modèles de fautes et pour les encodages 1-sur-4 et 2-sur-4. On considère plusieurs types de fautes, listés ci-dessous et dont le détail est donné dans la section 3.3 :

— Les fautes en commutation au cours desquelles tous les bits ciblés changent de valeur, et les fautes consistant en une mise à "0" ou une mise à "1" d’un certain nombre de bits.

— Les fautes permanentes, et les fautes éphémères. On distingue notamment les fautes éphé-

mères en fonction de leur précision temporelle : celles-ci sont soit temporellement précises,

1

1

0

0

1

0

0

0

0

1

0

0

0

1

0

0

0

1 0

0

0

0

0

0

0 1

1

0

1

1

0

0

0

0

0

0

0

1

X X

0

1

F

𝒄

F

𝒄−𝟏 Parité Registre non protégé Registre encodé

FIGURE4.2 – Exemples de fautes injectées sur exactement deux parts parmi quatre, pour un encodage 1- sur-4.

— Les fautes sur un seul bit ou sur plusieurs bits consécutifs, au sein d’un même registre, c’est- à-dire d’une même part.

— Les fautes sur une seule part ou sur plusieurs parts, c’est-à-dire affectant simultanément soit un seul, soit plusieurs registres parmi les quatre registres en parallèle.

Dans un registre à décalage, l’état interne est décalé d’un bit à chaque cycle d’horloge. L’in- jection d’une faute temporellement imprécise sur une bascule, c’est-à-dire dont l’injection dure plusieurs cycles d’horloge, affectera donc tous les bits successivement stockés dans cette bascule durant toute la durée de l’injection. Par conséquent, une telle faute est fonctionnellement équiva- lente à une faute temporellement précise sur plusieurs bits consécutifs au sein d’un même registre, c’est-à-dire au sein d’une même part de l’encodage. Pour cette raison, la détection des fautes tem-

porellement précises et temporellement imprécises par l’encodage dynamique est similaire à la dé-

tection de fautes sur un seul bit ou sur plusieurs bits consécutifs au sein d’un même registre, et nous ne décrirons donc pas la détection des fautes en fonction de la précision spatiale de l’injection de ces fautes.

Pour les deux types d’encodage, une faute injectée avec succès doit résulter en un code ayant le même poids de Hamming que le code original, non fauté. Cela signifie qu’une commutation de "0" vers "1" doit être compensée par une commutation de "1" vers "0", et inversement. Par conséquent, les fautes consistant uniquement en une mise à "0" ou une mise à "1" de certains bits sont détectées parFc−1, et seules les fautes en commutation sur un nombre pair de bits peuvent être injectées avec succès.

4.2.1 Encodage 1-sur-4

Afin d’injecter avec succès une faute sur un bit encodé avec un encodage 1-sur-4, il faut faire commuter 2 parts exactement parmi les 4 parts : l’une doit commuter de "0" vers "1", et l’autre de "1" vers "0". Une telle faute est représentée en vert sur la figure 4.2. Toute faute affectant une seule part, ou trois ou quatre parts, résulterait en un état impossible à décoder parFc−1et serait donc détectée. De plus, l’attaquant doit savoir sur quelles parts injecter les fautes parmi les 4 parts pos- sibles ; il doit connaître pour cela l’encodage utilisé, mais également la valeur du signal de contrôle

c.

Comme c alterne entre "0" et "1" à chaque cycle d’horloge, l’injection de fautes avec succès sur deux codes consécutifs doit viser des parts différentes pour ces deux codes. Par conséquent, les fautes injectées sur deux bits consécutifs (ou plus) d’une même part, c’est-à-dire d’un même registre à décalage, sont détectées parFc−1. Nous illustrons ceci par un exemple, en nous appuyant sur l’encodage donné dans le tableau 4.2 et le registre encodé représenté sur la figure 4.1 ; cet

exemple peut être généralisé à tous les encodages dynamiques 1-sur-4, ceux-ci étant tous équi- valents. Dans cet exemple, un bit "1" peut être encodé par "1000" ou "0100" ; si la fonctionF−1

c ne prenait pas en compte le signal de contrôle c, ces codes seraient équivalents et interchangeables, et seraient donc décodés de la même manière. Dans ce cas, une faute injectée sur les troisième et quatrième bits de la seconde et de la troisième part, telle que représentée en rouge sur la figure 4.2, résulterait en un encodage valide. Or, si la fonctionFc−1prend bien c en argument, le code "0100" n’est pas permis lorsque c vaut "0". Cet état est donc détecté comme étant une faute, de même que le code "0010" lorsque c vaut "1".

4.2.2 Encodage 2-sur-4

Nous avons souligné précédemment que deux des quatre codes d’un encodage dynamique 2- sur-4 sont forcément complémentaires, et que ces deux codes complémentaires doivent encoder respectivement un "0" et un "1" pour une même parité, c’est-à-dire une même valeur de c. Deux cas se présentent alors pour les deux autres codes, pour l’autre valeur de c : ceux-ci peuvent être complémentaires également, ce qui correspond au cas du tableau 4.3b, ou non complémentaires comme dans le tableau 4.3a. L’injection de fautes dépend de ces deux cas, qui sont détaillés ci- dessous.

Cas 1 : la table d’encodage contient deux paires de codes complémentaires, pour les deux pa- rités. Quelle que soit la parité, les codes représentant un "0" et un "1" sont complémentaires. Par

conséquent, une injection de fautes avec succès revient à inverser tous les bits d’un ou plusieurs codes. Les fautes sur plusieurs bits consécutifs sont donc indétectables, du moment qu’elles af- fectent le même nombre de bits sur les 4 parts simultanément. La détection de fautes dans ce cas est moins robuste que celle décrite précédemment pour l’encodage 1-sur-4, et ce choix de codes pour un encodage 2-sur-4 doit donc être évité.

Cas 2 : la table d’encodage contient seulement une paire de codes complémentaires, pour une parité donnée. Dans ce cas, l’injection de fautes avec succès sur les deux codes complémen-

taires doit se faire sur les quatre parts de ces codes. L’injection de fautes sur les deux autres codes,