• Aucun résultat trouvé

Require: A, avec A = (an−1, . . . , a0)2w et 0 ≤ ai < 2w où w est la taille d’un mot machine, N′= −N−1 mod 2w. Ensure: X ≡ A2× 2−wn mod N et X < N 1: A′ ← A + A 2: Ae0 ← (a′n−1, . . . , a′2, |2a1|2w, a0)2w 3: X ← eA0· a0 4: q ← |X|2w · N′ mod 2w 5: X ← (X + q · N)/2w 6: for i = 1 to (n − 1) do

7: Aei ← (a′n−1, . . . , a′i+2, |2ai+1|2w, ai)2w 8: X ← X + eAi· ai· 2wi 9: q ← |X|2w · N′ mod 2w 10: X ← (X + q · N)/2w 11: end for 12: if X > N then 13: X ← X − N 14: end if 15: return X

Opérations # ADD # MUL

étape 1 A + A n - étape 2 |2a1|2w 1 - étape 3 Ae0· a0 n n étape 4 |X|2w· N′ - 1 étape 5 q × N n n X + (qN ) n + 1 -

n − 1 étapes 7 |2ai+1|2w n − 1 -

n − 1 étapes 8 X + eAi· ai· 2wi (n − 1)(n + 1) n(n−1)2 n − 1 étapes 9 |X|2w· N′ - n − 1 n − 1 étapes 10 q × N (n − 1)n (n − 1)n X + (qN ) (n − 1)(n + 1) - étape 13 X − N n 0 Total 3n2+ 5n − 1 3n2 2 + 3n 2 TABLE1.6 – Complexité de l’algorithme 1.9 (MontSq)

Opération # ADD # MUL smallRed(Algo. 1.7)

max(n′, n + 1) + n n + 1 entrée de taille n′-mots

MontMul(Algo. 1.8) 4n2+ 2n − 1 2n2+ n

MontSq(Algo. 1.9) 3n2+ 5n − 1 3n22 +3n2

TABLE1.7 – Complexité de smallRed, multiplication et carré de Montgomery.

1.1.3.4 Réduction modulaire dans le cas particulier des modules premiers de Mersennes et variantes

La multiplication modulaire de Montgomery que nous venons de voir avait pour objet d’accélérer les calculs pour un module quelconque, sans propriétés particulières. Cependant, dans le cas où nous avons un module qui peut être choisi librement, la réduction modulaire peut tirer avantage d’une forme particulière de ce nombre, notamment si ce nombre a une représentation binaire creuse (comportant une grande proportion de zéros). Dans certaines applications, on choisit alors pour ce module un nombre premier présentant cette caractéris- tique. C’est le cas des nombres de Mersenne, pseudo-Mersenne ou Mersenne généralisés. On rappelle ici ce que sont ces nombres :

— un nombre premier de Mersenne est de la forme 2k− 1 ;

— un nombre premier pseudo-Mersenne est de la forme 2k− c, c ∈ N, c petit ;

— un nombre premier de Mersenne généralisé est de la forme Pni2nik, k la taille d’un mot, nmaxkla taille du nombre premier.

1.1.3.4.1 Nombres premiers de Mersenne

La réduction modulaire d’un entier A par un nombre de Mersenne p = 2k− 1 peut être

calculée très rapidement de la façon suivante : on écrit

A = AH· 2k+ AL,

puis, on tire parti de ce que 2k≡ 1 mod p par définition de p en récrivant A comme suit :

A mod p ≡ AH + ALmod p.

Ainsi, dans le cas d’un nombre premier de Mersenne, la réduction modulaire se résume à une addition modulaire. Le seul inconvénient, c’est que les nombres de Mersenne premiers sont peu nombreux. Le NIST, dans ses préconisations, en retient un : P 521 = 2521− 1.

1.1.3.4.2 Nombres premiers pseudo-Mersenne

Dans le cas d’un pseudo-Mersenne, la liberté donnée par c permet de trouver de nombreux nombres premiers candidats. On a maintenant pour p = 2k− c la relation 2k ≡ c mod p. La

réduction modulaire se calcule alors :

Dans la littérature, certains auteurs utilisent de tels nombres, comme par exemple Bernstein dans [8]. Il présente une implantation logicielle de calculs sur courbe elliptique sur Fp avec

p = 2255− 19.

1.1.3.4.3 Nombres premiers Mersenne généralisés

Pour ce qui concerne les nombres de Mersenne généralisés, Solinas dans [60] donne des algorithmes repris dans les normes et préconisations du NIST. En effet, le NIST fournit les nombres premiers suivants pour usages cryptographiques dans le cas des protocoles basés sur les courbes elliptiques :

→ P 192 = 2192− 264− 1 ;

→ P 224 = 2224− 296+ 1;

→ P 256 = 2256− 2224+ 2192+ 296− 1 ; → P 384 = 2384− 2128− 296+ 232− 1 ;

→ P 521 = 2521− 1 (déjà mentionné, c’est un nombre de Mersenne.)

L’idée de Solinas est de tirer parti de la forme particulière de ces nombres. Par exemple, il remarque que pour les nombres de la forme p = 23k − 2k+ 1, on peut représenter un entier

A < p2de taille 6k-bits comme suit :

A = 5 X j=0 Aj· 2jk avec 0 ≤ Aj < 2k. On pose maintenant 5 X j=0 Aj· 2jk≡ 2 X j=0 Bj · 2jkmod p.

Les congruences modulo p suivantes sont valides :

23k ≡ −1 + 2k modp, 24k ≡ −2k+ 22k modp, 25k ≡ −1 + 2k− 22k modp, ou encore A323k ≡ −A3+ 2kA3 modp, A424k ≡ −2kA4+ 22kA4 modp, A525k ≡ −A5+ 2kA5− 22kA5 modp.

On tire de ce qui précède

B0 = A0− A3− A5

B1 = A1+ A3− A4+ A5

B2 = A2+ A4− A5.

L’entier du NIST P 224 suit cette forme. Solinas dans [60] fournit des algorithmes analogues pour les autres nombres premiers du NIST.

En conclusion de cette section, nous insistons sur le faible coût de la réduction modulaire dans le cas particulier des modules choisis pour la cryptographie sur courbe elliptique. Les méthodes disponibles sont bien plus rapides que les algorithmes génériques et se résument à un certain nombre de décalages, additions ou soustractions modulaires, ou multiplications faisant intervenir de petites opérandes.

1.1.4 Inversion modulaire

Dans cette section, on considère un élement A non nul du corps Fp. L’inversion d’un élé-

ment A de Fpconsiste à calculer son inverse A′, tel que :

A · A′ ≡ 1 mod p.

En général, A′ est noté A−1. Nous présentons ci-après deux algorithmes pour le calcul de l’in-

verse modulo p : l’algorithme d’Euclide étendu (Extended Euclidean Algorithm), et une méthode basée sur le petit théorème de Fermat.

1.1.4.1 Inversion dans Fpbasée sur l’algorithme d’Euclide étendu

Soit A et p deux entiers non nuls. Le plus grand commun diviseur (pgcd) de A et p est le plus grand entier d qui divise à la fois A et p. Le lemme suivant permet de construire des algorithmes efficaces de calcul du pgcd.

Lemme 1.1.2. Soit A et p deux entiers positifs non nuls. Pour tout entier c, on a

pgcd(A, p) = pgcd(p − cA, A).

Dans l’algorithme d’Euclide, le pgcd des entiers positifs A et p avec p ≥ A est calculé par une suite de divisions. On commence par diviser p par A, et on obtient un quotient q et un reste Rtels que p = qA + R avec 0 ≤ R < A. Par le lemme 1.1.2, on a pgcd(A, p) = pgcd(R, A). Ceci réduit le problème du calcul du pgcd de A et p par celui du calcul du pgcd de R et A qui sont plus petits que les paramètres initiaux. On répète ces opérations jusqu’à obtenir pgcd(0, d) = d. L’algorithme termine forcément dans la mesure où pour des arguments positifs, la suite des restes est strictement décroissante. Cet algorithme est efficace car le nombre de divisions est au plus deux fois la longueur de la représentation binaire de A (voir [28], chapitre 2, pages 40 et suivantes).

Cet algorithme d’Euclide peut être étendu pour déterminer deux entiers X et Y tels que AX + pY = pgcd(A, p). Si p est un nombre premier (ou plus généralement, si A et p sont premiers entre eux), on a pgcd(A, p) = 1, et ceci implique que AX ≡ 1 mod p, et X est l’inverse de A modulo p. C’est ainsi que l’algorithme 1.10 calcule l’inverse de A en calculant le pgcd de Aet p. Posons

AX1+ pY1 = uet AX2+ pY2= vavec u ≤ v.

Les valeurs Y1 et Y2 ne sont pas utiles, nous ne les calculerons donc pas. On prend pour

valeurs initiales u = A et v = p. Ceci correspond à X1 = 1, X2 = 0.

La suite des divisions de v par u permet d’obtenir la suite correspondante des entiers X1

et X2. À chaque tour de boucle, on met à jour les valeurs en prenant u pour v et le reste de

la division ⌊v/u⌋ pour u. On arrête l’algorithme quand u = 1, et la dernière valeur de X1 est

l’inverse de A modulo p.

1.1.4.2 Petit théorème de Fermat

Un autre algorithme peut être utilisé. Il tire parti du petit théorème de Fermat (théo- rème 1.1.1), et calcule l’inverse comme une exponentiation modulaire.

Théorème 1.1.1. Soit A, p ∈ N tels que p est un nombre premier et A n’est pas divisible par p, alors

Algorithme 1.10 Inversion dans Fpbasée sur l’algorithme d’Euclide étendu