Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Université de Rouen
Master 2 ITA
Cryptographie
2004-2005
Courbes Elliptiques
Implémentation de la Signature Électronique
Samuel G RAU
<samuel.grau@club-internet.fr>
Table des matières
Introduction 4
1 Corps Finis 5
1.1 A la recherche de Corps Finis . . . . . . . . . . . . . . . . . . . . 5
1.1.1 Opérations sur les corps . . . . . . . . . . . . . . . . . . 6
1.1.2 Existence et unicité . . . . . . . . . . . . . . . . . . . . . 6
1.1.3 Corps binaires . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Opérations sur les corps binaires . . . . . . . . . . . . . . . . . . 8
3 ECDSA 17
3.1 Elliptic Curve Discrete Logarithm Problem . . . . . . . . . . . . 17
3.2 Génération de clefs . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3 Schéma de signature . . . . . . . . . . . . . . . . . . . . . . . . 20
3.4 ECDSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4 Implémentation et Optimisations 23
4.1 Structures de données . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1.1 Description des classes . . . . . . . . . . . . . . . . . . . 23
4.2 Optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.1 Coordonnées projectives . . . . . . . . . . . . . . . . . . 26
4.2.2 Multiplication de points inconnus . . . . . . . . . . . . . 28
4.2.3 Représentation Non Adjacent Form (NAF) . . . . . . . . 29
2
Conclusion 32
A Manuel 34
A.1 Installation et compilation . . . . . . . . . . . . . . . . . . . . . 34
A.1.1 Compilation . . . . . . . . . . . . . . . . . . . . . . . . 34
A.1.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . 34
A.2 Utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3
Introduction
4
C HAPITRE 1
Corps Finis
Notre étude commence donc par celle du support des courbes el-
liptiques. L’implémentation efficace des corps finis devient donc un point
très important dans l’étude des courbes elliptiques car un grand nombre
d’opérations y seront réalisées. Il existe trois grands types de corps finis
qui sont utilisables pour l’implémentation de la cryptographie par courbes
elliptiques. Il s’agit des corps premiers, des corps binaires et des corps
d’extension optimaux.
5
Nous allons présenter brièvement quelques propriétés et opérations sur les
corps finis. Les corps premiers, bien qu’importants seront moins détaillés que les
corps binaires, ceux-ci offrant comme nous l’avons déjà dit, de bien meilleurs per-
formances.
Nous verrons par la suite qu’il ne nous sera pas utile de mettre en oeuvre toutes
les opérations sur les corps. Pour cela, nous utiliserons une bibliothèque permettant
de faire de la théorie des nombres, qui se nomme NTL et dont nous détaillerons les
possibilités offertes par la suite.
6
Un polynôme binaire irréductible f (z) de degré m est choisi. Un tel polynôme
existe pour tout m et peut-être efficacement trouvé. L’irréductibilité de f (z) signifie
en fait que f (z) ne peut pas être factorisé comme un produit de polynômes binaires,
chacun de degré inférieur à m. Autrement dit, contrairement aux corps premier, ici
ce n’est pas la caractéristique mais le polynôme qui joue le rôle de nombre premier.
Son irréductibilité le place à la même position.
L’addition des éléments du corps est l’addition usuelle des polynômes, où est
utilisée l’arithmétique modulo 2 des coefficients. La multiplication des éléments
du corps est réalisée modulo le polynôme de réduction f (z). Pour tout polynôme
binaire a(z), a(z) mod f (z) doit représenter l’unique polynôme résiduel r(z) de
degré inférieur ou égal à m, obtenu après une longue division de a(z) par f (z) ;
cette opération est appelée réduction modulo f (z).
Exemple 1.1.1 (Corps binaire F24 ). Les éléments de F24 sont les 16 polynômes
binaires de degré au plus 3 :
0 z2 z3 z3 + z2
1 z2 + 1 z3 + 1 z3 + z2 + 1
z z2 + z z3 + z z3 + z2 + z
z+1 z2 + z + 1 z3 + z + 1 z3 + z2 + z + 1
Ce qui suit est un ensemble d’exemple d’opérations arithmétiques opérées sur
le corps binaire F24 en utilisant le polynôme f (z) = z4 + z + 1 comme polynôme de
réduction.
(i) Addition :
(z3 + z2 + 1) + (z2 + z + 1) = z3 + z
(ii) Soustraction :
(z3 + z2 + 1) − (z2 + z + 1) = z3 + z
On peut remarquer que puisque −1 = 1 dans F2 , on a −a = a pour tout
a ∈ F 2m .
(iii) Multiplication :
(z3 + z2 + 1) · (z2 + z + 1) = z2 + 1
puisque
(z3 + z2 + 1) · (z2 + z + 1) = z5 + z + 1
et que
(z5 + z + 1) mod (z4 + z + 1) = z2 + 1
(iv) Inversion :
(z3 + z2 + 1)−1 = z2
puisque
(z3 + z2 + 1) · z2 mod (z4 + z + 1) = 1
7
1.2. Opérations sur les corps binaires
L’implémentation des opérations sur les corps binaires demande un grand jeu
de fonction, allant de la représentation et des opérations de base sur le corps à des
fonctions bien plus complexes.
Cette bibliothèque nous offrira donc tous les outils nécessaires afin de réaliser
des additions, multiplications, inversions ou toute autre opération qui pourrait être
utile à l’implémentation d’un programme de chiffrement de signature électronique
pour les courbes elliptiques.
8
C HAPITRE 2
Après une petite mise en bouche, nous verrons comment passer d’un
point à un autre sur une courbe et les possibilités de calculs qui nous sont
offertes. Ces possibilités sont l’addition, la multiplication par un scalaire, le
calcul de l’opposé d’un point d’une courbe et le calcul du point à l’infini.
Définition 2.1.1. Une courbe elliptique E sur un corps K est définie par une
équation de la forme :
E : y2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6 (2.1)
Si L est est une extension du corps K, alors l’ensemble des points L-rationnels
de E est l’ensemble suivant où ∞ est le point à l’infini :
9
E(L) = (x, y) ∈ L2 | y2 + a1 xy + a3 y − x3 − a2 x2 − a4 x − a6 = 0 ∪ {∞}
Nous pourrions apporter les remarques suivantes. En fait, l’équation (2.1) est
appelée une équation de Weierstrass. On dit que E est défini sur K pour la rai-
son que les coefficients a1 , a2 , a3 , a4 , a5 , a6 qui définissent cette équation sont des
éléments de K. Nous pouvons aussi ajouter que le faite que ∆ 6= 0 assure que la
courbe obtenue est « lisse ». Ceci étant, la courbe ne possédant aucun point ayant
deux ou plus de tangentes. Le point ∞ est le seul point de la courbe à l’infini qui
satisfait la forme projective de l’équation de Weierstrass.
y
4
y
2
2
1
0 2 x −1 0 1 2 x
−1
−2
−2
(a) E1 : y2 = x3 − x (b) E2 : y2 = x3 + 14 x + 54
Exemple Nous pouvons alors prendre l’exemple des courbes elliptiques sur R en
considérant les deux courbes suivantes :
E1 : y2 = x3 − x
1 5
E2 : y2 = x3 + x +
4 4
définies sur le corps des nombres réels R. Les points E1 (R)\{∞} et E2 (R)\{∞}
sont affichés Figure 2.1.
10
E1 : y2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6
E2 : y2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6
sont dites isomorphes sur K si il existe u, r, s,t ∈ K avec u 6= 0 tel que le chan-
gement de variables
(x, y) 7→ u2 x + r, u3 y + u2 sx + t
transforme E en la courbe
y2 + xy = x3 + ax2 + b
où a, b ∈ K. Une telle courbe est dite non-supersingulière et possède un discrimi-
nant ∆ = b. Si a1 = 0, alors, le changement admissible de variables
(x, y) 7→ (x + a2 , y)
transforme E en la courbe
y2 + cy = x3 + ax2 + b
Une telle courbe est dite supersingulière et possède un discriminant ∆ = a4 .
11
2.2. Loi de groupe
Nous venons de voir que l’équation de Weierstrass peut-être agréablement sim-
plifiée pour l’utilisation d’un corps binaire. Mais à quoi cela va-t-il bien pouvoir
nous servir si nous ne sommes pas en mesure d’effectuer des opérations sur cette
courbe ? Nous allons donc traiter la mécanique des éléments des courbes ainsi
considérées.
Soit E une courbe elliptique définie sur K. Il existe une règle corde-et-tangente
pour additionner deux points de E(K) pour donner un troisième point appartenant,
lui aussi à E(K). Du coup, nous « fermons » la courbe. En effet, E(K) forme alors
un groupe abélien avec ∞ servant d’élément neutre. C’est ce groupe que nous uti-
liserons pour construire le système cryptographique basé sur courbes elliptiques.
y y
Q = (x2 , y2 ) P = (x1 , y1 )
0 x 0 x
P = (x1 , y1 )
R = (x3 , y3 ) R = (x3 , y3 )
12
Sachant que nous savons maintenant sur quel type support vont reposer nos
courbes et par conséquent, tout notre système cryptographique, intéressons-nous
aux moyen de les mettre en œuvre.
13
2.3.1 Algorithmes de base d’addition, négation et doublement
Bien que ces algorithmes soient très simples à utiliser et à implémenter, nous
les présentons afin de montrer que lorsque nous arriverons dans la section 4.2 les
gains en temps de calculs seront plus visibles.
y3 ← λ (x1 + x3 ) + x3 + y1 ;
retourner (x3 , y3 );
fin
Avant de conclure par l’algorithme général d’addition évitant les cas que nous
dirons, problématiques, nous voyons l’algorithme le plus simple. Il s’agit de celui
de la négation d’un point P de E(F2m ).
14
F IG . 2.5 : Négation d’un point
Entrées : P(x1 , y1 ) ∈ E(F2m ).
Sorties : −P ∈ E(F2m ).
début
x1 ← x1 ;
y1 ← x1 + y1 ;
retourner (x1 , y1 );
fin
Il ne nous reste plus qu’à combiner ces algorithmes en gérant les cas particu-
liers afin de bien composer les calculs et éviter les calculs inutiles envoyant les
points à l’infini ou hors de la courbe.
Ce sont donc deux algorithmes simples que nous allons voir. Ces algorithmes
15
ne sont que les représentations additives des algorithmes utilisés pour l’exponen-
tiation. L’algorithme Fig. 2.7 effectue l’opération en traitant les bits de k de gauche
à droite alors que l’algorithme Fig. 2.8 les traite de droite à gauche.
L’intérêt des deux méthodes est certains et nous verrons les complexités résul-
tantes ainsi que les résultats de performance obtenus en section 4.2.
16
C HAPITRE 3
ECDSA
Définir un support mathématique basé sur les corps fini est une chose,
mais définir l’objet qui reposera sur ce support en est une bien plus im-
portante. C’est donc dans ce chapitre que nous introduirons de nouvelles
notions qui permettrons de finaliser la mise en place de ce système cryp-
tographique basé sur les courbes elliptiques.
Définition 3.1.1 (ECDLP). Étant donné une courbe elliptique E définie sur le
corps fini Fq , un point P ∈ E(Fq ) d’ordre n et un point Q ∈ hPi, trouver l’en-
tier l ∈ [0, n − 1] tel que Q = lP. L’entier l est appelé le logarithme discret de Q
en base P, noté l = logP Q.
Le fait que ce problème soit si difficile nous assure la sécurité attendue. Il faut
pour cela que les paramètres des courbes elliptiques pour les schémas cryptogra-
phiques soient judicieusement choisis afin de résister à toutes les attaques connues
sur l’ECDLP.
17
L’algorithme le plus naı̈f est une recherche exhaustive de Q en calculant les va-
leurs successives P, 2P, 3P, 4P . . . jusqu’à ce qu’il soit rencontré. Avec la puissance
de calcul des ordinateurs actuels, le problème reste cependant infaisable dans le
temps.
Le problème est que grand nombre d’études ont eu lieu et certaines ont donné
de bons résultats. C’est pourquoi, nous devons absolument choisir des paramètres
pour la courbe qui puissent résister à toutes ces attaques. Nous allons voir dans
ce qui suit comment choisir ces paramètres. Pour un gain de temps, nous utilise-
rons des paramètres recommandés par le NIST (National Institute of Standards and
Technology).
Cette utilisation nous permet d’éviter d’avoir à générer par nous même des
paramètres de domaines ainsi que les algorithmes permettant leur validation. Nous
allons tout de même nous intéresser aux paramètres de domaine en donnant la
définition qui nous sera utile par la suite. Cette définition est des plus formelle et
nous n’utiliserons pas la totalité de ce qu’elle définie dans notre implémentation du
système cryptographique.
Définition 3.1.2 (Paramètres de domaines). Les paramètres de domaine D tels que
D = (q, FR, S, a, b, P, n, h) sont composés de :
1. L’ordre du corps q.
2. Une indication FR (représentation du corps) sur la représentation utilisée
pour les éléments de Fq .
3. Une graine S si la courbe elliptique a été générée aléatoirement.
4. Deux coefficients a, b ∈ Fq qui définissent l’équation de la courbe elliptique
E sur Fq (i.e., y2 = x3 + ax + b dans le cas d’un corps premier ou d’extension
optimal, et y2 + xy = x3 + ax3 + b dans le cas d’un corps binaire).
5. Deux éléments du corps xP et yP dans Fq qui définissent un point fini P =
(xP , yP ) ∈ E(Fq ) en coordonnées affines. P a un ordre premier et est appelé
le point de base.
6. L’ordre n de P.
7. Le cofacteur h = card(E(Fq ))/n.
18
clef privée correspondante est d = logP Q. L’entité A qui génère le couple de clefs
doit être assuré que les paramètres de domaine sont valides. De plus, l’association
de paramètres de domaines et d’une clef publique doit être vérifiable par toutes les
entités qui pourraient, plus tard, être amener à utiliser la clef publique de l’entité
A. En pratique, cette association peut être obtenue à l’aide de moyens cryptogra-
phiques (e.g., l’autorité de certification génère un certificat qui atteste cette asso-
ciation) ou selon le contexte (e.g., toutes les entités utilisent les mêmes paramètres
de domaine).
19
3.3. Schéma de signature
Les schémas de signature ne sont rien d’autre que l’équivalent électronique de
la signature manuscrite. Il est possible d’en faire usage afin d’authentifier l’origine
ou l’intégrité des données. Les schémas de signature sont communément utilisées
par des autorités de confiance afin de signer des certificats qui relient entre eux,
une entité et sa clef public.
20
3.4. ECDSA
Nous venons de définir tout ce qui était nécessaire à la réalisation de base d’un
système de signature électronique, le système même mis à part. C’est donc ici, que
nous allons commencer réellement à nous amuser.
21
F IG . 3.4 : Vérification de signature ECDSA.
Entrées : Paramètres de domaine D = (q, FR, S, a, b, P, n, h), une clef
publique Q, un message m, une signature (r, s).
Sorties : Acceptation ou rejet de la signature.
début
si (r 6∈ [1, n − 1]) ou (s 6∈ [1, n − 1]) alors
retourner « Rejet de la signature »;
finsi
Calculer e = H(m);
Calculer w = s−1 mod n;
Calculer u1 = ew mod n;
Calculer u2 = rw mod n;
Calculer X = u1 P + u2 Q;
si X = ∞ alors
retourner « Rejet de la signature »;
finsi
Convertir la coordonnée x1 de X en un entier x1 ;
Calculer v = x1 mod n;
si v = r alors
retourner « Acceptation de la signature »;
sinon
retourner « Rejet de la signature »;
finsi
fin
Nous allons maintenant expliquer dans le chapitre suivant comment toutes ces
notions ont pu être mise en œuvre afin de réaliser l’implémentation du schéma de
signature ECDSA.
22
C HAPITRE 4
Implémentation et Optimisations
Nous y voilà enfin. Que peuvent bien donner, une fois implémentées,
toutes ces notions que nous venons d’étaler. Nous allons présenter dans
ce chapitre les choix que nous avons faits concernant les structures de
données utilisées pour l’implémentation. Ensuite, nous traiterons du choix
de la ou les courbes utilisées. Comme nous l’avons vu précédemment,
le choix d’une fonction de hachage fut faite de manière à ce qu’elle ne
soient pas faible face aux attaques. Enfin, nous étudierons les gains de
performances que nous avons pu obtenir durant toute l’implémentation au
travers de l’utilisation de coordonnées projectives ou de représentations
particulières.
23
que fixer les paramètres de domaine de la courbe elliptique de Köblitz K-163. Les
paramètres que nous fixons pour l’utilisation de la courbe K-163 sont présentés
Fig. 4.1.
m = 163
f (z) = z163 + z7 + z6 + z3 + 1
a = 1
b = 1
h = 2
n = 0x 00000004 00000000 00000000 00020108 A2E0CC0D 99F8A5EF
Nous pouvons aussi jeter un oeil à la courbe K-233 dont les paramètres sont
aussi fournis. A terme, cette classe devrait être dans la mesure de générer les pa-
ramètres pour toutes les courbes recommandées par le NIST ainsi que de les générer
par elle même.
m = 233
f (z) = z233 + z7 4 + 1
a = 0
b = 1
h = 4
n = 0x 00000080 00000000 00000000 00000000 00069D5B B915BCD4 6EFB1AD5 F173ABDF
ECSignature
Ensuite, nous avons la classe qui s’occupe de maintenir les informations con-
cernant la signature d’un message m par les valeurs r et s. Cette classe n’est autre
qu’une classe de stockage permettant l’échange de données entre les fonctions de
génération et de vérification de signature de ECDSA.
ECBFEquation
Une autre classe très simple est la classe ECBFEquation qui va maintenir les
informations concernant les coefficients a et b de la courbe elliptique. Ces coeffi-
cients sont très souvent sollicités tout au long de la génération ou de la vérification
24
de signature car elle intervient dans chaque multiplication et par conséquent, dans
chaque addition de points dans F2m . C’est pourquoi les méthodes sont inline afin
de gagner quelques petits temps de calcul.
ECMessage
Toujours dans le même genre de classes, petites mais très utiles, voici la classe
ECMessage. Celle-ci aura pour rôle la gestion des messages, à savoir, pointer aussi
bien sur des chaı̂nes de caractères que sur des fichiers. De plus c’est elle qui aura
comme charge le hachage du message.
ECKeyPair
Au chapitre 3, nous avons vu comment il était possible de générer un couple
de clefs, publique et privé (Q, d). Cette classe s’occupe de réaliser ces opérations à
l’aide de deux méthodes principales qui prennent comme paramètre, hé bien. . . des
paramètre de domaine D représentés par la classe ECDomainParameters :
Nous arrivons désormais aux deux classes les plus importantes de ce pro-
gramme. Il s’agit des classes ECDSA et ECPoint que nous allons présenter d’ici
peu.
Remarque 4.1.1. Il reste tout de même deux classes qui ne sont pas présentées ici.
Elles le seront dans la partie réservée aux optimisations car celles-ci apporte des
améliorations notables de performance au programme et au calculs effectués sur
les courbes elliptiques E(F2m ).
25
ECPoint
La classe ECPoint à pour rôle la représentation d’un point P = (x, y) de la
courbe elliptique E(F2m ) en coordonnées affines. En utilisant de manière habile la
surcharge des opérateurs du langage C++, nous offrons ainsi un code source facile
et agréable à lire.
ECDSA
La classe ECDSA quand à elle est très succincte. Elle s’occupe uniquement de
réaliser les opérations de génération et de vérification de signature ECDSA. Elle
implémente en fait l’ensemble de tout ce que nous avons pu étayer depuis le début
de ce papier. Du coup, elle devient très simple d’utilisation. Il suffit de donner au
constructeur, un domaine D de paramètres pour la courbe à utiliser, la clef privée
d et le message m à signer et elle s’occupe alors de calculer le tout pour nous
redonner en sortie la jolie signature de 163 bits (dans notre cas). Il nous est alors
enfin possible de vérifier l’authenticité de la signature.
4.2. Optimisations
Maintenant que nous sommes en présence d’un programme fonctionnel que
nous dirons naı̈f, implémentant le schéma de signature électronique ECDSA, nous
pouvons désormais porter notre attention sur les optimisations possibles, si elles
existent, des calculs effectuer. Il en existe bel et bien et nous allons exposer les
deux principales optimisations obtenues pour ces calculs.
26
Les courbes que nous étudions depuis le début de ce papier sont de la forme
y2 + xy = x3 + ax2 + b. Il existe différents systèmes de coordonnées permettant une
représentation projective des points pour les courbes non supersingulières de la
forme
E : y2 + xy = x3 + ax2 + b
définies sur la corps binaire K. Parmis ces différents types de coordonnées projec-
tives qui ont été proposées, nous pouvons retrouver les systèmes suivants :
Le système de coordonnées considéré dans notre cas est donc celui de López-
Dahab (LD). Dans ce cas, c = 1 et d = 2. Le point projectif (X : Y : Z) avec
Z 6= 0 correspond au point affine (X/Z, Y /Z 2 ). L’équation projective de la courbe
elliptique est
Y 2 + XY Z = X 3 Z + aX 2 Z 2 + bZ 4 .
Le point infini ∞ correspond au point (1 : 0 : 0), alors que le négatif de (X : Y : Z)
est (X : X + Y : Z). Les formules permettant de calculer le double (X3 : Y3 : Z3 )
du point (X1 : Y1 : Z1 ) sont :
Z3 ← X12 · Z12
X3 ← X14 · bZ14
Y3 ← bZ14 · Z3 + X3 · aZ3 +Y12 + bZ14
27
Les formules permettant de calculer la somme (X3 : Y3 : Z3 ) des points (X1 : Y1 :
Z1 ) et (X2 : Y2 : 1) sont :
A ← Y2 · Z12 +Y1
B ← X2 · Z1 + X1
C ← Z1 · B
D ← B2 · C + aZ12
Z3 ← C 2
E ← A ·C
X3 ← A2 + D + E
F ← X3 + X2 · Z3
G ← (X2 +Y2 ) · Z32
Y3 ← (E + Z3 ) · F + G
L’inconvénient majeur de ces deux algorithmes est que ceux-ci ne sont valables
que dans le cas où le coefficient a de l’équation appartient à {0, 1}. Les deux al-
gorithmes ne sont pas présentés car ils représentent approximativement les mêmes
instructions au test près des retours du point ∞, que les formules que nous venons
de présenter.
Le tableau suivant va nous montrer l’intérêt d’utiliser de tels algorithmes plutôt
que les algorithmes initiaux.
28
une méthode gauche/droite. Nous utiliserons le deuxième algorithme pour une rai-
son très simple mais qui a toute son importance.
En contre partie, l’algorithme Fig. 2.8 quand à lui en traitan les bits, de la
droite vers la gauche nous offre la possibilité d’utiliser le point Q en coordonnées
projectives afin d’effectuer tous les doublement nécessaires. Et pour ce qui est du
point P, une seule conversion est nécessaire.
Les résultats obtenus en utilisant l’algorithme Fig. 2.7 sont de 4, 8ms alors que
ceux obtenus avec Fig. 2.8 descendent alors à 3, 615ms en moyenne. C’est un gain
non négligeable et nous allons voir qu’il est encore possible de diminuer les va-
leur de l’addition de point avec l’utilisation d’une représentation particulière des
entiers.
29
Théorème 4.2.1 (Propriétés des NAFs). Soit k un entier positif.
(i) k possède un NAF unique noté NAF(k).
(ii) NAF(k) possède le moins de bits non nuls parmis toutes les représentations
signées de bits de l’entier k.
(iii) La longueur de NAF(k) est au plus celle de la représentation binaire de k
plus un.
(iv) Si la longueur de NAF(k) est l, alors
2l 2l+1
<k<
3 3
(v) La densité moyenne des bits non-nuls sur l’ensemble de toutes les NAFs de
longueur l est approximativement 1/3.
NAF(k) peut-être calculer efficacement grâce à l’algorithme Fig. 4.4. Les bits
de NAF(k) sont générés en divisant k successivement par 2, permettant des restes
de 0 ou ±1. Si k est impair, alors, le reste r ∈ {−1, 1} est choisi de telle sorte que
le quotient (k − r)/2 soit pair. Ceci assure que le prochain bit de la représentation
NAF sera un 0.
30
F IG . 4.5 : Méthode binaire NAF pour la multiplication de points.
Entrées : Un entier positif k, P ∈ E(Fq ).
Sorties : kP.
début
Calculer NAF(k) = ∑l−1 i
i=0 ki 2 ;
Q ← ∞;
pour i allant de l − 1 à 0 par pas de −1 faire
Q ← 2Q;
si ki = 1 alors
Q ← Q + P;
finsi
si ki = −1 alors
Q ← Q − P;
finsi
finpour
retourner Q;
fin
31
Conclusion
32
Table des figures
33
A NNEXE A
Manuel
A.1.1 Compilation
Pour compiler le programme il suffit de lancer la commande ./configure.
Celle-ci génèrera les paramètres nécessaires à la compilation. Un pré requis utile
est de savoir que les deux bibliothèques utilisées NTL et mhash se situent dans le
répertoire /usr/lib. Le cas échéant, une modification du fichier Makefile du
répertoire src du projet sera sans doute nécessaire à une compilation sans erreur.
Il ne reste plus alors qu’à taper la commande miracle, dans le répertoire racine
du projet. Il suffit de taper make dans le shell. La compilation devrait se passer sans
torp de problèmes.
A.1.2 Installation
Une fois le programme compilé, il est alors possible de l’installer à l’aide de la
commande make install. Cependant, sachant que cette version est encore très
simple, une simple exécution du programme ecci dans le répertoire src du projet
est sûrement bien plus judicieuse.
34
A.2. Utilisation
L’utilisation aussi ne demande pas de grandes connaissances. Pour signer un
fichier et obtenir la vérification de sa signature, il suffit dans le cas du fichier
foo.bar à signer, de taper la commande suivante : ./ecci -f foo.bar.
Le programme est assez rudimentaire, il est vrai, mais dans le cadre actuel des
choses, réalise les opérations.
35
A NNEXE B
c l a s s ECDomainParameters
{
public :
ECDomainParameters ( ) ;
inline ZZ g e t q ( ) { r e t u r n t h i s −>q ; }
inline ZZ g e t n ( ) { r e t u r n t h i s −>n ; }
inline ZZ g e t s ( ) { r e t u r n t h i s −>s ; }
inline ZZ g e t h ( ) { r e t u r n t h i s −>h ; }
inline ZZ g e t m ( ) { r e t u r n t h i s −>m; }
inline ECBFEquation g e t e ( ) { r e t u r n t h i s −>e ; }
inline ECPoint g e t P ( ) { r e t u r n t h i s −>P ; }
private :
GF2X f z ;
ECPoint P ;
ZZ q ;
ZZ s ;
ZZ h ;
ZZ m;
ZZ n ;
ECBFEquation e ;
};
B.2. ECSignature
c l a s s ECSignature
{
public :
ECSignature ( ) {}
ECSignature (ZZ r , ZZ s ) ;
i n l i n e v o i d s e t R (ZZ r ) { t h i s −>r = r; }
i n l i n e v o i d s e t S (ZZ s ) { t h i s −>s = s; }
i n l i n e ZZ g e t R ( ) { r e t u r n t h i s −>r ; }
i n l i n e ZZ g e t S ( ) { r e t u r n t h i s −>s ; }
private :
ZZ r ;
36
ZZ s ;
};
B.3. ECBFEquation
c l a s s ECBFEquation
{
public :
ECBFEquation ( ) ;
ECBFEquation ( GF2E a , GF2E b ) ;
i n l i n e v o i d s e t C o e f f a ( GF2E a ) { t h i s −>a = a ; }
i n l i n e v o i d s e t C o e f f b ( GF2E b ) { t h i s −>b = b ; }
i n l i n e GF2E g e t C o e f f a ( ) { r e t u r n t h i s −> a ; }
i n l i n e GF2E g e t C o e f f b ( ) { r e t u r n t h i s −> b ; }
private :
GF2E a ;
GF2E b ;
};
B.4. ECMessage
c l a s s ECMessage
{
public :
s t a t i c c o n s t u n s i g n e d i n t SELECTION TYPE FILE = 1 ;
s t a t i c c o n s t u n s i g n e d i n t SELECTION TYPE STRING = 2 ;
ECMessage ( ) ;
v o i d s e l e c t I n p u t ( char ∗ f i l e n a m e , u n s i g n e d i n t i n p u t t y p e ) ;
v o i d s e l e c t O u t p u t ( char ∗ f i l e n a m e , u n s i g n e d i n t o u t p u t t y p e ) ;
b o o l hashMe ( ) ;
ZZ h a s h M e T r u n c a t e d ( u n s i g n e d i n t n b b i t s ) ;
i n l i n e u n s i g n e d char ∗ g e t H a s h ( ) { r e t u r n t h i s −>h a s h ; }
v o i d showHash ( ) ;
˜ ECMessage ( ) ;
private :
s t a t i c c o n s t u n s i g n e d i n t SELECTION TYPE NO SELECTION = 0 ;
char ∗ o u t p u t ;
char ∗ i n p u t ;
bool i n p u t s e l e c t e d ;
bool o u t p u t s e l e c t e d ;
u n s i g n e d char ∗ h a s h ;
unsigned i n t i n p u t s e l e c t e d t y p e ;
unsigned i n t o u t p u t s e l e c t e d t y p e ;
37
bool hashFromInputFile ( ) ;
bool hashFromInputString ( ) ;
};
B.5. ECKeyPair
c l a s s ECKeyPair
{
public :
ECKeyPair ( ) ;
ECKeyPair ( ECDomainParameters ∗ D ) ;
v o i d g e n e r a t e K e y P a i r ( ECDomainParameters ∗ D ) ;
i n l i n e ECPoint g e t Q ( ) { r e t u r n t h i s −>Q; }
i n l i n e ZZ g e t d ( ) { r e t u r n t h i s −>d ; }
b o o l v a l i d a t e P u b l i c K e y ( ECDomainParameters ∗ D ) ;
private :
ECPoint Q ;
ZZ d ;
};
B.6. ECPoint
c l a s s ECPoint
{
public :
ECPoint ( ) ;
ECPoint ( GF2E x , GF2E y ) ;
i n l i n e v o i d s e t X ( GF2E x ) { t h i s −>x = x ; }
i n l i n e v o i d s e t Y ( GF2E y ) { t h i s −>y = y ; }
i n l i n e ECPoint o p e r a t o r −()
{
r e t u r n ECPoint ( t h i s −>x , t h i s −>x+ t h i s −>y ) ;
}
ECPoint o p e r a t o r ∗ (ZZ n ) ;
ECPoint o p e r a t o r ∗ (ECNAF k ) ;
ECPoint o p e r a t o r +( ECPoint Q ) ;
i n l i n e v o i d s e t I n f i n i t y ( ) { t h i s −> i n f i n i t y p o i n t = t r u e ; }
i n l i n e b o o l i s I n f i n i t y ( ) { r e t u r n t h i s −> i n f i n i t y p o i n t ; }
v o i d show ( ) ;
private :
bool i n f i n i t y p o i n t ;
GF2E x ;
GF2E y ;
};
38
B.7. ECDSA
c l a s s ECDSA
{
public :
ECDSA( ECDomainParameters D ) ;
ECSignature g e n e r a t e S i g n a t u r e (ZZ d , ECMessage ∗m ) ;
b o o l v e r i f y S i g n a t u r e ( ECPoint Q, ECMessage ∗m, ECSignature s i g n a t u r e ) ;
private :
ECDomainParameters D ;
ZZ c o o r d i n a t e T o Z Z ( c o n s t GF2E& a ) ;
};
B.8. ECPPoint
c l a s s ECPPoint
{
public :
ECPPoint ( c o n s t GF2E& x , c o n s t GF2E& y , c o n s t GF2E& z ) ;
ECPPoint ( v o i d ) ;
ECPPoint ( ECPoint P ) ;
ECPPoint ( c o n s t ECPPoint& P ) ;
i n l i n e v o i d s e t X ( GF2E x ) { t h i s −>x = x ; }
i n l i n e v o i d s e t Y ( GF2E y ) { t h i s −>y = y ; }
i n l i n e v o i d s e t Z ( GF2E z ) { t h i s −>z = z ; }
/ / ECPPoint o p e r a t o r +( c o n s t ECPPoint& Q ) ;
i n l i n e ECPPoint o p e r a t o r −()
{
r e t u r n ECPPoint ( t h i s −>x , t h i s −>x + t h i s −>y , t h i s −>z ) ;
}
ECPPoint o p e r a t o r − ( ECPoint Q ) ;
ECPPoint o p e r a t o r ∗ (ZZ n ) ;
ECPPoint o p e r a t o r ∗ (ECNAF k ) ;
ECPPoint o p e r a t o r +( ECPoint Q ) ;
ECPoint c o n v e r t ( ) ;
i n l i n e bool i s I n f i n i t y ( )
{
r e t u r n ( I s O n e ( t h i s −>x ) && I s Z e r o ( t h i s −>y ) && I s Z e r o ( t h i s −>z ) ) ;
}
inline void s e t I n f i n i t y ( ) {
conv ( t h i s −>x , GF2X ( 0 , 1));
conv ( t h i s −>y , GF2X ( 0 , 0));
conv ( t h i s −>z , GF2X ( 0 , 0));
}
v o i d show ( ) ;
private :
39
GF2E x ;
GF2E y ;
GF2E z ;
int c ;
int d ;
ECPPoint p o i n t D o u b l i n g ( ECBFEquation e ) ;
ECPPoint double moi ( ) ;
ECPPoint add ( ECPoint Q, ECBFEquation e ) ;
ECPPoint mul (ZZ k ) ;
ECPPoint m u l n a f (ECNAF k ) ;
};
B.9. ECNAF
c l a s s ECNAF
{
public :
ECNAF( c o n s t ZZ& k ) ;
/ / ˜ ECNAF ( ) ;
i n l i n e i n t g e t L e n g t h ( ) { r e t u r n t h i s −>l e n g t h ; }
i n l i n e i n t g e t V a l ( i n t i ) { r e t u r n t h i s −>n a f [ i ] ; }
v o i d show ( ) ;
private :
i n t w;
int size ;
int length ;
int naf [512];
/ / char ∗ naf ;
b o o l ZZ to NAF ( c o n s t ZZ& k ) ;
};
40