Vous êtes sur la page 1sur 69

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/323946296

Cryptographie à base de courbes elliptiques

Thesis · June 2017


DOI: 10.13140/RG.2.2.33984.84485

CITATIONS READS

0 851

1 author:

Ismail Lotfi
Ecole Nationale Supérieure d'Informatique
1 PUBLICATION   0 CITATIONS   

SEE PROFILE

All content following this page was uploaded by Ismail Lotfi on 22 March 2018.

The user has requested enhancement of the downloaded file.


Cryptographie à base de courbes elliptiques

Ismail Lotfi

13 juin 2017
Dédicaces

Je dédie ce travail à
Mes parents,
Mes sœurs et Mes frères.

Ismail Lotfi
Remerciements

Au terme de ce travail, je tiens à remercier mon encadrant Prof. GUEZOURI Mus-


tapha qui a accepté d’encadrer mes travaux durant ces derniers cinq mois d’études et
pour ses qualités humaines et professionnelles, pour son encadrement, ses directives, ses
remarques constructives, et sa disponibilité.
Je suis reconnaissant en particulier à tous ceux qui ont aiguillé mon parcours pour
m’amener jusqu’ici : mes parents, mes frères et soeurs.

2
Table des matières

Introduction Générale 7

1 Introduction à la cryptographie 8
1.1 Terminologie et Notations . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.1 Terminologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.2 Notations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Principaux concepts cryptographiques . . . . . . . . . . . . . . . . . . . . 12
1.2.1 Cryptographie Symétrique . . . . . . . . . . . . . . . . . . . . . . 12
1.2.2 Cryptographie asymétrique . . . . . . . . . . . . . . . . . . . . . 12
1.2.3 Hachage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.4 Protocoles cryptographiques . . . . . . . . . . . . . . . . . . . . . 14
1.3 Méthodes de Chiffrement . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.3.1 Chiffrement par bloc . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.3.2 Chiffrement par Flux . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.3.3 Chiffrement par clé publique . . . . . . . . . . . . . . . . . . . . . 22
1.3.4 Fonctions de hachage . . . . . . . . . . . . . . . . . . . . . . . . . 23

2 La Cryptographie sur Les Courbes Elliptiques 28


2.1 Notions mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.1.2 Approche Géométrique . . . . . . . . . . . . . . . . . . . . . . . . 30
2.1.3 Loi additive et coordonnées . . . . . . . . . . . . . . . . . . . . . 32
2.1.4 Choix du corps . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2 Utilisation des courbes elliptiques dans la cryptographie . . . . . . . . . . 34
2.2.1 Cryptage des messages . . . . . . . . . . . . . . . . . . . . . . . . 34
2.2.2 Signature électronique d’ElGamal . . . . . . . . . . . . . . . . . . 37
2.3 Attaques sur la cryptographie à base des courbes elliptiques . . . . . . . 38
2.3.1 Baby Step Giant Step . . . . . . . . . . . . . . . . . . . . . . . . 38
2.3.2 L’attaque MOV . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.3.3 Force Brute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.3.4 Attaques par canaux cachés . . . . . . . . . . . . . . . . . . . . . 39
2.4 Utilisation de la cryptographie à base des courbes elliptiques . . . . . . . 42
2.4.1 Efficacité des courbes elliptiques . . . . . . . . . . . . . . . . . . . 42
2.4.2 Comparaison entre RSA et ECC . . . . . . . . . . . . . . . . . . . 42
2.4.3 Applications qui utilisent la ECC . . . . . . . . . . . . . . . . . . 46
2.4.4 Considération sur les brevets . . . . . . . . . . . . . . . . . . . . . 47

3
TABLE DES MATIÈRES

3 Conception et implémentation 49
3.1 Conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2 Implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.2.1 Outils et Environnement . . . . . . . . . . . . . . . . . . . . . . . 53
3.2.2 Intérface principale . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.2.3 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
3.2.4 Etapes de génération de la clé publique . . . . . . . . . . . . . . . 57
3.2.5 Etapes de cryptage . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.2.6 Etapes de décryptage . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.2.7 Affichage graphique . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Conclusion Générale 66

4
Table des figures

1.1 Une représentation d’un cryptosystème. . . . . . . . . . . . . . . . . . . . 11


1.2 Chiffrement symétrique. . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Cryptographie asymétrique. . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Confidentialité d’un système symétrique . . . . . . . . . . . . . . . . . . 14
1.5 Confidentialité d’un système asymétrique . . . . . . . . . . . . . . . . . . 14
1.6 Confidentialité d’un système hybride . . . . . . . . . . . . . . . . . . . . 15
1.7 Vérification de l’intégrité par fonction de hachage . . . . . . . . . . . . . 15
1.8 Authentification dans un système symétrique . . . . . . . . . . . . . . . . 16
1.9 Authentification dans un système asymétrique . . . . . . . . . . . . . . . 16
1.10 Authentification par MAC et système symétrique . . . . . . . . . . . . . 17
1.11 Authentification par MAC et fonction de hachage . . . . . . . . . . . . . 17
1.12 Authentification par signature (technique asymétrique) . . . . . . . . . . 18
1.13 Confidentialité(Rouge), Intégrité(Violet), Authentification(Vert) . . . . . 18
1.14 Algorithme principal du DES . . . . . . . . . . . . . . . . . . . . . . . . 20
1.15 Schéma de chiffrement par flux . . . . . . . . . . . . . . . . . . . . . . . 21
1.16 FSR : Fonction du registre . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.17 Vue d’ensemble du MD5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.18 Une étape de la fonction de compression de SHA-0 ou de SHA-1. . . . . . 26

2.1 Addition de deux points sur une courbe elliptique sur R. . . . . . . . . . 31


2.2 Doublement d’un point sur une courbe elliptique sur R. . . . . . . . . . . 31
2.3 EC sur Z/pZ [7]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.4 Exemple de table de correspondance pour E : y 2 = x3 + 2x + 9 (mod 37) 34
2.5 Échange de clés de Diffie Hellman (ECDH) . . . . . . . . . . . . . . . . . 36
2.6 Analyse des bits par canaux cachés . . . . . . . . . . . . . . . . . . . . . 39
2.7 Points forts comparables . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.8 Génération de signature . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.9 Vérification de signature . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.10 Génération de clé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.11 La courbe Secp256k1 utilisé par Bitcoin y 2 = x3 + 7. . . . . . . . . . . . 47

3.1 Diagramme d’activité du fonctionnement global de l’application. . . . . . 52


3.2 Intérface principale de l’application. . . . . . . . . . . . . . . . . . . . . . 53
3.3 Cryptage du message par Alice. . . . . . . . . . . . . . . . . . . . . . . . 54
3.4 Déryptage du message par Bob. . . . . . . . . . . . . . . . . . . . . . . . 54
3.5 Représentation graphique de la courbe y 2 = x3 − 3x + 5 sur Z/167Z . . . 55
3.6 Représentation graphique de la courbe y 2 = x3 − 3x + 5 sur R . . . . . . 55

5
La sécurité du chiffre ne doit pas
dépendre de ce qui ne peut pas être
facilement changé.
Kerckhoff
Introduction Générale

La nécessité de protéger les messages a existé depuis l’antiquité dans plusieurs do-
maines qui vont du domaine militaire au domaine commercial. Pour achever ce but,
plusieurs méthodes ont été utilisées jusqu’à l’apparition de la cryptographie moderne. Il
existe de nos jours deux grands modes de chiffrement : le chiffrement symétrique et le
chiffrement asymétrique.

Dans ce document, nous allons donner les différentes méthodes utilisées pour garantir
la confidentialité, l’authenticité et l’intégrité des messages en détaillant la cryptographie à
base des courbes elliptiques qui est le présent et probablement le futur de la cryptographie
asymétrique. Nous allons aussi décrire l’application qu’on a pu développer pour chiffrer
et déchiffrer un message clair écrit en caractères latins.

Le travail présenté dans ce document entre dans le cadre de mon projet de fin d’études
en cycle de Master, option Réseaux Émergents, Sécurité et Multimédia à l’Université
d’Oran 1 Ahmed Ben Bella.

Afin de bien organiser le travail, le manuscrit de ce mémoire a été divisé en trois


chapitres principaux :
Le chapitre 1 discutera les principaux concepts cryptographiques et les algorithmes
utilisés pour cela.
Le chapitre 2 est un tour d’horizon des principales propriétés des courbes elliptiques
et des différentes formules d’addition de points selon le système de coordonnées choisi.
Le chapitre 3 porte sur l’adaptation de la théorie à la pratique en décrivant l’applica-
tion qu’on a développé dans ce projet.

On termine ce mémoire avec une conclusion générale sur le processus de développement


de l’application, ainsi que des perspectives pour une amélioration éventuelle de ce travail.

7
Chapitre 1

Introduction à la cryptographie

8
Chapitre 1. Introduction à la cryptographie

Introduction

Depuis la seconde guerre mondiale, les besoins cryptographiques ont explosé. Le chif-
frement est devenu une nécessité non seulement dans le domaine militaire, mais aussi
dans l’économie, les télécommunications et bien d’autres domaines de pointe. La généra-
lisation de l’outil informatique a permi d’exploiter des algorithmes bien plus complexes ;
ce qui nous a donné deux grands systèmes de chiffrements : Le chiffrement symétrique
(ou bien à clé secrète) et le chiffrement asymétrique (ou bien à clé publique).

Dans ce chapitre on va présenté une introduction générale à la cryptographie, en passant


par les notions et terminologies utilisées dans cette science, puis expliquer le fonctionne-
ment des modes et protocoles de chiffrement symétrique et asymétrique.

On va aussi donner une description de quelques fonctions et algorithmes qui sont utilisés
avec le chiffrement symétrique et asymétrique pour garantir l’intégrité et l’authenticité
des données.

9
Chapitre 1. Introduction à la cryptographie

1.1 Terminologie et Notations


1.1.1 Terminologie
— Cryptologie : Il s’agit d’une science mathématique comportant deux branches :
la cryptographie et la cryptanalyse [1].
— Cryptographie : La cryptographie est l’étude des méthodes donnant la possibilité
d’envoyer des données de manière confidentielle sur un support non sécurisé.
— Cryptanalyse : Opposée à la cryptographie, elle a pour but de retrouver le texte
clair à partir de textes chiffrés en déterminant les failles des algorithmes utilisés.
— Chiffrement : Le chiffrement consiste à transformer une donnée (texte, message,
...) afin de la rendre incompréhensible par une personne autre que celui qui a créé
le message et celui qui en est le destinataire. La fonction permettant de retrouver
le texte clair à partir du texte chiffré porte le nom de déchiffrement.
— Texte chiffré : Appelé également cryptogramme, le texte chiffré est le résultat
de l’application d’un chiffrement à un texte clair.
— Clef : Il s’agit du paramètre impliqué et autorisant des opérations de chiffrement
et/ou déchiffrement. Dans le cas d’un algorithme symétrique, la clef est identique
lors des deux opérations. Dans le cas d’algorithmes asymétriques, elle diffère pour
les deux opérations.
— Cryptosystème : C’est un ensemble composé d’algorithmes cryptographiques et
de tous les textes en clair, textes chiffrés et clés possibles [RFC 2828].

1.1.2 Notations
En cryptographie, la propriété de base est que :

M = D(E(M ))

Où :
— M représente le texte clair.
— C est le texte chiffré.
— K est la clé (dans le cas d’un algorithme à clé symétrique).
— Ek et Dk dans le cas d’algorithmes asymétriques.
— E(x) est la fonction de chiffrement.
— D(x) est la fonction de déchiffrement.
D’où on peut représenter un cryptosystème par le schéma suivant [1, 2] :

10
Chapitre 1. Introduction à la cryptographie

Figure 1.1 – Une représentation d’un cryptosystème.

11
Chapitre 1. Introduction à la cryptographie

1.2 Principaux concepts cryptographiques


1.2.1 Cryptographie Symétrique
Caractéristiques :
— Les clés sont identiques : K.E = K.D = K.
— La clé doit rester secrète.
— Les algorithmes les plus répandus sont le DES, DES, AES,...
— Au niveau de la génération des clés, elle est choisie aléatoirement dans l’espace des
clés.
— Ces algorithmes sont basés sur des opérations de transposition et de substitution
des bits du texte clair en fonction de la clé.
— La taille des clés est souvent de l’ordre de 128 bits. Le DES en utilise 56, mais
l’AES peut aller jusqu’à 256.
— L’avantage principal de ce mode de chiffrement est sa rapidité.
— Le principal désavantage réside dans la distribution des clés : pour une meilleure sé-
curité, on préférera l’échange manuel. Malheureusement, pour de grands systèmes,
le nombre de clés peut devenir conséquent. C’est pourquoi on utilisera souvent des
échanges sécurisés pour transmettre les clés. En effet, pour un système à N utili-
sateurs, il y aura N.(N − 1)/2 paires de clés [2].

Figure 1.2 – Chiffrement symétrique.

1.2.2 Cryptographie asymétrique


Caractéristiques :
— Une clé publique PK (symbolisée par la clé verticale).
— Une clé privée secrète SK (symbolisée par la clé horizontale).
— Propriété : La connaissance de PK ne permet pas de déduire SK .
— DSK(EP K(M )) = M .
— L’algorithme de cryptographie asymétrique le plus connu est le RSA.
— Le principe de ce genre d’algorithme est qu’il s’agit d’une fonction unidirection-
nelle à trappe. Une telle fonction à la particularité d’être facile à calculer dans
un sens, mais difficile voire impossible dans le sens inverse. La seule manière de
pouvoir réaliser le calcul inverse est de connaître une trappe. Une trappe pour-
rait par exemple être une faille dans le générateur de clés. Cette faille peut être

12
Chapitre 1. Introduction à la cryptographie

soit intentionnelle de la part du concepteur (définition stricte d’une trappe) ou


accidentelle.
— Les algorithmes se basent sur des concepts mathématiques tels que l’exponen-
tiation de grands nombres premiers (RSA), le problème des logarithmes discrets
(ElGamal), ou encore le problème du sac à dos (Merkle-Hellman).
— La taille des clés s’étend de 512 bits à 2048 bits en standard. Dans le cas du RSA,
une clé de 512 bits n’est plus sûre au sens "militaire" du terme, mais est toujours
utilisable de particulier à particulier.
— Au niveau des performances, le chiffrement par voie asymétrique est environ 1000
fois plus lent que le chiffrement symétrique.
— Cependant, à l’inverse du chiffrement symétrique où le nombre de clés est le pro-
blème majeur, ici, seules n paires sont nécessaires. En effet, chaque utilisateur
possède une paire (SK , PK ) et tous les transferts de message ont lieu avec ces clés.
— La distribution des clés est grandement facilitée car l’échange de clés secrètes n’est
plus nécessaire. Chaque utilisateur conserve sa clé secrète sans jamais la divulguer.
Seule la clé publique devra être distribuée [2].

Figure 1.3 – Cryptographie asymétrique.

1.2.3 Hachage
Formellement, une fonction de hachage est une fonction de l’ensemble des suites bi-
naires (de longueur quelconque, non bornée) vers les suites de longueur n :

F : {0, 1}∗ → {0, 1}n

Pour une utilisation cryptographique, on s’attend à ce qu’une fonction de hachage se


comporte comme une fonction choisie aléatoirement parmi toutes les fonctions de {0, 1}∗
vers {0, 1}n . Il ne doit pas être possible de trouver des relations entre l’entrée et la sortie,
ou de trouver des sorties avec des relations particulières autrement que par recherche
exhaustive, i.e. en calculant la fonction sur suffisamment d’entrées [3].

Deux caractéristiques importantes sont les suivantes :


1. Ce sont des fonctions unidirectionnelles :
A partir de H(M ) il est impossible de retrouver M.
2. Ce sont des fonctions sans collisions :
A partir de H(M ) et M il est impossible de trouver M 0 6= M tel que H(M 0 ) =
H(M ).

13
Chapitre 1. Introduction à la cryptographie

1.2.4 Protocoles cryptographiques


Dès que plusieurs entités sont impliquées dans un échange de messages sécurisés,
des règles doivent déterminer l’ensemble des opérations cryptographiques à réaliser, leur
séquence, afin de sécuriser la communication C’est ce que l’on appelle les protocoles
cryptographiques. Lorsque l’on parle de “ sécuriser un échange ”, on souhaite prêter
attention aux 3 services suivants : la confidentialité, l’intégrité et l’authentification [2].

Confidentialité
Elle est amenée par le chiffrement du message. Dans le cas de systèmes à clés symé-
triques, la même clé est utilisée pour EK (M ) et DK (C). Ce type de chiffrement nécessite
un échange sûr préalable de la clé K entre les entités A et B.

Figure 1.4 – Confidentialité d’un système symétrique

à l’aide d’un cryptosystème asymétrique, cet échange préalable n’est pas nécessaire.
Chaque entité possède sa propre paire de clés. On aura donc la paire PKA , SKA pour
l’entité A et la paire PKB , SKB pour l’entité B.

Figure 1.5 – Confidentialité d’un système asymétrique

En marge de ces deux systèmes, existe également un système appelé "hybride" (figure
1.6), reposant comme son nom l’indique sur les deux systèmes précédents. Par l’intermé-
diaire du système à clé publique, on sécurise l’échange de la clé K. Ensuite, les deux parties

14
Chapitre 1. Introduction à la cryptographie

ayant acquis de manière sécurisée cette clé de chiffrement K 3 , on utilisera le système à


clé symétrique pour chiffrer le message [1].

Figure 1.6 – Confidentialité d’un système hybride

Intégrité
Il faut ici vérifier si le message n’a pas subi de modification durant la communication.
C’est ici qu’interviennent les fonctions de hachage [1].

Figure 1.7 – Vérification de l’intégrité par fonction de hachage

Authentification
Elle a lieu à plusieurs niveaux [2] :
— Au niveau des parties communicantes : dans le cas d’un système symétrique
(figure 1.8) ou asymétrique (figure 1.9).
A la première figure, Ra est une nonce (p. ex. nombre aléatoire), propre à l’utili-
sateur A. Les lettres A et B représentent des identificateurs personnels.

15
Chapitre 1. Introduction à la cryptographie

Figure 1.8 – Authentification dans un système symétrique

A la seconde figure, la clé de chiffrement utilisée est bien la clé privée. Comme
le propriétaire de cette clé est le seul à la connaître, cela prouve qu’il est bien la
personne ayant chiffré le message.
Attention, dans cet exemple, seule l’authentification est souhaitée. Le message
envoyé pourra être lu par toute personne possédant la clé publique, c’est-à-dire,
n’importe qui. La confidentialité est ici nulle.

Figure 1.9 – Authentification dans un système asymétrique

— Au niveau du message :
— Par l’utilisation d’un MAC (Message Authentication Code) généré à l’aide d’un
cryptosystème à clé symétrique où le MAC est constitué des derniers digits de
C (figure 1.10), ou généré à l’aide d’une fonction de hachage (figure 1.11), la
clé secrète K utilisée étant partagée par les deux entités A et B. Dans les deux
cas, l’authentification repose sur l’utilisation de la clé K.

16
Chapitre 1. Introduction à la cryptographie

Figure 1.10 – Authentification par MAC et système symétrique

Figure 1.11 – Authentification par MAC et fonction de hachage

— Par l’utilisation d’une signature digitale. Parmi les propriétés remarquables de


ces signatures, on peut dire qu’elles doivent être authentiques, infalsifiables,
non-réutilisables, non-répudiables, et inaltérables. Dans la figure 1.12, on fait
abstraction de la confidentialité. C’est l’authentification qui importe.

17
Chapitre 1. Introduction à la cryptographie

Figure 1.12 – Authentification par signature (technique asymétrique)

Synthèse

Figure 1.13 – Confidentialité(Rouge), Intégrité(Violet), Authentification(Vert)

18
Chapitre 1. Introduction à la cryptographie

1.3 Méthodes de Chiffrement


1.3.1 Chiffrement par bloc
L’idée générale du chiffrement par blocs est la suivante :
1. Remplacer les caractères par un code binaire.
2. Découper cette chaîne en blocs de longueur donnée.
3. Chiffrer un bloc en l’"additionnant" bit par bit à une clef.
4. Déplacer certains bits du bloc.
5. Recommencer éventuellement un certain nombre de fois l’opération 3.
6. Passer au bloc suivant et retourner au point 3 jusqu’à ce que tout le message soit
chiffré.

On distingue trois catégories de chiffrement par bloc [2] :


— Chiffrement par substitution : Les substitutions consistent à remplacer des sym-
boles ou des groupes de symboles par d’autres symboles ou groupes de symboles
dans le but de créer de la confusion.
— Chiffrement par transposition : Les transpositions consistent à mélanger les sym-
boles ou les groupes de symboles d’un message clair suivant des règles prédéfinies
pour créer de la diffusion. Ces règles sont déterminées par la clé de chiffrement.
Une suite de transpositions forme une permutation.
— Chiffrement par produit : C’est la combinaison des deux. Le chiffrement par sub-
stitution ou par transposition ne fournit pas un haut niveau de sécurité, mais en
combinant ces deux transformations, on peut obtenir un chiffrement plus robuste.
La plupart des algorithmes à clés symétriques utilisent le chiffrement par produit.
On dit qu’un « round » est complété lorsque les deux transformations ont été
faites une fois (substitution et transposition).

DES
Le D.E.S. (Data Encryption Standard, c’est-à-dire Standard de Chiffrement de Don-
nées) est un cryptosystème agissant par blocs. Un bloc de 64 bits du texte clair entre par
un coté de l’algorithme et un bloc de 64 bits de texte chiffré sort de l’autre coté.
C’est un algorithme de chiffrement à clef secrète. La clef sert donc à la fois à chiffrer et
à déchiffrer le message. Cette clef a ici une longueur de 64 bits, c’est-à-dire 8 caractères,
mais dont seulement 56 bits sont utilisés. Les autres bits sont des bits de contrôle de
parité [2].

L’entière sécurité de l’algorithme repose sur les clefs puisque l’algorithme est parfai-
tement connu de tous. La clef de 64 bits est utilisée pour générer 16 autres clefs de 48
bits chacune qu’on utilisera lors de chacune des 16 itérations du D.E.S. Ces clefs sont les
mêmes quel que soit le bloc qu’on code dans un message.

19
Chapitre 1. Introduction à la cryptographie

Figure 1.14 – Algorithme principal du DES

L’algorithme de chiffrement repose principalement sur 3 étapes, en plus de la gestion


spécifique de la clé :
1. Permutation initiale.
2. Calcul médian (16 fois) : application d’un algorithme complexe appliqué en fonc-
tion de la clé.
3. Permutation finale.

Pour le déchiffrement, Il suffit d’appliquer le même algorithme mais inversé en tenant


bien compte du fait que chaque itéra- tion du déchiffrement traite les mêmes paires de
blocs utilisés dans le chiffrement.

AES
Suite aux failles du DES, quelques modifications ont été apportées (2DES, 3DES..),
mais pas toujours avec succès. L’algorithme de AES (Advanced Encryption Standard) est
apparue pour remplacer le DES et ces variantes.
Le AES possède les propriétés suivantes [2] :
— Plusieurs longueurs de clef et de bloc sont possibles : 128, 192, ou 256 bits.

20
Chapitre 1. Introduction à la cryptographie

— Le nombre de cycles ("rondes") varie en fonction de la longueur des blocs et des


clés (de 10 à 14).
— La structure générale ne comprend qu’une série de transformations/permutations/-
sélections.
— Il est beaucoup plus performant que le DES.
— Il est facilement adaptable à des processeurs de 8 ou de 64 bits.
— Le parallélisme peut être implémenté.

1.3.2 Chiffrement par Flux


Le chiffrement par flots (ou par stream ou de flux) s’opère sur chaque élément du texte
clair (caractère, bits). On chiffre un bit/caractère à la fois. La structure d’un chiffrement
par stream repose sur un générateur de clés qui produit une séquence de clés k1, k2, ..., ki
[2] .
La sécurité du chiffrement dépend de la qualité du générateur : si ki = 0 pour tout
i, M = C. Mais si la séquence des clés ki est infinie et complètement aléatoire, on obtient
un One-Time-Pad. En pratique, on se situe entre les deux, c’est-à-dire une séquence
pseudo-aléatoire.
La figure suivante illustre ce principe :

Figure 1.15 – Schéma de chiffrement par flux

LFSR
Un LFSR (Linear-Feedback Shift Register), est constitué de m sections contenant
chacune 1 bit (état interne) et d’une fonction de retour (feedback). Les sections sont en
réalité des cases mémoire (ou flip-flops). A chaque impulsion de l’horloge, les éléments
des sections sont décalés d’une position vers la droite. L’élément de la section 0 constitue
l’output du LFSR. L’élément de la section m-1 est le résultat de la fonction de retour [2].

21
Chapitre 1. Introduction à la cryptographie

Figure 1.16 – FSR : Fonction du registre

La fonction de retour qui donne la valeur au flip-flop en position m-1 est la suivante :

f (x0 , ..., x( m − 1)) = c0 x0 + c1 x1 + ... + c( m − 1)x( m − 1)

Les bits de sortie du LFSR constituent la suite pseudo-aléatoire. La qualité du générateur


est définie par sa période de retour, c’est-à-dire la période après laquelle la même série
d’output est répétée [2].
L’initialisation du LFSR (le contenu des flip-flops) et les valeurs des coefficients consti-
tuent ce qu’on nomme communément la clé courte.
Les coefficients c i ont pour valeur 0 ou 1 et définissent les sections qui seront prises
en compte par la fonction. Les valeurs de ces coefficients ainsi que la valeur initiale des
éléments du registre sont fixées à l’avance.

RC4
Il s’agit d’un chiffrement par flux créé en 1987 par Ron Rivest. On le retrouve notam-
ment dans le standard SSL/TLS, dans Oracle Secure SQL, ou encore dans le protocole
WEP (Wired Equivalent Privacy, de la norme 802.11). Ce dernier fut remplacé par le
WPA (Wi-Fi Protected Access), mais celui-ci utilise toujours le RC4.
Le RC4 permet d’initialiser un tableau de 256 octets en répétant la clef autant de fois
que nécessaire pour remplir le tableau. Il est composé de 2 algorithmes [2] :
— L’algorithme KSA (Key schedule algorithm) qui initialise/randomise une fonc-
tion bijective
S : {0, ..., N − 1} −→ {0, ..., N − 1}
En pratique N = 256.
— L’algorithme PRGA (Pseudo Random Generator Algorithm) génère une suite
aléatoire d’octet :
— L’octet aléatoire généré est un S[Ji ] et l’octet chiffré ci = mi ⊕ S[Ji ].
— L’indice Ji et la fonction S est mise à jour.

1.3.3 Chiffrement par clé publique


RSA
RSA (Rivest - Shamir - Adleman) est basé sur le calcul exponentiel. Sa sécurité repose
sur la fonction unidirectionnelle suivante : le calcul du produit de 2 nombres premiers

22
Chapitre 1. Introduction à la cryptographie

est aisé. La factorisation d’un nombre en ses deux facteurs premiers est beaucoup plus
complexe.
Ce cryptosystème utilise deux clés d et e, interchangeables. Le chiffrement se fait selon

C = M e mod(n)

et le déchiffrement par
M = C d mod(n)
Principe Général : On possède une paire de clés, une publique (e,n) et une privée (d,n).
La première étape revient à choisir n. Il doit s’agir d’une valeur assez élevée, produit de
2 nombres premiers très grands p et q. En pratique, si p et q ont 100 chiffres décimaux,
n possédera 200 chiffres. Selon le niveau de sécurité souhaité, la taille de n peut varier :
512 bits, 768, 1024 ou 2048.

Dans un second temps, on choisira un très grand entier e, relativement premier à


(p − 1) ∗ (q − 1). La clé publique sera formée par (e, n). On choisira ensuite un d tel que

e ∗ d ≡ 1mod(f i(n))

La clé privée sera donnée par (d, n).


Dernière phase : on jette p et q. Le cryptanalyste devant retrouver ces valeurs, il faut
les détruire pour éviter les fuites [2].

Courbe elliptique
Il s’agit d’un concept proposé en 1985 par deux chercheurs Miller et Klobitz, de
façon totalement indépendante. Ce type de cryptographie, toujours basé sur le modèle
asymétrique, permet aussi bien de chiffrer que de signer. On utilise souvent l’abréviation
ECC, pour Elliptic Curve Cryptography. Les clés utilisées sont plus courtes pour une
sécurité égale ou supérieure [1].
La théorie sous-jacente, ainsi que l’implémentation sont plus complexes, Ils seront
détaillées dans le Chapitre 2 et 3.

1.3.4 Fonctions de hachage


Une fonction de hachage est une fonction publique qui doit se comporter comme une
fonction aléatoire. En particulier il doit être difficile de trouver des collisions ou d’inverser
la fonction. Les fonctions les plus utilisées actuellement sont MD5, SHA-1 et SHA-2.
La fonction de hachage doit :
— Réduire la taille des entrées à n bits (compression).
— être facile à calculer.
Les Fonctions de hachage sont utilisé pour vérifier l’intégrité des données.

MD5
Conçu par Ronald Rivest (le R dans RSA), c’est le dernier d’une série (MD2, MD4).
Cet algorithme produit un condensé de 128 bits. Il était il y a encore quelques temps
l’algorithme de hachage le plus largement répandu. La cryptanalyse et l’attaque par force
brute (2004) l’ont affaibli.

23
Chapitre 1. Introduction à la cryptographie

Principe : Le déroulement général de l’algorithme est illustré à la figure 1.17.

Figure 1.17 – Vue d’ensemble du MD5

1. Complétion : ajout de padding si nécessaire afin que le message ait une longueur
de 448 mod 512. Cet ajout a toujours lieu.
2. Ajout de la longueur : on ajoute la longueur réelle du message (sur 64 bits) après
les 448 bits. En conséquence, la taille totale du bloc atteint 512 bits. Si la longueur
nécessite plus de 64 bits, on ne note que les 64 bits de poids faible.
3. Initialisation : initialiser 4 buffers de 32 bits chacun (A, B, C, D), qui constitue
l’IV (Initialisation Vector).
4. Calcul itératif : traiter le message par blocs de 512 bits. Il y a 4 rondes de 16
opérations qui sont réalisées en fonction du bloc (512), du contenu des buffers et
de fonctions primitives.
5. Le résultat final est obtenu en concaténant les résultats des additions des registres
A, B, C, D avec la valeur de CVq [2].
Où :
— IV : valeur initiale des registres ABCD.
— Yq : le q ème bloc de 512 bits du message.
— L : le nombre de blocs de 512 bits dans le message.
— CVq : variable chaînée obtenue par la manipulation du q ème bloc.

Securité du MD5
Durant l’été 2004, des chercheurs chinois sont parvenus à casser le MD5 en quelques
heures. Le même résultat est aujourd’hui obtenu en quelques minutes, voire quelques
secondes. En conclusion, le MD5 n’est plus sûr.

24
Chapitre 1. Introduction à la cryptographie

SHA0
SHA-0 est le premier membre de la famille "Secure Hash Standard", les fonctions de
hachage standardisées par le NIST 1 . Très inspirée de celles de la famille MD, la fonction
de compression de SHA-0 n’en diffère quasiment que par l’utilisation d’une expansion de
message novatrice [4] au lieu d’utiliser des permutations des mots de message pour chaque
tour, les mots de message étendu sont obtenus par un procédé récursif initialisé par les
mots du message d’entrée. Pour permettre une longévité suffisante de l’algorithme quant
à l’augmentation de la puissance de calcul, SHA-0 produit des hachés de n = 160 bits
pour un état interne de r = 5 registres de w = 32 bits chacun, initialisé par la variable
de chaînage d’entrée. Dans la suite, nous noterons A «< x (respectivement A »> x ) la
rotation de x positions vers la gauche (respectivement vers la droite) des bits du mot
A [2].
A−4 = (h4 )≪2 , A−3 = (h3 )≪2 , A−2 = (h2 )≪2 , A−1 = h1 , A0 = h0
À chaque appel, m = 16 mots de message seront traités, avec t = 4 tours de u = 20
étapes chacun (c’est à dire s = 80 étapes en tout). L’expansion de message n’utilise donc
plus de permutation. Les 16 premiers mots du message étendu sont égaux aux 16 mots
de message d’entrée de la fonction de compression. Le reste des Wi sont calculés par une
formule de récurrence :
M ,
i pour0 6 i 6 15
Wi = 
Wi−3 ⊕ Wi−8 ⊕ Wi−14 ⊕ Wi−16 , pour16 6 i 6 79
Durant chaque étape i, la fonction fj , dépendante du tour j auquel i appartient, met
à jour le registre cible Ai+1 :

Ai+1 = fj (Ai , Ai−1 , Ai−2 , Ai−3 , Ai−4 , Wi )


= A≪5
i + Φj (Ai−1 , (Ai−2 )≫2 , (Ai−3 )≫2 ) + (Ai−4 )≫2 + Wi + Kj ,

où les Kj sont des constantes prédéfinies pour chaque tour et les fonctions Φj sont des
fonctions booléennes définies pour chaque tour et prenant 3 mots de 32 bits en entrée. À
la fin des 80 étapes, les mots de la sortie de la fonction de compression sont calculés par :

h00 = A80 + A0 , h01 = A79 + A−1 , h02 = (A78 )≫2 + (A−2 )≫2 ,

h03 = (A77 )≫2 + (A−3 )≫2 , h04 = (A76 )≫2 + (A−4 )≫2
Une description visuelle d’une étape est donnée dans la figure 2.10 [2].
1. National Institute of Standards and Technology of the United States

25
Chapitre 1. Introduction à la cryptographie

Figure 1.18 – Une étape de la fonction de compression de SHA-0 ou de SHA-1.

SHA1
SHA-1 est la version corrigée de SHA-0, et fut publiée en 1995 par le NIST. L’ex-
pansion de message mise à part, la description de SHA-1 est absolument identique à
celle de SHA-0. La seule et unique différence consiste en une rotation dans la formule de
récurrencede l’expansion de message, ce qui implique une meilleure diffusion [4] :
M ,
i pour0 6 i 6 15
Wi =
(Wi−3 ⊕ Wi−8 ⊕ Wi−14 ⊕ Wi−16 )≪1 , pour16 6 i 6 79
En 2005, des problèmes de sécurité de SHA-1 ont été mis en évidence. Une équipe
composée de chercheurs de chez Google et du CWI (Centrum Wiskunde et Informatica)
ont annoncé le 23 février 2017 qu’ils avaient réussi à obtenir une collision entre deux
documents.

SHA2
Publiée en 2002, est une famille de fonctions de hachage qui comporte les fonctions,
SHA-256 et SHA-512 dont les algorithmes sont similaires mais opèrent sur des tailles de
mot différentes.
Elle contient plusieurs nouveautés par rapport à ses prédécesseurs. Par exemple, l’ex-
pansion de message est beaucoup plus complexe et corrige les précédentes erreurs de
SHA-0 ou SHA-1. De plus, la fonction d’étape met à jour deux registres à la fois pour
une meilleure diffusion. Aussi, il n’y a plus réellement de notion de tour dans SHA-2, car
les mêmes fonctions booléennes sont utilisées dans toutes les étapes [4].
Le SHA-2 est devenu le nouveau standard recommandé en matière de hachage cryp-
tographique après les attaques sur MD5 et SHA-1.

26
Chapitre 1. Introduction à la cryptographie

Conclusion
On a présenté dans ce chapitre une une vue d’ensemble sur la cryptographie moderne
en mettant le point sur les terminologies et les notations essentielles dans le domaine de
cryptologie.

On a aussi expliqué les différents modes de cryptologie et les fonctions de hachages,


ce qui nous donne une base pour passer au deuxième chapitre où on vas s’intéresser au
courbes elliptiques qui sont utilisées pour la cryptographie asymétrique.

27
Chapitre 2

La Cryptographie sur Les Courbes


Elliptiques

28
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Introduction

Les courbes elliptiques sont très utilisées dans la cryptographie dans plusieurs appli-
cations et protocoles de nos jours. Dans ce chapitre, nous allons mettre le point sur la
théorie des courbes elliptiques et leurs applications dans la cryptographie.

Nous allons en premier temps donner les notions mathématiques des EC (Elliptic
Curves), puis détailler la procédure complète pour chiffrer un texte clair par EC. Nous
allons aussi discuter comment on peut utiliser les courbes elliptiques dans la signature
numérique.

Nous allons donner une description des attaques connue sur la cryptographie à base des
courbes elliptiques pour éviter d’avoir une mauvaise implémentation de cette dernière.

Nous finirons par donner une comparaison entre la cryptographie à base des courbes
elliptiques et le RSA.

29
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

2.1 Notions mathématiques


2.1.1 Définition
Soit K un corps. On appelle équation de Weierstrass sur K une équation du type

E : y 2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6

avec ai ∈ K. Une courbe donnée par une telle équation est dite lisse si le système suivant
n’admet pas de solution

a = 3x2 + 2a2 x + a4
1y
2y + a1 x + a3 = 0

autrement dit si les dérivées partielles en x et en y de

f (x, y) = y 2 + a1 xy + a3 y − x3 − a2 x2 − a4 x − a6

ne s’annulent pas en même temps [5].


Une courbe elliptique E définie sur K est une courbe lisse donnée par une équation
de Weierstrass définie sur K à laquelle on a rajouté un point ”à l’infini”, noté O ;
2
E = {(x, y) ∈ K |y 2 + a1 xy + a3 y = x3 + a2 x2 + a4 x + a6 } ∪ {O}
Si la caractéristique de K(char(K)) n’est pas 2 ni 3, alors en faisant les deux changements
de variables successifs y → 1/2(y − a1 x − a3 ) et ensuite (x, y) → ((x − 3b2 )/36, y/216)
dans E, où b2 = a21 + 4a2 , nous obtenons

E : y 2 = x3 − 27c4 x + 54c6 ,

avec b4 = 2a4 + a1 a3 , b6 = a23 + 4a6 , c4 = b22 − 24b4 , c6 = −b32 + 36b2 b4 − 216b6 . Ainsi
si char(K) 6= 2, 3, nous pouvons toujours travailler avec des courbes elliptiques de la
forme [5]
E : y 2 = x3 + Ax + B
Dans ce cas la courbe est lisse (elle possède une tangente en tout point de sa courbe
représentative) si :
4A3 + 27B 2 6= 0.
Remarque. Nous allons dans tout ce qui suit uniquement considérer des corps ayant
une caractéristique différente de 2 et 3.

2.1.2 Approche Géométrique


Soient E une courbe elliptique définie sur un corps K, et deux points P, Q ∈ E(K), L
la droite reliant P à Q (la tangente à E si P = Q) et R le troisième point d’intersection
de L avec E. Soit L0 la droite verticale passant par R. On définit P + Q ∈ E(K) comme
étant le deuxième point d’intersection de L’ avec E. Muni de cette loi de composition
(E(K), +) est un groupe abélien dont l’élément neutre est le point à l’infini (O) [5].

30
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Figure 2.1 – Addition de deux points sur une courbe elliptique sur R.

Cas particuliers :
— Si P1 et P2 sont symétriques par rapport à l’axe des abscisses, on considère alors
que la somme des deux points est nulle. Il s’agit donc du point à l’infini.
— Si la droite (L) est tangente en un point de la courbe, on considère qu’elle intersecte
deux fois la courbe en ce point et par conséquent la somme de P1 et P2 (ou bien
le doublement de P) est le symétrique du point de tangence.

Figure 2.2 – Doublement d’un point sur une courbe elliptique sur R.

31
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

2.1.3 Loi additive et coordonnées


Nous allons maintenant déterminer les relations entre les coordonnées de P1 , P2 et leur
somme P1 + P2 . Ces relations sont indispensables afin de pouvoir appliquer la théorie à
la pratique et ainsi coder une fonction addition sur machine.

Soient E : y 2 = x3 + Ax + B une courbe elliptique et P1 (x1 , y1 ), P2 (x2 , y2 ) des points


de E, avec P1 , P2 6= O. On a P1 + P2 = P3 = (x3 , y3 ) avec [5, 9]
1. Si P1 6= P2 et tous les deux points sont différents de O, l’équation de la droite (L)
est par définition :

y = λ(x − x1 ) + y1 , tq : λ = (y2 − y1 )/(x2 − x1 )

On injecte dans l’équation de E :

(λ(x − x1 ) + y1 )2 = x3 + ax + b
⇔ 0 = x3 − λ2 x2 + K

avec K = (2λ2 x1 − 2y1 λ + a)x − λ2 x21 + 2y1 λx1 + b − y12 . x est donc la racine d’un
polynôme du troisième degré dont nous connaissons déjà deux autres racines : x1
et x2 . On remarque alors que pour tout polynôme de la forme x3 + ax2 + bx + c et
admettant pour racines r, s, t, alors on a : x3 +ax2 +bx+c = (x−r)(x−s)(x−t) =
x3 − (r + s + t)x2 + (rs + rt + st)x − rst. On a alors −a = r + s + t et donc en
connaissant deux racines (par exemple r et s), on peut en déduire la troisième :
t = −a − r − s. Dans notre cas, on obtient alors :

x = −(−λ2 ) − x1 − x2

et donc : 
 x3= λ 2 − x1 − x2
y3 = −(λ(x3 − x1 ) − y1 ) = λ(x1 − x3 ) − y1

2. Si P1 = P2 et y1 6= 0, alors (L) sera une tangente à E dans P1 , d’où la pente λ sera


la dérivée de E en P1 :

λ = dy/dx(x1 , y1 ) = (3x21 + A)/2y1

et puisque x1 est une racine double pour l’équation de (L), on obtiens : x3 =


λ2 − 2x1 , y3 = m(x1 − x3 ) − y1

 x3= λ2 − 2x1
y3 = λ(x1 − x3 ) − y1

3. Si P1 6= P2 mais x1 = x2 y1 6= y2 , alors y12 = x31 + ax1 + b = x32 + ax2 + b = y22 d’où :


y1 = −y2 , les deux points sont donc symétriques par rapport à l’axe des abscisses.
Leur somme est donc le point à l’infini i.e. P1 + P2 = O.
4. Si P1 = P2 et y1 = 0, alors : P3 = O.
5. Si P1 6= P2 et P2 = O alors on a : P1 + P2 = P1 = P3
La multiplication est définie comme une répétition d’additions (ex : 3P = P + P + P ).

32
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

2.1.4 Choix du corps


En pratique, on a besoin d’un groupe avec un nombre fini d’éléments, pour cela on
se place dans un corps Z/pZ. Il s’agit d’un corps de dimension finie. On va donc réaliser
tous les calculs modulo p, c’est-à-dire que l’on considère uniquement les points d’abscisse
entière et inférieure ou égale à p [6].

En pratique, on utilise E définie sur :


— Fp , l’ensemble des entiers modulo p , avec p un grand nombre premier.
— Fn2 , qui peut être vu comme l’ensemble des mots de longueur n , avec n premier.

Ensemble de points
Déterminons l’ensemble des points d’une courbe donnée par une équation mise sous
la forme réduite de Weierstrass i.e. y 2 = x3 + ax + b en se plaçant dans le corps Z/pZ.
Pour cela, on considère x ∈ [1, p]. Pour chaque valeur de x, on calcule x3 + ax + bmodulop.
On en déduit s’il existe un ou plusieurs entier y vérifiant y 2 = x3 + ax + b. Si c’est le cas,
ces valeurs de y ∈ [1, p] nous donnent l’ordonnée des points d’abscisse x appartenant à la
courbe.

Figure 2.3 – EC sur Z/pZ [7].

Cardinalité
Soit E la courbe elliptique définie sur Fq , avec q = p > 5 premier ou q = 2n défnie
comme ci-dessus [7].
L’ensemble des points de E forme un groupe de taille (borne de Hasse-Weil)
√ √
q + 1 − 2 q 6 #E 6 q + 1 + 2 q
Si P est un point de E d’ordre l (i.e lP = O), avec l un nombre premier, on utilise le
groupe
G = {P, 2P, .., lP = O}.
En pratique, on utilise les courbes E telles que
#E = ml,
avec l un grand nombre premier (de taille 160 bits environ) et m petit pour la cryptogra-
phie.

33
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

2.2 Utilisation des courbes elliptiques dans la cryp-


tographie
2.2.1 Cryptage des messages
Il faudra ici encoder le texte clair m comme un point Pm de coordonnées x et y. C’est
ce point qui sera chiffré. Il faut aussi rendre publique un point G et un groupe elliptique
Eq (a, b). Les utilisateurs doivent également choisir une clé privée et générer la clé publique
correspondante. Voyons en premier temps comment encoder le texte clair comme un point
sur la courbe.

Table de correspondance
Cette méthode consiste à ce que les parties communicantes partagent une table de
correspondance, où chaque caractère est équivalent à un point sur la courbe [8].

Figure 2.4 – Exemple de table de correspondance pour E : y 2 = x3 + 2x + 9 (mod 37)

Méthode de Koblitz pour l’encodage du texte clair


Cette méthode est différente de la précèdente. Elle est composée de plusieurs étapes :

— Étape 1 : Choisir une courbe elliptique Ep (a, b).


— Étape 2 : On suppose que E à N points.
— Étape 3 : On suppose que l’alphabet est constitué des nombres 0,1,2,3,4,5,6,7,8,9
et des lettres A,B,C,...X,Y,Z codés en forme de 10, 11,...,35.
— Étape 4 : Cela converti notre message à une série de nombre entre 0 et 35.
— Étape 5 : Choisir un paramètre auxiliaire k = 20 (les deux parties communicantes
doivent se mettre d’accord sur son choix).
— Étape 6 : Pour chaque nombre m, on calcule x = mk + 1 et on essaye de trouver
le correspondant y sur la courbe.
— Étape 7 : Si on ne trouve pas y, on essaye x = mk + 2 et x = mk + 3 jusqu’à
trouver y.

34
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

— Étape 8 : En pratique, on va trouver y avant x = mk + k − 1. Puis on prend


le point (x, y) et on le considère comme m sur E. De cette manière, le message
devient une suite de points sur la courbe.
Notons que la probabilité de ne pas trouver y (et donc ne pas pouvoir associer m à un
point) est de 1/2k [9].

Décodage
Pour retrouver m, il suffit de calculer (x − 1)/y et de prendre le plus grand entier
inférieur à cette valeur.

Exemple Soit une EC tq : p(751), a(-1), b(188), n(727).


— On souhaite convertir le caractère ’B’ vers un point sur la courbe.
— ’B’ est représenté par le nombre 11.
— x = mk + 1 i.e 11 ∗ 20 + 1 = 221 n’a pas de solution tq : y 2 = x3 + ax + b mod p
— De même, pas de solution pour x = mk + 2 et x = mk + 3
— Pour x = mk + 4, x = 224 et y existe (y = 248).
— Le point (224, 248) est donc crypté et décrypté en tant que message.

Protocole d’échange de clés de Diffie-Hellmann


On prend un point de départ G(x1 , y1 ) dans Eq (a, b) dont l’ordre n est élevé. L’ordre
n d’un point sur une EC est le plus petit entier positif tel que nG = O.
L’échange d’une clé par ECC entre deux entités A et B se déroule comme suit :
— A choisit un nA inférieur à n qui sera sa clé privée. A génère alors sa clé publique
PA = nA ∗ G.
— B choisit un nB inférieur à n qui sera sa clé privée. B génère alors sa clé publique
PB = nB ∗ G.
— A génère la clé secrète K = nA ∗ PB et B génère la clé secrète K = nB ∗ PA .

35
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Figure 2.5 – Échange de clés de Diffie Hellman (ECDH)

Notons que K peut être utilisé comme clé secrète pour la cryptographie symétrique
(AES,..) [2].

Cryptage des points


Pour utiliser les courbes elliptiques en cryptographie, il faut trouver un problème
difficile (tel que la factorisation d’un produit en ses facteurs premiers dans le cas du
RSA).
Considérons l’équation
Q = kP
où Q, P ∈ Ep (a, b) et k < p.
Il est facile de calculer Q connaissant k et P . Mais il est difficile de déterminer k si on
connaît Q et P . Il s’agit du problème du logarithme discret pour les courbes elliptiques :
logP (Q).

Pour chiffrer un message, A détermine aléatoirement un nombre entier positif k et


produit Cm comme un couple de points tel que :
Cm = {kG, Pm + kPB }
Pour déchiffrer, B devra multiplier le premier point par sa clé privée, et soustraire le
résultat au second point reçu [2] :
Pm + kPB − nB (kG) = Pm + k(nB G) − nB (kG) = Pm

36
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

2.2.2 Signature électronique d’ElGamal


Les courbes elliptiques peuvent aussi être utilisées pour la signature électronique :
Comment prouver à Bob que le message a bien été envoyé par Alice ?

Nous allons présenter un modèle de signature basé sur les courbes elliptiques et réputé
difficilement falsifiable [5]. Ce modèle utilise les fonctions de hachages (SHA2 où SHA3
sont recommandés).

Supposons donc qu’Alice envoie un message à Bob et qu’elle veuille signer électroni-
quement son message. Si elle utilise la signature ElGamal voici comment elle doit s’y
prendre.
Alice doit tout d’abord créer une clé publique. Pour cela, elle choisit une courbe
elliptique E définie sur un corps fini Fq , de manière que le problème du logarithme
discret soit difficile sur E(Fq ). Elle choisit aussi un point A ∈ E(Fq ), tel que l’ordre n de
A est un grand nombre premier. De plus, elle choisit un nombre secret a et calculeB = aA.
Finalement, Alice choisit encore deux fonctions, une fonction de hachage H : N → N et
une fonction
f : E(Fq ) → Z
Par exemple, si q est un nombre premier, elle peut prendre f (x, y) = x(modq).
L’information publique d’Alice est (E, Fq , A, B, H, f ). Elle garde secret le nombre a.
Pour signer son document, Alice fait comme suit :
1. Elle représente son document sous forme d’un nombre entier m et le hache, c’est-
à-dire calcule H(m) (n étant un grand nombre premier, H(m) 6 n. Si tel n’est
pas le cas, on sépare le message en morceaux m1 , ..., mk tels que chaque H(mi ) 6
n, 1 6 i 6 k.).
2. Elle choisit un nombre entier k avec P GCD(k, n) = 1 et calcule

R = kA.

3. Elle calcule s ≡ k − 1(H(m) − af (R))(mod n).

Le message signé est (m, s, R). Si Alice veut garder son message secret, elle peut par
exemple le crypter avec le ECC ou RSA et utiliser le message crypté au lieu de m.

Pour vérifier l’authenticité de la signature d’Alice, Bob procède de la manière suivante :


1. Il télécharge l’information publique d’Alice.
2. Il calcule
V1 = f (R)B + sRetV2 = H(m)A.
3. Si V1 = V2 alors la signature est valide.

37
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

2.3 Attaques sur la cryptographie à base des courbes


elliptiques
Puisque le cryptage des messages avec des courbes elliptiques se base sur la difficulté
de résoudre le problème du logarithme discret en un temps raisonnable généralement, il
est important de savoir dans quels cas nous pouvons le résoudre rapidement pour éviter
ces cas là.

2.3.1 Baby Step Giant Step



Cette méthode, développée par D. Shanks, fait environ N pas et stocke environ N
données [5].
Nous supposerons qu’il existe un nombre entier k tel que Q = kP avec P, Q ∈ E(Fq )
et que N , l’ordre de E, est connu.

L’algorithme se déroule comme suit :



1. Choisir un entier m > N et calculer mP .
2. Calculer et stocker dans une liste les iP pour 0 6 i < m.
3. Calculer les points Q − jmP pour j = 0, 1, ..., m − 1 jusqu’à ce qu’un de ces
éléments correspondent à un iP de la liste précédente.
4. Si iP = Q − jmP , nous avons Q = kP avec k ≡ i + jm(modN ).

Puisque m2 > N , nous avons 0 6 k < m2 . Ecrivons k = k0 + mk1 , ainsi k ≡ k0 (mod


m) avec 0 6 k0 < m et k1 = (k − k0 )/m et donc 0 6 k1 < m. Posons i = k0 etj = k1 ,
nous obtenons donc
Q − k1 mP = kP − k1 mP = k0 P
est la relation voulue.
Le point iP est calculé en ajoutant P (”baby step”) à (i − 1)P . Le point Q − jmP
est trouvé en ajoutant −mP (”giant step”) à Q − (j − 1)mP .
Remarquons que nous ne devons pas connaître l’ordre exact de E(Fq ). Nous devons
juste connaître une borne supérieure de N . Ainsi pour une courbe elliptique définie sur
un corps fini Fq , nous pouvons prendre un m tel que

m2 > q + 1 + 2 q

par le théorème de Hasse.

Exemple Soit G = E(F4 1), où E est donné par

y 2 = x3 + 2x + 1.

Soient P = (0, 1) et Q = (30, 40). Par le théorème de Hasse, nous savons que l’ordre de
G est au plus 56, posons m = 8. Les points iP pour 0 6 i 6 7 sont

(0, 1), (1, 39), (8, 23), (38, 38), (23, 23), (20, 28), (26, 9).

38
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Calculons Q − jmP pour j = 0, 1, 2

(30, 40), (9, 25), (26, 9),

où nous nous arrêtons puisque le troisième point correspond à 7P . Nous avons donc

Q = (7 + 2 ∗ 8)P = 23P

et nous trouvons k = 23.

2.3.2 L’attaque MOV


Les travaux menés en 1993 par Menezes, Okamoto et Vanstone, qui ont donné leurs
noms à l’attaque MOV, montrent que le problème du logarithme discret sur E(Fp ) peut
être ramené à celui du logarithme discret dans (Fpk )∗ . En particulier dans le cas de
courbes super singulières, il peut être ramené à celui du logarithme discret sur Fpk avec
k ∈ {1, 2, 3, 4, 6}, généralement k = 2. Cela induit un risque car la réduction à un
tel problème se fait en temps polynomial en O(logp), et la résolution du problème du
logarithme discret est alors réalisable par un algorithme probabiliste sous-exponentiel [10].

2.3.3 Force Brute


L’attaque par force brute consiste à calculer P, 2P, ..., jusqu’à ce qu’on trouve k. Au
pire des cas l’attaque nécessite n opérations (l’ordre de la courbe).

En 1996 une attaque sur un système cryptographique basé sur les EC de clé de 120
bits a été esquissée et réalisée après 3 ans. L’attaque était basée sur un matériel dédié
qui peut faire 25 million d’opérations en parallèle. Le coût de construire cette machine
était de $10 million et le temps nécessaire pour obtenir la clé était 32 jours. [11]

2.3.4 Attaques par canaux cachés


L’idée principale des attaques par canaux cachés est d’analyser le temps de calcul
nécessaire pour compléter le chiffrement. L’exécution d’un algorithme de chiffrement par
un processeur peut laisser échapper de nombreuses informations en rapport avec la clé de
chiffrement. Ces informations peuvent être le temps de calcul, la consommation d’énergie,
le rayonnement électromagnétique, voire même le son émis par le processeur [12].

Figure 2.6 – Analyse des bits par canaux cachés

39
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Puisque le chiffrement d’un point avec les courbes elliptiques (la multiplication d’un
point k fois où k est la clé) est une succession de doublements et d’addition de points
dont l’enchaînement dépend directement de la clé, cette dernière peut être extraite.

Pour éviter ces attaques, on peut :


— Adapter les algorithmes des chaînes d’additions euclidiennes ou différentielles [12].
— Rajouter de l’aléa pour masquer la clé.

Recomendation Le NIST a publiée ces recommandation sur les courbes à utiliser [13].
Soit la courbe E : y 2 = x3 + ax + b (mod p) avec r l’ordre du point de base.
Selon la taille de la clé, les paramètres : a, b, p, r seront :
— Pour une clé de 192 bits :
— a = -3
— b = 24551555460089438177402939151974517847691080
58161191238065
— p = 62771017353866807638357894232076664160839087
00390324961279
— r = 26959946667150639794667015087019625940457807
714424391721682722368061
— Pour une clé de 224 bits :
— a = -3
— b = 18958286285566608000408668544493926415504680
968679321075787234672564
— p = 269599466671506397946670150870196306735579
16260026308143510066298881
— r = 269599466671506397946670150870196259404578
07714424391721682722368061
— Pour une clé de 256 bits :
— a = -3
— b = 410583637251521421293261297800472684091144
41015993725554835256314039467401291
— p = 11579208921035624876269744694940757353008614
3415290314195533631308867097853951
— r = 11579208921035624876269744694940757352999695
5224135760342422259061068512044369
— Pour une clé de 384 bits :
— a = -3
— b = 27580193559959705877849011840389048093056905
8563615685214287073019886892413098608651362
60764883745107765439761230575
— p = 39402006196394479212279040100143613805079739
27046544666794829340424572177149687032904726
6088258938001861606973112319

40
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

— r = 39402006196394479212279040100143613805079739
27046544666794690527962765939911326356939895
6308152294913554433653942643
— Pour une clé de 521 bits :
— a = -3
— b=
— p = 68647976601306097149819007990813932172694353
00143305409394463459185543183397656052122559
64066145455497729631139148085803712198799971
6643812574028291115057151
— r = 68647976601306097149819007990813932172694353
00143305409394463459185543183397655394245057
74633321719753296399637136332111386476861244
0380340372808892707005449

41
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

2.4 Utilisation de la cryptographie à base des courbes


elliptiques
2.4.1 Efficacité des courbes elliptiques
Les courbes elliptiques fournissent de bons candidats de groupes car [7] :
— Elles forment un groupe, avec #E v O(p)
— On dispose d’une arithmétique efficace.
— Pas de meilleure attaque connue que les attaques génériques.
— Clés plus faciles à générer et plus petites qu’avec RSA.

On remarque dans le tableau suivant que le DL 1 sur un groupe définie sur les EC utilise
une clé moins petite que sur un autre groupe.

Année 1982 2000 2005 2010 2020 2050


DL sur Fp 407 952 1149 1369 1881 4047
ou Fn2
DL sur E 105 132 139 146 161 206
définie
sur Fp ou
Fn2
Table 2.1 – Estimations sur les tailles de problèmes atteignables [14]

2.4.2 Comparaison entre RSA et ECC


Dérivation de clé
Deux algorithmes de cryptage sont considérés comparables si le travaille nécessaire
pour obtenir la clé est approximativement le même. Le niveau de sécurité d’un algorithme
pour une taille de clé donnée est décrit par la quantité de travail nécessaire pour essayer
toutes les clés pour un algorithme symétrique avec une taille de clé de "X-bits". Un
algorithme qui a une clé de "Y-bits" mais son niveau de sécurité est équivalent à un
algorithme symétrique à clé de taille "X" est dit : "a une sécurité de niveau X-bits" [13].
Déterminer le niveau de sécurité d’un algorithme peut être non trivial, car cela dépend
des attaques connues de nos jours. Les futures recherches peuvent affecter ces résultats.

La meilleur attaque
√ connue sur les courbes elliptiques est "Baby Step Giant Step" qui
est de l’ordre de O( 2n/2 ) [6] où n est la taille du groupe fini de la courbe en bits. Par
exemple, pour avoir une sécurité de 128-bits, il faut choisir un groupe de taille 256-bits
(voir figure 2.7).
1. Discrete Logarithm

42
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Pour RSA, le meilleur algorithme connue est l’algorithme GNFS 2 pour factoriser un
entier. Il a un ordre de [15] s !
3 64 2
O exp n(logn)
9
où n est le nombre à factoriser.

L’application des deux formules précédente nous donne le tableau suivant (publié par
le NIST en 2007) qui illustre bien le bénéfice d’utiliser les courbes elliptiques [16], tq :
— L La taille de la clé publique
— N La taille de la clé privé
— k et f La taille de la clé de chiffrement

Figure 2.7 – Points forts comparables

Pour s’assurer des résultats donnés par le NIST, on a développé un script en Node.JS
qui nous donne le nombre de bits de sécurité selon la longueur de la clé.
var b i g I n t = r e q u i r e ( ’ big−i n t e g e r ’ ) ;

var l o g F o r B i g I n t s = f u n c t i o n ( b i g I n t ) {
var s t r i n g = b i g I n t . t o S t r i n g ( ) ;
r e t u r n s t r i n g . l e n g t h ∗ Math . l o g ( 1 0 ) + Math . l o g ( p a r s e F l o a t ( ’ 0 . ’ + s t r i n g ) ) ;
}

var getRSAStrength = f u n c t i o n ( modulus ) {


var n a t u r a l L o g = l o g F o r B i g I n t s ( b i g I n t ( 2 ) . pow ( modulus ) )
r e t u r n Math . f l o o r ( Math . l o g 2 ( Math . exp ( Math . c b r t ( ( 6 4 / 9 ) ∗ n a t u r a l L o g )
∗ Math . pow ( Math . l o g ( n a t u r a l L o g ) , 2 / 3 ) ) ) )
}

2. General Number Field Sieve

43
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

var getECCStrength = f u n c t i o n ( p S i z e ) {
r e t u r n Math . l o g 2 ( Math . pow ( Math . pow ( 2 , p S i z e ) , 0 . 5 ) )
}

RSA Bits de sécurité ECC Bits de sécurité


1024 86 160 80
2048 116 224 112
3072 138 256 128
7680 203 368 184
15360 269 512 256

Table 2.2 – Comparaison entre RSA et ECC en nombre de bits

On peut bien remarquer que nos résultats sont proches des résultats donnés par le
NIST. On justifie la différence par le savoir que le NIST est une société administrative
qui a comme rôle "produire les guides aux agences du gouvernement américain", et pour
faciliter la tâche aux utilisateurs, elle a regroupé tous ces résultats dans un seul tableau
et a arrondi quelques valeurs. L’utilisateur décide en premier temps le niveau de sécurité
nécessaire pour son application, puis il choisie le nombre de bits correspondant à son
algorithme.

On peut conclure cette partie en disant que pour un système basé sur RSA avec 2048
bits, on peut avoir une sécurité équivalente seulement avec 224 bits avec les EC.

Analyse de performance
Pour faire une comparaison détaillée entre RSA et la ECC en terme de performance,
on va utiliser comme base le rapport annuel de l’académie de recherche européenne
ECRYPT2 [17, 18]. Ils ont fait une expérience sur 3 différentes machines avec différentes
architectures, où ils ont effectué trois différents processus : signature, vérification de si-
gnature et génération de clé.

44
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Génération de signature

Figure 2.8 – Génération de signature

On remarque bien que la ECDSA 3 et toujours plus rapide que le RSA pour les diffé-
rentes machines. En plus, l’éfficassité des courbes elliptiques augmente avec le niveau de
sécurité.

Vérification de signature

Figure 2.9 – Vérification de signature

Contrairement à la signature, le temps d’exécution pour les EC est plus long que celui
de RSA.
3. Elliptic Curve Digital Signature Algorithm.

45
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Génération de clé

Figure 2.10 – Génération de clé

On remarque le temps nécessaire pour la génération de la clé est très petit pour toutes
les différentes machines et tous les niveaux de sécurité, contrairement à RSA, qui est plus
longs.

Conslusion
On peut bien dire que ECDSA est plus rapide que RSA pour la signature et la géné-
ration de la clé. Malgré que la vérification consomme plus de temps, cette opération est
généralement effectuée sur des machines puissantes et non pas sur les smart-card et les
terminaux à faible coût.

2.4.3 Applications qui utilisent la ECC


De nos jours, plusieurs protocoles et plateformes utilisent la cryptographie à base des
courbes elliptiques à cause de sa rapidité et sa sécurité. On cite :
— TLS Le protocole de sécurisation d’échange sur internet (Transport Layer Secu-
rity) utilise la ECC dans la phase "Handshake" pour l’agrément sur la clé à utiliser
pour chaque session.
— Smart Cards A coté de RSA, les nouvelles smart-card support la ECC.
— Passport Biométrique La ECC est utilisée pour construire la clé de session.
— Bitcoin La ECC est utilisée pour la signature électronique pendant les transac-
tions des paiement avec Bitcoin (figure 3.6).

46
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Figure 2.11 – La courbe Secp256k1 utilisé par Bitcoin y 2 = x3 + 7.

2.4.4 Considération sur les brevets


L’ incertitude liée aux brevets autour de la cryptographie avec courbes elliptiques
(ECC), ou des brevets ECC, est l’un des principaux facteurs limitant sa large acceptation.
Selon Bruce Schneier 4 au 31 mai 2007, "Certicom peut certainement revendiquer la
propriété d’ECC. L’algorithme a été développé et breveté par les fondateurs de l’en-
treprise, et les brevets sont bien écrits et solides. Je ne l’aime pas, mais ils peuvent
Revendiquer la propriété " [17].
Cependant, selon RSA Laboratories : « dans tous ces cas, c’est la technique de mise
en œuvre qui est brevetée, pas la première ou la représentation, et il existe des techniques
de mise en œuvre alternatives et non compatibles avec les brevets » [17].

4. Bruce Schneier est un cryptologue, un spécialiste en sécurité informatique et un écrivain américain.


Il est l’auteur de plusieurs livres sur la cryptographie et il est le fondateur de la société Counterpane
Internet Security.

47
Chapitre 2. La Cryptographie sur Les Courbes Elliptiques

Conclusion

Dans ce chapitre nous avons explorer la théorie des courbes elliptiques et le problème
du logarithme discret, qui est la base de la cryptographie sur des courbes elliptiques.
Nous avons choisie la courbe elliptique adéquate afin d’avoir un cryptosystème simple.
Ce choix est primordiale.

Nous avons vu les différentes attaques connues sur les courbes elliptiques et que mal-
gré que la théorie derrière la cryptographie à base des courbes elliptiques soit solide, la
mauvaise implémentation sur machine peut rendre une attaque par canaux cachés très
facile, d’où il faut bien prendre ce point en compte lors du développement.

Nous avons exploité aussi les différentes applications et protocoles de nos jours qui
utilisent la cryptographie à base des courbes elliptiques. Il a été possible de comparer
cette méthode de chiffrement avec le RSA. Les résultats on démontrés la rapidité et la
sécurité de la cryptographie à base des courbes elliptiques par rapport à RSA avec une
petite clé.

48
Chapitre 3

Conception et implémentation

49
Chapitre 3. Conception et implémentation

Introduction

La difficulté d’implémenter la cryptographie à base des courbes elliptiques a causé un


manque dans ce domaine. Avec le mouvement vers l’IoT 1 , il est devenu impérativement
nécessaire d’aller vers la cryptographie à base des courbes elliptique à cause de sa rapidité
remarquable.

Nous allons montrer dans ce chapitre les étapes et moyens qu’on a utilisé pour implé-
menter notre application qui peut utiliser des clé de 224 bits.

Nous allons en premier temps expliquer la conception de notre application, puis détailler
le code source et les fonctions principales de notre application.

1. Internet of Things

50
Chapitre 3. Conception et implémentation

3.1 Conception
L’étude de conception est la phase la plus importante du cycle de développement d’un
système informatique. En effet, elle permet de confronter la spécification et l’analyse avec
l’implémentation. Elle présente le point de convergence des deux aspects : « Le quoi faire
» (analyse) et le « comment faire » (réalisation). Ceci justifie, parfois, le retour vers une
étape antérieur afin de rectifier un besoin pour l’implémenter, ou affiner l’analyse. Pour
cette raison, on consacre cette partie à la conception de notre application.

On souhaite développer une application Desktop qui nous permet de faire la crypto-
graphie à base des courbes elliptiques. L’utilité de cette application est la démonstration
du principe des courbes elliptiques. Pour cela, l’utilisateur va avoir deux fenêtres qui
représentent les deux parties communicantes : Alice et Bob.

La courbe utilisée par défaut est la NIST p-224, d’où la génération des clés et le partage
des paramètres publiques se font automatiquement au démarrage.

La figure suivante montre le diagramme d’activité des différentes taches effectuées par
notre application :

51
Chapitre 3. Conception et implémentation

Figure 3.1 – Diagramme d’activité du fonctionnement global de l’application.

52
Chapitre 3. Conception et implémentation

3.2 Implémentation
Dans cette partie, on va aborder le coté implémentation de l’application, où on par-
lera des différentes classes et ressources utilisées. On va donner un soin particulier pour
détailler quelques morceaux de code afin de mieux expliquer le fonctionnement de l’ap-
plication. On discutera aussi les différents problèmes rencontrés durant le développement
de l’application ainsi que les moyens utilisés pour les résoudre.

3.2.1 Outils et Environnement


— Pc Lenovo G580, processeur Intel core TM i7, RAM 8Go.
— Système d’exploitation Ubuntu 16.04.
— QtCreator v5.7 (C++).
— La librairie MPI (pour les grand nombres).

3.2.2 Intérface principale


L’application démarre avec la courbe NIST p-224 par défaut. Autres courbes peuvent
être utilisées en remplissant les champs adéquats.

Figure 3.2 – Intérface principale de l’application.

A chaque lancement de l’application, la clé privée de Bob et Alice sont générées


aléatoirement. Ceci est pour assurer le principe du "PFS 2 "
2. Perfect Forward Secrecy : ou bien La confidentialité persistante, qui est une propriété qui garanti
que la découverte par un adversaire de la clé privée d’un correspondant ne compromet pas la confiden-
tialité des communications passées.

53
Chapitre 3. Conception et implémentation

Pour crypter un message, Alice entre son texte dans le champ "message" et clique sur le
bouton "Crypter". Elle aura comme sortie une suite de points séparés par # qui représente
le texte chiffré avec la clé publique de Bob.

Figure 3.3 – Cryptage du message par Alice.

De sa part, Bob, pour déchiffrer le message de Alice, Bob met le texte envoyé par
Alice dans la zone "Décryptage" et clique sur le bouton "Décrypter"

Figure 3.4 – Déryptage du message par Bob.

Si la courbe utilisée a un p < 1000, l’application peut donner une représentation gra-
phique de cette dernière.

54
Chapitre 3. Conception et implémentation

Figure 3.5 – Représentation graphique de la courbe y 2 = x3 − 3x + 5 sur Z/167Z

Figure 3.6 – Représentation graphique de la courbe y 2 = x3 − 3x + 5 sur R

3.2.3 Classes
Les principes de base pour la POO 3 ont été adoptés au cours de ce projet. Ceci
assure un maintien facile de l’application ainsi qu’une meilleure organisation des différents
modules tout au long du cycle de développement.
3. Programmation Orientée Objet

55
Chapitre 3. Conception et implémentation

On a 5 classes principales :
1. MyPoint : représente un point de la courbe.
c l a s s MyPoint
{
public :
MyPoint ( ) ;
MyPoint ( mpi x , mpi y ) ;
v o i d setX ( mpi x ) ;
v o i d setY ( mpi y ) ;
mpi X ( ) ;
mpi Y ( ) ;
s t a t i c mpi stringToMPI ( QString t e x t ) ;
QString mpiToString ( mpi number ) ;
QString t o S t r i n g ( ) ;
b o o l e q u a l ( MyPoint ∗p2 ) ;

private :
mpi x , y ;
};

2. MyCM : représente le cipher finale Cm = {kG, Pm + kPB }.


c l a s s MyCM
{
public :
MyCM( ) ;
MyCM( MyPoint ∗p1 , MyPoint ∗p2 ) ;
v o i d setP1 ( MyPoint ∗p ) ;
v o i d setP2 ( MyPoint ∗p ) ;
MyPoint ∗ getP1 ( ) ;
MyPoint ∗ getP2 ( ) ;
s t a t i c mpi stringToMPI ( QString t e x t ) ;
QString mpiToString ( mpi number ) ;
QString t o S t r i n g ( ) ;

private :
MyPoint ∗p1 , ∗p2 ;
};

3. ECC_BIG : est dédié aux opérations de cryptage et de décryptage des points de


la courbe. Elle contient aussi l’implémentation du codage / décodage des chaînes
de caractères en points sur la courbe et vice versa.
c l a s s ECC_BIG
{
public :
ECC_BIG ( ) ;

MyPoint ∗ e n c r y p t P o i n t F a s t ( MyPoint ∗p_new , mpi c o u n t e r ) ;


MyPoint ∗ d e c r y p t P o i n t ( MyPoint ∗p ) ;
MyPoint ∗ addDouble ( MyPoint ∗ p o i n t ) ;
MyPoint ∗ addP oints ( MyPoint ∗ p o i n t 1 , MyPoint ∗ p o i n t 2 ) ;

QList<MyPoint ∗> ∗ t e x t T o P o i n t s ( QString t e x t ) ;


i n t charToCode ( QChar ch ) ;
QChar codeToChar ( i n t code ) ;
s t a t i c mpi stringToMPI ( QString t e x t ) ;

56
Chapitre 3. Conception et implémentation

QString mpiToString ( mpi number ) ;

MyCM ∗ generateCm ( . . . ) ;
mpi g e n e r a t e P r i v a t e K e y ( ) ;
b o o l isOnCurve ( mpi x , mpi y ) ;
QString pointsToText ( QList<MyPoint∗> ∗ l i s t ) ;
QString p o i n t T o S t r i n g ( MyPoint ∗p ) ;

private :
int a ;
mpi b ;
mpi p ;
mpi r ;
};

4. BigWindow : est la représentation graphique de la fenêtre principale et l’inter-


médiaire entre l’utilisateur et les différentes opérations de cryptages / décryptages.
c l a s s BigWindow : p u b l i c QMainWindow
{
public :
void generate_equation ( ) ;
mpi generatePrimeMPI ( ) ;
void generatePrivateKeys ( ) ;
void generatePublicKeys ( ) ;
v o i d generateRandomK ( ) ;
QList<MyCM ∗> textToMyCMList ( QString t e x t ) ;
s t a t i c MyCM ∗stringToMyCM ( QString a r g 0 ) ;

private :
mpi private_key_a , private_key_b ;
MyPoint ∗ public_key_a , ∗ public_key_b ;
ECC_BIG ∗ ecc_big ;
mpi k_a , k_b ;
};

5. DialogPlot : qui contient la représentation graphique de la courbe (pour p <


1000).

c l a s s D i a l o g P l o t : p u b l i c QDialog
{
public :
v o i d setA ( i n t a ) ;
v o i d setB ( i n t b ) ;
v o i d setP ( i n t p ) ;
v o i d setR ( i n t r ) ;
b o o l drawCurve ( ) ;
b o o l drawCurveR ( ) ;

private :
int a , b , p , r ;
};

3.2.4 Etapes de génération de la clé publique


Après de faire le choix de la courbe et le point de base, chaque partie (Alice et Bob)
génère ça clé privé puis ça clé publique.

57
Chapitre 3. Conception et implémentation

La clé privée nA est un nombre aléatoire inférieur à r (l’ordre du point de base). La


fonction generateP rivateKey() nous permet de générer ce nombre :
mpi ECC_BIG : : g e n e r a t e P r i v a t e K e y ( )
{
// r i s t h e max v a l u e
i n t r _ s i z e = mpi_size (& r ) ;
mpi key ; mpi_init (&key ) ;

do{
mpi_fill_random(&key , r _ s i z e , generateRNG , NULL ) ;
} w h i l e ( mpi_cmp_mpi(&key , &r ) == 1 ) ;

r e t u r n key ;
}

La clé publique PA est la multiplication de nA avec le point de base G : nA ∗ G. La


fonction encryptP ointF ast() nous permet de faire cette multiplication.
MyPoint ∗ECC_BIG : : e n c r y p t P o i n t F a s t ( MyPoint ∗p_new , mpi c o u n t e r )
{
MyPoint ∗q = new MyPoint ( p_new−>X( ) , p_new−>Y ( ) ) ;

MyPoint ∗ r = new MyPoint ( ) ;


i n t nb_double = 0 ;
i n t nb_add = 0 ;
t_uint temp_mod = 0 ;
t_uint temp_1 = 1 ;
mpi k ; mpi_init (&k ) ;
mpi_copy(&k , &c o u n t e r ) ;

// Double and Add Algorithm


w h i l e ( mpi_cmp_int(&k , 0 ) == 1 ) {
mpi_mod_int(&temp_mod , &k , 2 ) ;

i f (temp_mod == temp_1 ) {
r = a ddPoint s ( r , q ) ;
nb_add++;
}

mpi_div_int(&k , NULL, &k , 2 ) ;

i f ( mpi_cmp_int(&k , 0 ) == 1 ) {
nb_double++;
q = addDouble ( q ) ;

}
}
return r ;
}

encryptPointFast()
En effet, la fonction encryptP ointF ast() est au cœur de cette application, détaillons
alors son fonctionnement :
On fait appelle à deux fonctions : addDouble(M yP oint ∗ p) et addP oints(M yP oint ∗
p1, M yP oint ∗ p2).

58
Chapitre 3. Conception et implémentation

La fonction addDouble(M yP oint ∗ p) exécute le doublement d’un point comme illustré


dans la partie théorique :
MyPoint ∗ECC_BIG : : addDouble ( MyPoint ∗ p o i n t )
{
mpi s , n , p_x , p_y , d ;
mpi temp_x_public , temp_y_public ;

mpi_init (& s ) ; mpi_init (&n ) ;


mpi_init (&p_x ) ; mpi_init (&p_y ) ;
mpi_init (&d ) ;
mpi_init (&temp_x_public ) ; mpi_init (&temp_y_public ) ;

p_x = p o i n t −>X ( ) ; p_y = p o i n t −>Y ( ) ;

mpi_mul_mpi(&n , &p_x , &p_x ) ;


mpi_mul_int(&n , &n , 3 ) ;

mpi_add_int(&n , &n , a ) ;
mpi_mul_int(&d , &p_y , 2 ) ;

i f ( mpi_cmp_int(&d , 0 ) == −1){
mpi_mul_negative(&n , &n , −1);
mpi_mul_negative(&d , &d , −1);
}

mpi x , temp0 ;
mpi_init (&x ) ; mpi_init (&temp0 ) ;

mpi_inv_mod(&x , &d , &p ) ;


mpi_mul_mpi(&temp0 , &x , &n ) ;
i f ( mpi_cmp_int(&temp0 , 0 ) == 1 ) {
mpi_mod_mpi(&s , &temp0 , &p ) ;
}
else {
s = NegModMPI(&temp0 , &p ) ;
}

mpi xr_ , temp1 , temp2 ;


mpi_init (&xr_ ) ;
mpi_init (&temp1 ) ;
mpi_init (&temp2 ) ;

mpi_mul_mpi(&temp1 , &s , &s ) ;


mpi_mul_int(&temp2 , &p_x , 2 ) ;
mpi_sub_mpi(&xr_ , &temp1 , &temp2 ) ;

i f ( mpi_cmp_int(&xr_ , 0 ) == −1){ //xr_ < 0


temp_x_public = NegModMPI(&xr_ , &p ) ;
}
else {
mpi_mod_mpi(&temp_x_public , &xr_ , &p ) ;
}

mpi yr_ , temp3 ;


mpi_init (&yr_ ) ;
mpi_init (&temp3 ) ;

59
Chapitre 3. Conception et implémentation

mpi_sub_mpi(&temp3 , &p_x , &temp_x_public ) ;


mpi_mul_mpi(&temp3 , &s , &temp3 ) ;
mpi_sub_mpi(&yr_ , &temp3 , &p_y ) ;

i f ( mpi_cmp_int(&yr_ , 0 ) == −1){ //yr_ < 0


temp_y_public = NegModMPI(&yr_ , &p ) ;
}
else {
mpi_mod_mpi(&temp_y_public , &yr_ , &p ) ;
}

r e t u r n new MyPoint ( temp_x_public , temp_y_public ) ;


}

La fonction addP oints(M yP oint ∗ p1, M yP oint ∗ p2) exécute l’addition de deux points
différents :
MyPoint ∗ECC_BIG : : addPoi nts ( MyPoint ∗ p o i n t 1 , MyPoint ∗ p o i n t 2 )
{
mpi s , n , p1_x , p1_y , p2_x , p2_y , d ;
mpi temp_x_public , temp_y_public ;

mpi_init (& s ) ; mpi_init (&n ) ;


mpi_init (&p1_x ) ; mpi_init (&p1_y ) ;
mpi_init (&p2_x ) ; mpi_init (&p2_y ) ;
mpi_init (&d ) ;
mpi_init (&temp_x_public ) ; mpi_init (&temp_y_public ) ;

p1_x = p o i n t 1 −>X ( ) ; p1_y = p o i n t 1 −>Y ( ) ;


p2_x = p o i n t 2 −>X ( ) ; p2_y = p o i n t 2 −>Y ( ) ;

// t e s t i f no one o f t h e p o i n t s i s an i n f i n i t e number
i f ( ( mpi_cmp_int(&p1_x , 0 ) == 0 ) && ( mpi_cmp_int(&p1_y , 0 ) == 0 ) ) {
MyPoint ∗pppp = new MyPoint ( p o i n t 2 −>X( ) , p o i n t 2 −>Y ( ) ) ;
r e t u r n pppp ;
}
i f ( ( mpi_cmp_int(&p2_x , 0 ) == 0 ) && ( mpi_cmp_int(&p2_y , 0 ) == 0 ) ) {
r e t u r n new MyPoint ( p o i n t 1 −>X( ) , p o i n t 1 −>Y ( ) ) ;
}

mpi_sub_mpi(&n , &p1_y , &p2_y ) ;


mpi_sub_mpi(&d , &p1_x , &p2_x ) ;

i f ( mpi_cmp_int(&d , 0 ) == −1){
mpi_mul_negative(&n , &n , −1);
mpi_mul_negative(&d , &d , −1);
}

mpi x , temp0 ;
mpi_init (&x ) ;
mpi_init (&temp0 ) ;

mpi_inv_mod(&x , &d , &p ) ;


mpi_mul_mpi(&temp0 , &x , &n ) ;

i f ( mpi_cmp_int(&temp0 , 0 ) == 1 ) { // temp0 > 0


mpi_mod_mpi(&s , &temp0 , &p ) ;

60
Chapitre 3. Conception et implémentation

}
else {
s = NegModMPI(&temp0 , &p ) ;
}

mpi xr_ , temp1 , temp2 ;


mpi_init (&xr_ ) ;
mpi_init (&temp1 ) ;
mpi_init (&temp2 ) ;

mpi_mul_mpi(&temp1 , &s , &s ) ;


mpi_add_mpi(&temp2 , &p1_x , &p2_x ) ;
mpi_sub_mpi(&xr_ , &temp1 , &temp2 ) ;

i f ( mpi_cmp_int(&xr_ , 0 ) == −1){ //xr_ < 0


temp_x_public = NegModMPI(&xr_ , &p ) ;
}
else {
mpi_mod_mpi(&temp_x_public , &xr_ , &p ) ;
}

mpi yr_ , temp3 ;


mpi_init (&yr_ ) ;
mpi_init (&temp3 ) ;

mpi_sub_mpi(&temp3 , &p1_x , &temp_x_public ) ;


mpi_mul_mpi(&temp3 , &s , &temp3 ) ;
mpi_sub_mpi(&yr_ , &temp3 , &p1_y ) ;

i f ( mpi_cmp_int(&yr_ , 0 ) == −1){ //yr_ < 0


temp_y_public = NegModMPI(&yr_ , &p ) ;
}
else {
mpi_mod_mpi(&temp_y_public , &yr_ , &p ) ;
}

r e t u r n new MyPoint ( temp_x_public , temp_y_public ) ;


}

Au lieu d’utiliser l’algorithme naïve pour faire la multiplication d’un point avec nA (1
doublement + (nA − 1) addition), on a implémenté l’algorithme "Double and Add" [7],
qui rend la multiplication plus rapide.

L’algorithme Double and Add


— Entrée : Un point P d’une courbe elliptique E et un entier k tq : 1 < k < r
— Sortie : Le point Q = kP
1. R := O ; Q := P ;
2. tant que k > 0 faire
(a) si k mod 2 == 1 alors R := R + Q
k
(b) Q := 2 ∗ Q ; k := 2
;
3. Renvoyer R ;

61
Chapitre 3. Conception et implémentation

Exemple Si k = 947 = 29 + 28 + 27 + 25 + 24 + 21 + 20 , alors kP = P + 2P + 16P +


32P + 128P + 256P + 512P . On effectue 9 doublements et 6 additions au lieu de 946
additions.

3.2.5 Etapes de cryptage


Tout d’abord, il faut coder chaque caractère alphanumérique par un point sur la
courbe. Pour cela, on va utiliser une table de correspondance, comme illustré dans la
partie théorique.

La fonction charT oCode(QChar ch) permet de convertir un caractère en un entier


(entre 1 et 37), puis la fonction generateP oint(int m) renvoie le point correspondant à
ce caractère en multipliant le point de base m fois.
MyPoint ∗ECC_BIG : : g e n e r a t e P o i n t ( i n t m)
{
r e t u r n e n c r y p t P o i n t F a s t ( base_point , stringToMPI ( QString : : number (m) ) ) ;
}

Après avoir la liste des points sur la courbe correspondant du texte à chiffrer, on génère
un nombre aléatoire kA < r pour générer le couple Cm que Alice va envoyer à la deuxième
entité (Bob).

Pour générer Cm , on appelle la fonction generateCm(..)


MyCM ∗ECC_BIG : : generateCm ( mpi c o u n t e r , MyPoint ∗ p o i n t , MyPoint ∗ public_key )
{
// n_A∗G
MyPoint ∗p1 = e n c r y p t P o i n t F a s t ( base_point , c o u n t e r ) ;
//n_A∗P_B
MyPoint ∗p2 = e n c r y p t P o i n t F a s t ( public_key , c o u n t e r ) ;
//p + n_A∗P_B
p2 = addPoi nts ( p o i n t , p2 ) ;

r e t u r n new MyCM ( p1 , p2 ) ;
}

Le premier paramètre est kA , le deuxième est le point qu’on veut crypté et le troisième
paramètre est la clé publique de Bob.
On appelle cette fonction autant de fois qu’on a des points, puis on envoie le tout à
Bob.

3.2.6 Etapes de décryptage


Pour décrypter un point, Bob prend p1, le premier point de l’ensemble Cm {p1, p2} et
le multilplie par sa clé privé nB et renvoie le résultat vers une variable temporaire soit
pp1.
La prochaine étape consiste à soustraire ce point de p2 pour avoir le point clair
(équivalent aux texte clair).
MyPoint ∗pp1 = ecc_big−>e n c r y p t P o i n t F a s t ( p1 , private_key_a ) ;

mpi temp_y ; mpi_init (&temp_y ) ;

62
Chapitre 3. Conception et implémentation

temp_y = pp1−>Y ( ) ;
mpi_mul_negative(&temp_y , &temp_y , −1);

pp1−>setY ( temp_y ) ;

// pp2 e s t l e p o i n t en c l a i r e
MyPoint ∗pp2 = ecc_big−>ad dPoints ( p2 , pp1 ) ;

Par la fin, on appelle la fonction pointT oString(M yP oint ∗p) pour retrouver le caratère
correspendant à ce point.
QString ECC_BIG : : p o i n t T o S t r i n g ( MyPoint ∗p )
{
f o r ( i n t i =1; i < 3 8 ; i ++){
mpi c o u n t e r ; mpi_init (& c o u n t e r ) ;
c o u n t e r = stringToMPI ( QString : : number ( i ) ) ;
MyPoint ∗p2 = e n c r y p t P o i n t F a s t ( base_point , c o u n t e r ) ;
i f ( p2−>e q u a l ( p ) ) r e t u r n codeToChar ( i ) . toUpper ( ) ;
}
return " " ;
}

3.2.7 Affichage graphique


Sur Z/pZ L’affichage de la courbe se fait à l’aide de la fonction drawCurve() qui
cherche la liste de tous les points sur la courbe d’une fonction exhaustive, puis les affiche.
b o o l D i a l o g P l o t : : drawCurve ( )
{
i f ( p > 1000 | | p < 5 ) r e t u r n f a l s e ;

QList<QPoint ∗> ∗ l i s t = new QList<QPoint ∗ >();


f o r ( i n t x = 0 ; x < p ; x++) {
l o n g yy = x∗x∗x +a ∗x +b ;
f o r ( i n t y = 0 ; y < p ; y++) {
int k = y ∗ y ;
i f ( k % p == yy % p ) {
l i s t −>append ( new QPoint ( x , y ) ) ;
}
}
}

QVector<double> x0 ( l i s t −>s i z e ( ) ) , y0 ( l i s t −>s i z e ( ) ) ;

f o r ( i n t i = 0 ; i < l i s t −>s i z e ( ) ; i ++){


x0 [ i ] = l i s t −>a t ( i )−>x ( ) ;
y0 [ i ] = l i s t −>a t ( i )−>y ( ) ;
}

// c r e a t e graph and a s s i g n data t o i t :


ui−>customPlot−>addGraph ( ) ;
ui−>customPlot−>graph (0)−> s e t D a t a ( x0 , y0 ) ;

ui−>customPlot−>xAxis−>s e t L a b e l ( " x " ) ;


ui−>customPlot−>yAxis−>s e t L a b e l ( " y " ) ;
ui−>customPlot−>r e p l o t ( ) ;

63
Chapitre 3. Conception et implémentation

return true ;
}

Sur R L’affichage de la courbe sur R se fait à l’aide de la fonction drawCurveR() qui


génère des points x sur R dans l’intervalle [−10, 10], puis calcule y.
i n t nb_points = 2 0 0 0 0 ;
i n t x_limit = 20;
i n t y_limit = 40;

QVector<QCPCurveData> data1 ( nb_points ) ;


QVector<QCPCurveData> data2 ( nb_points ) ;

f o r ( i n t i = 0 ; i < nb_points ; i ++){


d o u b l e x = ( i ∗ x _ l i m i t ) / ( d o u b l e ) nb_points −x _ l i m i t / 2 ;
d o u b l e y = x∗x∗x +a ∗x +b ;
y = qSqrt ( y ) ;

data1 [ i ] = QCPCurveData ( i , x , y ) ;
data2 [ i ] = QCPCurveData ( i , x , −y ) ;
}

QCPCurve ∗ c1 = new QCPCurve ( customPlot_R−>xAxis , customPlot_R−>yAxis ) ;


QCPCurve ∗ c2 = new QCPCurve ( customPlot_R−>xAxis , customPlot_R−>yAxis ) ;

ui−>customPlot−>r e s c a l e A x e s ( ) ;

64
Chapitre 3. Conception et implémentation

Conclusion

Nous avons vu dans cette partie les étapes et les fonctions nécessaires pour implémen-
ter la cryptographie à base des courbes elliptiques (ECC). Malgré qu’il est plutôt un peu
délicat de mettre en œuvre ce cryptosystème, la manière que la partie théorique a été
présenté nous a aidé à coder plus rapidement juste en suivant l’algorithme de base.

65
Conclusion Générale

Dans le cadre de ce projet de fin d’études, on s’est intéressé à la cryptographie à


base des courbes elliptiques. Malgré que la recherche dans ce domaine est active, il a été
difficile de trouver des articles ou des livres qui explique bien cette technique de cryptage.

Pour pallier à ce manque, on c’est intéressé à rédiger ce mémoire en commencent par


une vue globale sur la cryptographie moderne et les outils utilisés pour assurer l’intégrité,
l’authenticité et la confidentialité des données. Puis, on a présenté une explication plus
ou moins détaillée de la théorie des courbes elliptiques.

Ensuite, on a exploré la conception générale d’une application qui transforme la théo-


rie de la cryptographie sur les courbes elliptiques en pratique, suivie de l’implémentation
détaillée de cette application, qui a été une partie très intéressante pour les futurs cher-
cheurs.

Dans le but d’arriver à développer cette application, nous nous sommes intéressé au
langage C++. Ce langage de programmation nous donne des outils plus rapides en exé-
cution et plus efficaces que les autres langages de haut niveau (Java, python..). Le code
de cette application peut être facilement transformé à un code C pour l’utiliser dans les
capteurs sans fil.

Malgré le fonctionnement parfait de cette application, l’optimisation et l’amélioration


restent toujours possibles. On peut par exemple utiliser les threads pour le chiffrement et
le déchiffrement parallèles. On peut aussi ajouter de l’aléatoire dans le code pour rendre
l’attaque par canaux caché plus difficile. Le codage des points chiffrés en hexadécimale
pour réduire leurs tailles est aussi une amélioration possible.

66
Bibliographie

[1] Cours sécurité informatique, Prof GUEZOURI Mustapha, Université d’Oran 1 Ahmed
Ben Bella, 2016.
[2] Cryptographie et Sécurité informatique, Université de Liège, 2009 - 2010.
[3] Construction et Analyse de Fonctions de Hachage, Gaëtan Leurent, Université Paris
Diderot, 2010.
[4] Analyse de fonctions de hachage cryptographiques, Thomas Peyrin, Université de
Versailles Saint-Quentin-en-Yvelines, 2008.
[5] Courbes elliptiques et cryptographie, Hägler Michael, 2006.
[6] Cryptographie sur les courbes elliptiques, Nicolas Papernot, 2012.
[7] Cryptographie Avancée : Courbes elliptiques, Cécile GONÇALVES, UPEC, 2015.
[8] Encryption of data using Elliptic Curve over finite fields, D.Sravana Kumar, CH
Suneetha, A.Chadrasekhar, international Journal of Distributed and Parallel Systems,
January 2012.
[9] A course in Number Theory and Cryptography, Kobliz, 1994.
[10] Courbes Elliptiques, Application à la Cryptographie, Stéphane Ballet et Alexis Bo-
necaze , Ecole Polytech de Marseille.
[11] Parallel Collision Search with Cryptanalytic Applications, P.C. van Oorschot, M.J.
Wiener, Journal of Cryptology, 1996.
[12] Arithmétique pour la Cryptographie basée sur les Courbes Elliptiques, Nicolas Mé-
loni, Université Montpellier II, 2007.
[13] Recommended Elliptic Curves For Federal Government Use, NIST, 1999.
[14] Selecting Cryptographic Key Sizes, Lenstra & Verheul, Journal of Cryptology, 2001.
[15] Implementation Guidance for FIPS PUB 140-2 and the Cryptographic Module Va-
lidation Program, NIST, 2017.
[16] Archived NIST Technical Series Publication [SP800-57], NIST, 2007.
[17] Benefits of Elliptic Curve Cryptography, Gemalto, 2012.
[18] ECRYPT2 Yearly Report on Algorithms and Keysizes, ECRYPT2, 2009.

67

View publication stats

Vous aimerez peut-être aussi