• Aucun résultat trouvé

5.4 Implantations et résultats expérimentaux

6.1.1 Unités arithmétiques dans le simulateur

Les nombres manipulés lors de calculs cryptographiques ont plusieurs centaines de bits. Les unités arithmétiques ne peuvent pas les traiter directement pour réaliser des opérations de corps tels que les additions (fadd) et les multiplications (fmul). Par conséquent, les nombres sont découpés en mots machine puis placés dans des registres afin de pouvoir appliquer dif- férents algorithmes de calcul (voir chap. 4). Deux classes, nommées register et fe_reg, sont créées afin de représenter ces registres. Ces classes permettent de stocker les mots machine et ainsi reproduire un comportement le plus réaliste possible.

Classes register et fe_reg

Les classes register et fe_reg sont deux structures qui représentent les mots machine. Elles correspondent respectivement à un mot machine de 32 bits et à un élément du corps (une suite de mots machine).

1. sage : a = ZZ.random_element(2∧256) /* Génération d’un a aléatoire */

2. sage : b = ZZ.random_element(2∧256) /* Génération d’un b aléatoire */

3. sage : fa = fe_reg(’a’,a); fb = fe_reg(’b’,b) /* Affectation de a et b à f a et f b */

4. sage : fa.fe_getValue() /* f a en mot de 32 bits */

[4196364204, 4267878292, 1417697047, 166754131, 1277453640, 2830927515, 114941018, 2033337000]

5. sage : fb.fe_getValue()

[1611638308, 3727385536, 3277129058, 3526737279, 2555186537, 1804422008, 1079871098, 491466816]

6. sage : fb[0].hw /* HW du 1er mot de f b */

12

7. sage : fb[0].bin

[0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0]

8. sage : fc = fe_reg(’c’,0)

9. sage : fc.fe_change(fb) /* Modification de f c et renvoie de la

distance de la HW */

[12, 16, 13, 21, 14, 17, 14, 11]

10. sage : fc.equal(fb) /* Test d’égalité */

True

FIGURE6.2 – Exemples de manipulations et d’opérations de fe_reg

Pour initialiser une variable de type register, le nom et la valeur de cette variable sont né- cessaires. Une fois initialisée, cette variable a pour attributs : son nom, sa valeur, son poids de Hamming (HW) et sa représentation binaire. Cette classe possède plusieurs fonctions, comme par exemple la fonction change qui permet de modifier la valeur d’un registre en comptant la variation du HW entre la valeur précédente et la nouvelle. Les autres fonctions de cette classe ne seront pas plus détaillées dans cette section. En effet, comme les nombres de grandes tailles nécessitent plusieurs mots et puisque la classe register ne représente qu’un mot, cette structure ne sera pas directement utilisée par l’utilisateur dans le simulateur.

La structure fe_reg représente un nombre complet (élément du corps) constitué de plu- sieurs mots machine en regroupant plusieurs variables de type register. Tous les nombres, utilisés dans le simulateur et ayant plus de 32 bits, seront placés dans des variables de type fe_reg. Ainsi, toutes les opérandes et toutes les variables intermédiaires seront elles aussi de ce type. La figure 6.2 récapitule des exemples simples, avec SageMath, de manipulation cette classe. Dans cette figure, trois variables de type fe_reg sont créées : fa, fa et fc. Les deux premières sont initialisées avec des nombres a et b générés aléatoirement avec SageMath. La troisième est quant à elle initialisée à 0. La classe fe_reg possède plusieurs fonctions, telle que la méthode fe_change, utilisée à la ligne 9 de la figure 6.2. Cette fonction copie la valeur de fb dans fc en retournant la variation du HW (comme ici f c = 0 cela retourne le HW de f b). Plusieurs autres fonctions sont implantées dans la classe fe_reg, telles que l’ajout d’un registre

avec add_reg ou encore un test d’égalité avec equal. Elles ne seront pas plus détaillées dans cette section.

Arithmétique

Les calculs lors d’une SM sont réalisés dans le corps fini Fp avec p un grand nombre pre- mier. Le simulateur peut être aisément étendu à d’autres types de corps finis. Le choix de ce corps fini est capital afin de définir le type d’algorithme utilisé pour les opérations de corps (voir chap. 4). En effet, certains corps permettent des réductions modulaires très peu coû- teuses (p. ex. lorsque p est un premier de forme pseudo-Mersenne). Cependant, ces réductions simples fonctionnent rarement pour des premiers quelconques.

Le corps de base choisi initialement pour le simulateur est le corps fini Fppour p un premier générique. Cela permet l’utilisation du simulateur pour plusieurs courbes différentes sur des corps ne nécessitant pas de propriétés particulières. Par conséquent, toutes les opérations sont implantées avec des algorithmes fonctionnant pour un corps quelconque. Toutefois, le corps Fp avec p = 2255− 19 est couramment utilisé pour les courbes de Bernstein. Ainsi, des opérations spécifiques à ce corps sont également implantées.

L’addition et la soustraction de deux grands nombres sont réalisées avec l’addition et la soustraction présentes dans le code source de µNaCl. Ces opérations sont initialement écrites en C pour un microcontrôleur 32 bits. Comme le simulateur ne manipule que des variables de type fe_reg ou register, elles furent modifiées afin de les adapter.

L’algorithme de Karatsuba (voir alg. 15) est implanté pour effectuer la multiplication entre deux grands nombres. Le résultat de la multiplication est ensuite réduit avec un algorithme de réduction modulaire. En fonction du corps de base choisi pour la simulation, cette réduction sera effectuée par l’algorithme qui correspond au premier utilisé.

Lorsqu’un corps générique est choisi, l’algorithme de réduction modulaire de Montgomery est appliqué. Cela implique que les nombres se trouvent dans le domaine de Montgomery et s’écrivent aR mod p avec R = βdoù d le nombre de chiffres de p en base β et β = 232dans notre cas d’étude. La conversion depuis et vers le domaine de Montgomery se fait seulement au début et à la fin des calculs, ce que est négligeable dans une SM complète. L’algorithme 19 décrit la multiplication modulaire, mot par mot, avec les méthodes de Karatsuba et de Montgo- mery.

Habituellement, lorsque le corps est défini par un p premier générique, la réduction n’est pas faite après la multiplication, comme c’est le cas ici. En effet, afin de ne pas faire doubler la taille du nombre, la multiplication et la réduction modulaire sont entrelacées dans le même temps avec la multiplication modulaire de Montgomery [89]. Pour simplifier, notre simulateur réalise, pour le moment, la multiplication puis la réduction modulaire dans le but de pouvoir utiliser des p premiers génériques mais aussi des p spécifiques. En effet, des corps spécifiques sont

Algorithme 19 : Multiplication et réduction modulaire

Entrées : a, b, p avec −p−1 mod βprécalculé, R = βdet β = 232 Résultat : s ≡ a × bR−1 mod pavec s < 2p

1 r ← Karatsuba(a,b) 2 pour i = 0 à d − 1 faire 3 qi← −rip−1mod β 4 r ← r + qipβi 5 s ← r R retourner s

utilisés pour plusieurs courbes courantes et/ou standardisées (p. ex. les courbes de Bernstein ou du NIST).

Lorsque le corps de base est Fpavec p = 2255−19, une réduction pour ce pseudo-Mersenne est appliquée. Cette réduction modulaire ne fonctionne que pour cette valeur. Toutefois, elle est très peu coûteuse (quelques additions) et ne nécessite pas de représentation particulière des nombres.