Conclusion

Transcription

Conclusion
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
TPE 2003-2004
« Quels sont les différents
moyens de sécuriser une
information ? »
La Cryptographie
Khemiri Karim, Taxu Clément, George Kévin,
TS1 au Lycée Georges-Baumont de Saint-Dié
- Page 1 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Sommaire
Page 3
Introduction
• Choix de la problématique
• Intérêt de la cryptographie
• Historique de la cryptographie
Page 3
Page 3
Page 4
Les Différents systèmes de cryptographie
1.) Les systèmes a clé symétrique
•
•
•
•
Le chiffrement de César
Le chiffrement de Vigenère
L’algorithme DES
Conclusion
2.) Les systèmes à clé asymétrique
• Le chiffrement RSA
• Conclusion
Page 5
Page 6
Page 8
Page 10
Page 10
Page 11
Page 12
La Production : Le programme de Cryptage :
•
•
•
•
•
•
•
•
•
•
Page 5
Diagramme FAST du programme
Avant Propos : Le Codage des lettres en ASCII
Fonctions récurrentes en C++
Partie Clé Privée : Fonction XOR
Partie Clé Publique :Algorithme RSA
Acquisitions et Menus
Sauvegardes des Textes
Le générateur de Clés
Mode d’emplois du programme
Code Source du programme
Conclusion Générale :
• Les Limites de la Cryptographies : La Cryptanalyse
• L’avenir de la Cryptographie : Les Photons
- Page 2 -
Page 13
Page 14
Page 15
Page 16
Page 16
Page 17
Page 17
Page 17
Page 18
Page 18
Page 19
Page 25
Page 25
Page 25
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Introduction
Choix de la problématique :
Parmi les thèmes nationaux proposés pour les TPE, entre L’Europe, Espaces et Mouvements,
Formes et Structures, Information et Communication et Cybernétique Robotique et Energies,
notre choix s’est porté vers Informations et Communications ce qui nous a conduit à nous
intéresser à la sécurité du transfert d’informations.
Le moyen le plus courant, selon nous, pour sécuriser une information étant de crypter le
message, nous avons décider de réaliser un TPE parlant des différentes méthodes de
cryptographie et donc notre problématique sera « Quels sont les différent moyens de sécuriser
le transfert d’une information a travers la cryptographie ? ».
Pour répondre à cette problématique, nous étudierons tout d’abord les systèmes existant, puis
pour la production servant à illustrer notre sujet, l’informatique étant omniprésent en ce qui
concerne l’information et la communication nous avons décidé de réaliser un programme
permettant d’encrypter et de décrypter un message d’une manière sure, en nous basant sur
cette étude.
• Qu’est ce que la cryptographie ?
La cryptographie est la science du chiffrement des messages afin de rendre ce message
incompréhensible sans clé. Le nombre d’algorithmes chiffrant le message est illimité.
L’intérêt de la cryptographie :
De l’antiquité à de nos jours la cryptographie a intérêt important sur des domaines variés, en
effet l’homme a toujours eu besoin de garder certaines informations a l’abris des regards
indiscrets. Il faut pouvoir envoyer un message que seul la personne de notre choix puisse lire.
Les enjeux sont multiples et peuvent être très importants, par exemple si durant une guerre un
message est intercepté par l’ennemi cela peut changer l’issue de toute une guerre. Mais cela
n’empêche que l’ont puisse vouloir tout simplement préserver la confidentialité d’une
conversation anodine.
Le simple fait d’envoyer un message est donc très dangereux si l’ont veut garder ce message
secret, car dans ce cas de nombreux intrus pourront lire le message en tout liberté, la
cryptographie joue donc ce rôle de gardien de la sécurité conversation et doit donc être le plus
fiable possible.
• Dans quels domaines s’applique la cryptographie ?
Aujourd’hui la cryptographie ne s’applique plus essentiellement au domaine militaire
mais est ouverte au grand public tout en garantissant la sécurité d’informations à forts
enjeux, comme dans le réseau bancaire où toutes les transactions sont sécurisées au
maximum, ou à la télévision où certaines chaînes encryptent des émissions que seuls les
abonnés peuvent décrypter, les conversations téléphoniques peuvent également être
encryptées. On retrouve cela également dans de nombreux biens de consommation : CD
audio, clé de logiciel, puces de téléphones portables,… mais surtout dans des envois
d’information par internet.
- Page 3 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
L’histoire de la cryptographie :
Quelques exemples de systèmes utilisés dans l’histoire ;
•
La Scytale
Comme dit précédemment l’homme a toujours ressentit le besoin de sécuriser l’envois d’un
message, on retrouve donc des systèmes de cryptographie dès l’antiquité car on se rendit
compte de son importance stratégique, le plus anciens des systèmes connus étant la Scytale
qui permettait a l’armée grecque au Veme siècle avant JC de communiquer sans que l’ennemis
ne puisse comprendre le message si il l’intercepte.
La scytale est un exemple basique de stéganographie, il s’agit d’une bandelette que l’ont enroule autour d’un
cylindre d’un diamètre défini pour lire et écrire le message, le diamètre du cylindre joue donc le rôle de clé, sans
le cylindre et le bon diamètre le message est inintelligible. Mais il est évident que la sécurité de se système est
très faible.
•
Le Carré de Polybe
Un autre exemple encore une fois appliqué au domaine militaire mais cette fois-ci vers 150
avant JC pour l’empire romain, est le cryptosystème inventé par le grec Polybe appelé Carré
de Polybe, celui-ci marque une étape important dans l’histoire de la cryptographie car c’est à
partir de là que l’ont commence à chiffrer les messages plutôt que de mélanger ses lettres
comme le faisait le carré de Polybe.
1
2
3
4
5
1
2
3
4
5
A
F
K
P
U
B
G
L
Q
V
C
H
M
R
X
D
I
N
S
Y
E
J
O
T
Z
Le Carré de Polybe : l’alphabet est transposé dans un tableau et pour enchiffrer on remplace chaque lettre du
message à crypter par ses coordonnées dans le tableau.
- Page 4 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
•
La cryptographie au début du XXème siècle lors des Guerres Mondiales
Au fil de l’histoire, la cryptographie comprends de nouveaux systèmes mais la plupart reste
toutefois assez proche du système du carré de Polybe et du Code de César (dont nous
parlerons dans la partie suivante), ainsi on retrouve 20 siècles plus tard le Carré de Polybe
utilisé lors de la première guerre mondiale par les allemands qui lui ajoutent des chiffres et le
suivent d’une transposition afin de brouiller les pistes des cryptanalyses, il est appelé code
ADFGVX (lettres remplaçant 1,2,3,4,5 en colonne et en ligne du tableau).
Ce code sera tout de même cassé par Painvain, cryptanaliste français ce qui permit a l’armée
française d’être au courant d’une grande offensive allemande le 9 juin 1918 et de la stopper.
Lors de la seconde guerre mondiale c’est cette fois sur le Code de César que les allemands se
basent. Les allemands chiffraient leurs messages à l’aide de la machine à coder Enigma, cette
machine enchiffrait donc les lettres d’une manière analogue au Code de César mais cela était
suivit d’une multitude de transposition qui varient à chaque lettre selon la matrices utilisée.
La machine à coder Enigma se présente comme une machine a écrire mais a l’intérieur le système est complexe,
selon la clé utilisé, l’utilisateur choisit les matrices (comme celles posées à gauche de l’image) puis il appuis sur
les touches des lettres à coder ou décoder, puis une lumière s’allume sur la lettre correspondante.
Lors de la seconde guerre mondiale près de 12000 scientifiques et mathématiciens anglais,
français et polonais travaillaient à Bletchley Park à casser ce code, 18 000 messages par jours
furent décryptés, et permirent aux forces Alliées d’anticiper les actions de l’Allemagne, mais
ce système n’en restait pas moins difficile à briser notamment concernant les messages de la
marine qui utilisait une variante plus sure du système Enigma.
La cryptographie et la cryptanalyse jouaient donc un rôle clé et extrêmement important lors
des guerres.
- Page 5 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Les Principaux Systèmes de Cryptographie
Il est possible de classer les cryptosystèmes les plus courants sous deux catégories les
systèmes asymétriques et les systèmes symétriques.
1.) Les systèmes symétriques ou à clé privée
Le système a clefs secrète est le plus simple et évident, il s’agit de l’ensemble des
cryptosystèmes qui utilisent la même clef pour encoder et pour décoder le message.
L’algorithme utilisé est donc forcément réversible.
Diagramme des systèmes a clef privée.
Dans un système asymétrique la clé doit être à la fois connue par le codeur et par le décodeur.
Pour une meilleure sécurité il est préférable que l’algorithme ne soit également connu que des
gens envoyant ou recevant l’information.
Le nombre de système à clé privée est illimité car un algorithme est facile à inventer, nous
allons donc exposer les principaux systèmes à clé asymétrique.
Le chiffrement de César
Ce code était utilisé par César pour envoyer des messages codés, il s’agit simplement d’un
décalage des lettres de l’alphabet.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
CDEFGHIJKLMNOPQRSTUVWXYZAB
Exemple d’un chiffrement avec la clé de César avec décalage de l’alphabet de 2 lettres.
- Page 6 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Il suffit ensuite de remplacer dans le texte les lettres par celles qui leur correspondent X rang
plus tard, X jouant éventuellement le rôle de clef.
Avantages :
• Code simple, textes rapide à crypter et décrypter
Inconvénients :
• Le Code de César ne permet que 25 manières différentes de crypter
• A combiner avec des transpositions complexes (cf. Enigma)
• Système « trop » classique
• Brute forçable aisément.
Bien que ce code ait encore été utilisé par les Sudistes durant la guerre de Sécession Etatsunienne et même par l’armée russe lors de la première Guerre Mondiale, ce système est
aujourd’hui obsolète si il est nécessaire de préserver une sécurité efficace sur le transit de ses
informations.
Aujourd’hui ce système est utilisé essentiellement sur les forums de discussion Internet où
l’on fait passer des informations qui ne doivent être lues que volontairement et non par
inadvertance (comme par exemple la fin d’un film), avec une clé de 13, sous le nom de
ROT13.
Le carré de Vigenère (ou carré de Trithème)
En 1586 Blaise de Vigenère crée cet algorithme de cryptage à partir du carré de Trithème, il
s’agit en quelque sorte d’un mélange entre le carré de Polybe et le code de César.
Carré de Trithème qui permet d’exécuter le l’algorithme de Vigenère, comme vous pouvez le constater il s’agit
en quelques sortes d’un carré de Polybe où les coordonnées des lettres sont des lettres, chaque ligne reprends
l’alphabet avec un décalage d’une lettre (à la manière du code de César)
- Page 7 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Pour crypter un mot selon l’algorithme de Vigenère, l’axe des abscisses correspond aux lettres
du texte clair l’axe des ordonnées correspond aux lettres de la clef (la clef peut être un mot ou
un texte), il suffit ensuite de lire la lettre qui est a l’intersection de la colonne de la lettre du
texte clair et de la ligne de la clef, et ce pour chaque lettre successive du texte et de la clé, on
obtient ainsi un texte crypté.
Si la clef est plus courte que le texte alors il faut la répéter.
Par exemple prenons la clef « CLE » et le texte à crypter « CLAIR », en prenant les
intersections successives on obtient « EWEKC ».
Il est a remarquer que l’ont obtient d’abord E avec C et C puis avec E et A, cela constitue un
des principaux intérêts du code de Vigenère qui permet d’éviter la redondance de lettres qui
correspondent à la même lettre (nous en reparlerons dans la partie sur la cryptanalyse)
Avantages :
• Les lettres ne se répètent pas sous la même forme
• Beaucoup plus sûr que le Code de César, difficile à casser sans ordinateur
Inconvénients :
• Célèbre
• Fastidieux « à la main » (bien qu’un ordinateur fait cela rapidement)
• Code cassable facilement a l’aide d’un ordinateur (détection de la longueur de la clé)
Ce système a par exemple beaucoup servit pour les lignes de télégraphe (qui étaient
facilement espionnable), il peut être très efficace si la clé est très longue.
Le Data Encryption Standard, DES
L’algorithme DES est très récent contrairement à ceux présentés précédemment, puisqu’il a
été développé par la société d’informatique IBM en 1976, il s’agit d’un algorithme prévu pour
être exécuté par des ordinateurs (en effet l’appliquer par un homme serait plus que long et
fastidieux), c’est un algorithme public.
Il agit sur le texte a crypter par blocs de 64bits (soit 8 octets et sachant qu’en ASCII une lettre
tient dans un octet cela représente donc 8 lettres) utilisant une clef de 56bits en enchaînant des
substitutions et des permutations rendent l’algorithme complexe, on appel cela un chiffrement
Feistel.
La dernière version du DES date de 2000 (Rijndael qui de vient l’AES).
Son fonctionnement simplifié est :
Tout d’abord il fractionne le texte en blocs de 64bits, il effectue la permutation initiale, puis
sépare les blocs en 2 parties et il répète 16 fois des opérations de substitution et de
permutation (appelés Rounds) et réunifie le bloc séparé en deux et effectue enfin l’inverse de
la permutation initiale.
- Page 8 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Diagramme de fonctionnement de l’algorithme DES, enchaînement de permutations transpositions substitutions
avec utilisation de fonctions XOR.
Avantages :
• Nécessite une clef courte avec 256 combinaisons de clés différentes (car clé de 56bits
utiles sur les 64)
• Efficace
• La confidentialité de l’algorithme n’est pas nécessaire, contrairement aux systèmes
précédents, celui-ci reste sûr même si un intrus sait qu’il est utilisé
Inconvénients :
• Compliqué, il nécessite l’emplois d’un ordinateur pour encrypter et décrypter
• Commence à être dépassé
• Pas infaillible, un organisme tel qu’un état peut disposer de moyens informatiques
assez importants pour casser le code très aisément (méthode de Brute Force)
Une solution donnée en 1990 pour améliorée le DES est le Triple-DES qui consiste a utiliser
le DES trois fois de suite avec une clé de 112bit au lieu de 54.
Le fonctionnement de précis de cet algorithme est compliqué, il serait donc long à expliquer
et à comprendre totalement c’est pourquoi nous n’utiliserons pas cet algorithme pour notre
production.
- Page 9 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Conclusion :
Il existe donc une infinité de cryptosystèmes plus ou moins efficaces et plus ou moins aisés a
mettre en œuvre, l’idéal serait un système utilisant une clé courte et qui est très sûr, car
comme le démontre Kerckhoffs dans « La Cryptographie Militaire » le système idéal est celui
ne nécessitant pas d’être gardé confidentiel lors d’un échange de donné, ainsi il serait possible
avec un bon système d’envoyer l’algorithme avec le message crypté, puis la clef séparément.
Un problème évident se pose au sujet des systèmes à clé symétrique concernant la clé, en effet
le problème auquel répond la cryptographie se repose « Comment partager une clé de manière
sûre ? », l’intérêt peut sembler limité si on crypte un message de manière efficace alors que la
clé est envoyée sans précautions, cela serait donc inutile puisque la clé permet d’avoir le texte
clair, il pourrait également être possible de changer a chaque fois de clé (masques jetables).
La première solution, la plus évidente mais qui reste risquée est le Tiers de confiance, qui
serait par exemple un messager qui donnerait la clé a l’interlocuteur sans être intéressé au
message, cela demeure risqué car l’espion peut mettre la main sur ce Tiers, celui-ci doit être
incorruptible.
L’autre méthode est le cryptage par clé asymétrique.
2.) Les systèmes asymétriques ou à clé publique
Ces systèmes sont tous plutôt récent puisque ce concept est apparut dans le dernier quart du
20eme siècle, ce système a été conçu pour éviter les problèmes d’échange de clés dont nous
parlions a la fin de la partie précédente.
L’idée est que le système soit utilisé avec deux clés, une clé publique et une clé privée,
l’intérêt étant que la clé publique peut être connue de tous et la clé privée n’a à être connue
uniquement par une personne, l’ensemble de clé publique et privée est propre a chaque
personne.
Le fonctionnement théorique de ce système est le suivant, une personne choisit sa clé privée,
qu’il est donc le seul a connaître et qui lui servira a décrypter le message, de cette clé privée il
déduit une clé publique qui servira à son correspondant à crypter le message, et il déclare
publiquement cette clé publique, par exemple à l’aide d’un annuaire.
L’algorithme doit permettre a n’importe quelle personne de crypter un message à l’aide de la
clé publique qui ne peut être décrypté uniquement par la personne possédant la clé privée
correspondant.
Diagramme du fonctionnement des systèmes a clé publique.
- Page 10 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Deux difficultés se présentent donc en pratique, il faut trouver un algorithme permettant de
trouver une clé publique à l’aide d’une clé privée choisie sans que l’inverse ne soit possible
(si on peut retrouver la clé privée a l’aide de la clé publique cela n’a plus d’intérêt), et un
algorithme qui doit permettre de crypter un message avec une clé publique mais pas de le
décrypter avec cette clé, le texte doit uniquement être décryptable avec la clé privée.
Un exemple de système à clé asymétrique, le Chiffrement RSA
RSA est un algorithme conçu par Ronald L. Rivest, Adi Shamir et Leonard M. Adleman (d’où
le nom RSA) en 1978, il s’agit de l’algorithme le plus célèbre concernant les systèmes à clé
publique.
L’algorithme :
•
Il faut tout d’abord calculer les clés :
On choisit deux entiers premiers p et q étant supérieurs à 10100 et on
calcule l’entier n qui est le produit de produit de q et de p
Il faut ensuite choisir un entier aléatoire e tel que e et ((p-1).(q-1))
soient premiers entre eux
Enfin il faut trouver l’unique entier d tel que : ed ≡ 1[(p-1).(q-1)].
On obtient la clé publique qui est n et e et la clé privée n et d
•
Cryptage et Décryptage :
Soient le texte clair m et le texte crypté c.
Pour crypter :
c = me mod(n), (n,e) étant la clé publique du destinataire.
Pour décrypter :
m = cd mod(n), (n,d) étant la clé privée du destinataire.
Un problème se pose, si la clé publique peut être connue de tous, comment être certains que
l’on reçoit bien le message d’une personne attendue et non d’un usurpateur d’identité ?
La solution est simple, il suffit à l’expéditeur d’envoyer sa signature qui certifiera
l’authenticité de son message, cela est simple à faire, étant donné qu’une clé privée et
publique sont liées et propres à chaque personne.
Il suffit à l’expéditeur de crypter un message m à l’aide de sa propre clé privée ce message
crypté sera la signature s, de telle manière :
s = md mod(n), où (n,d) est la clé privée de l'expéditeur.
Le destinataire peut ensuite décrypter cette signature à l’aide de la clé publique de
l’expéditeur il vérifie ainsi l’authenticité du message :
m = se mod(n), où (n,e) est la clé publique de l'expéditeur.
Cet algorithme est très souvent utilisé pour crypter la clé de systèmes à clé privée.
Il servirait notamment à protéger les codes nucléaires confidentiels de grandes nations (USA,
Russie…), il repose essentiellement sur la difficulté à décomposer n.
- Page 11 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Cet algorithme crypte également les Clés pour SSL qui est très souvent utilisé pour les
transactions en ligne (page Web commencent par HTTPS://...)
Avantages :
•
•
•
•
Très sûr, parfois même considéré comme étant le plus sûr
Plus de problèmes de communication de clé
Idéal pour renforcer la sécurité d’un système a clé privé
Quasiment impossible de retrouver une clé privée) l’aide d’une clé publique
Inconvénients :
•
Lenteur, RSA est 1500 fois plus lent que DES
Conclusion :
L’idéal semble donc être de faire un système a clé privée qui serait renforcé par un système a
clé publique afin de garantir une forte sécurité.
Contrairement aux systèmes a clé privée, le nombre de systèmes a clé publiques est très limité,
le principal systèmes autres que RSA étant PGP qui est interdit en France (citons également
les systèmes Diffie-Hellman et DSA).
- Page 12 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Production de notre TPE
En nous basant donc sur l’étude précédente, ses conclusions, et sur les connaissances
personnelles des membres de notre groupe, nous avons donc décider de faire une « maquette »
d’un programme informatique cryptant à l’aide d’un système clé privée et clé publique, la
partie clé publique servant a crypter la clé, et la partie clé privée a crypter le message en luimême.
Pour ce faire nous avons donc choisit l’algorithme RSA en ce qui concerne le chiffrement
asymétrique et la fonction OU-EXCLUSIF –XOR- en ce qui concerne le chiffrement
symétrique.
Le programme simple sera réalisé à l’aide du langage C++, il n’aura pas pour but d’être
infaillible ou commercialisable, mais simplement de servir d’exemple pour mettre en scène
une communication sécurisée (de plus nos connaissances en C++ étant très limitées il nous
serait impossible pour le moment de gérer des entiers premiers de plus de 100 chiffres).
Selon nos exigences et celles que son susceptibles d’avoir les utilisateurs d’un tel programme,
nous avons donc conçus le diagramme FAST suivant, représentant les fonctions du système et
leurs solutions concrètes.
Nous reviendrons ensuite en détail sur les différentes fonctions du programme
- Page 13 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
- Page 14 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Avant propos : Le codage des lettres :
Pour tout algorithme il faut convertir les lettres afin de pouvoir leur appliquer des fonctions
mathématiques, la solution la plus simple étant d’affecter à chaque lettre son rang dans
l’alphabet.
Etant donné qu’il s’agit d’un programme informatique, le moyen le plus rapide et que nous
avons choisit d’utiliser est le codage ASCII de base (American Standard Code for Information
Interchange), il s’agit d’une table de valeur standard que la grande majorité des ordinateurs
utilisent pour les caractères.
Table des codes ASCII de base
Les caractères de la table ASCII de base sont codés sur 7bits, ce qui fait donc qu’il y a 128
caractères possibles (ceux de la table ASCII étendue sont codés sur 8bits).
Nous associerons donc directement un caractère a sa valeur ASCII dans notre programme,
l’avantage étant qu’une fois codé il devrait y avoir 128 possibilités de caractères au lieu de 26
lettres + 11 chiffres.
Il est à constater que l’inconvénient majeur est que la première colonne de cette table
représente des caractères non imprimables (donc impossible à écrire pour décoder si ils
résultent du cryptage). L’autre inconvénient et qu’il peut aussi résulter des caractères
imprimables mais difficiles d’accès (le seul moyen de les afficher étant par exemple une
combinaison de touches), pour pallier à ce problème nous avons décider d’intégrer un lecteur
et un éditeur de texte qui évitera donc d’avoir a retaper des caractères incongrus.
- Page 15 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
C++ : Les fonctions les plus utilisées dans le programme :
Dans le programme les fonctions qui reviendront le plus souvent seront :
• Les opérateurs cout << et cin>>, permettant respectivement d’afficher du texte
et d’acquérir du texte
• Les variables entières sont définies par ‘int NomVariable = initialisation’
• Les accolades représentent des parties, des blocs de fonction
• If est une condition SI (entre parenthèse la condition puis l’application entre
accolade) ELSE correspond a SINON
• WHILE est une boucle, tant que la condition entre parenthèse n’est pas vraie
on exécute ce qui se trouve entre accolades
• ‘%’ désigne l’instruction modulo.
Partie clé symétrique - La fonction OU-EXCLUSIF ou XOR :
Il s’agit de la fonction que nous allons utiliser pour notre système a clé privée.
C’est une fonction assez connue, utilisée en logique électronique, qui agit sur les nombres en
binaire.
Le symbole de cette fonction est ⊕ .
A
0
0
1
1
B
0
1
0
1
C
0
1
1
1
Tableau logique de la fonction XOR, tel que A ⊕ B=C.
Cette fonction est donc évidemment réversible, elle est également utilisée dans des
cryptosystèmes (comme le DES).
Sa fonction sera donc de comparer chaque bit d’octet du code ASCII de chaque lettre du mot
à crypter avec la clé. Ainsi par exemple on aura :
a ⊕ G= 97 ⊕ 71 = 01100001 ⊕ 01000111 = 00100110= 38 =&
La fonction étant réversible on aura également :
a ⊕ & =G et & ⊕ G = a
En C++ l’opérateur pour la fonction XOR est le symbole ‘^’, il nous suffira donc de déclarer,
LettreCryptée = LettreMot ⊕ LettreCle, pour effectuer la fonction.
Pour notre programme nous avons décidé d’utiliser une clé numérique de 4 caractères
(analogue aux clés de cartes bancaires)..
Le texte étant plus long qu’une clé de 4 caractères, celle-ci interviendra en boucle.
- Page 16 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
La partie clé asymétrique - L’algorithme RSA :
Nous avons retranscrit l’algorithme RSA en C++, pour ce faire nous avons dû utiliser
quelques méthodes spécifiques.
En C++ il nous était apparemment impossible d’effectuer une puissance d’entier.
Nous avons donc dû repenser cette fonction, pour ab la boucle WHILE multiplie a par luimême le même nombre de fois qu’il divise b par 2, lorsque sa partie entière vaut 0 alors a a
été multiplié b fois par lui-même.
Nous avons réaliser 2 parties, une pour le cryptage et une pour le décryptage, mais leur
fonctionnement est très similaire (seules les variables changent).
Le programme demande donc les 2 nombres de la clé, puis le mot a traité et effectue le travail
instantanément.
Il est préférable de choisir un nombre de 4 chiffres comme mot-clé.
L’Acquisition de Données et Menus :
L’acquisition de données est très simple en C++, il suffit de déclarer une variable puis
d’afficher à l’écran un texte demandant la variable (à l’aide de « cout << ‘TEXTE’ ») puis de
placer ce que l’utilisateur valide avec Entrer dans cette variable (à l’aide de « cin >>
Variable »).
Pour gérer un menu, nous avons d’abord repris la procédure d’acquisition de donnée dite
précédemment et nous plaçons là valeur dans une variable « Choix », puis affecté un nombre
entier à chaque sous-programme, ensuite la fonction SWITCH gère cela.
Dans le bloc de cette fonction on attribue le numéro grâce à l’affecteur « CASE », ensuite en
fonction de la valeur de choix, SWITCH appel le sous-programme désiré (voir code source).
L’enregistrement et lecture des fichiers :
Cette fonction est donc là pour rendre plus agréable et efficace l’utilisation du programme, en
effet, recopier certains caractères spéciaux du code ASCII aurait été long et laborieux, sujet a
de nombreuses erreurs.
Dans le programme les textes sont donc gérés en tant que chaînes de caractères STRING.
Pour affecter une lettre en particulier de cette chaîne de caractères il suffit de donner le nom
de cette chaîne en spécifiant le rang de la lettre concernée, de telle manière : NomChaîne[n],
n représentant le rang de la lettre, ce qui nous facilite les cryptages lettre à lettre.
Comme par exemple dans notre programme : CléCryptée[n] = Mot[n]^Clé[n] pour la
fonction ou exclusif. Pour afficher le texte en son intégralité il suffit simplement d’écrire :
« cout << NomChaîne ; », pour l’acquisition il faut utiliser getline au lieu de cin.
Pour enregistrer un fichier il suffit d’écrire
ofstream f("c:\\CHEMINDACCES/texte.txt",ios::binary|ios::out|ios::app);
f << NomChaîne << "\r\n";
Pour l’ouvrir :
ifstream File("c:/Chemind’Acces/fichier.txt");
getline(File, NomChaineOuPlacerTexte);
- Page 17 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
La Partie Générateur De Clé :
Nous avons pensé à cette fonction car la recherche de clé prend souvent du temps, et nous
avons voulu faire une production permettant une présentation dynamique et non dirigiste
comme cela aurait été le cas si nous avions simplement édité un annuaire de clés.
L’idée est simple, l’utilisateur n’a qu’à choisir ses valeurs de p et q, nombres premiers de
l’algorithme de clés RSA, et le programme se charge d’en déduire la clé privée et publique
correspondante.
• Tout d’abord le programme vérifie si ces nombres sont bien premiers,a l’aide d’une
division successive : avec FOR on incrémente une valeur d et a chaque incrément on
vérifie si le nombre modulo d vaut 0, si ce n’est pas le cas jusqu'à ce que d atteigne la
moitié de la valeur du nombre, alors ce nombre est premier, sinon le programme émet
un bip (grâce à \a) et signal une erreur d’entrée de données.
• Le programme calcule ensuite n produit de p et q
• Puis (p-1)(q-1) qui est appelé ici valmod
• Puis la fonction WHILE permet de trouver e en incrémentant e a partir de 1 jusqu'à ce
que PGCD(e, valmod) soit égal à 1, donc que e est premier avec valmod.
• La seconde fonction WHILE fait de même pour e en l’incrémentant jusqu’à ce que le
produit de e et d soit congru à 1 modulo valmod.
• Le programme récapitule en indiquant la valeur des clés.
Remarque : pour le calcul du PGCD, la bibliothèque de fonction concernant le PGCD en C++
nous étant inconnus nous avons donc fait appel a un sous-programme pour le calculer, celui-ci
calcule les modulos de a et b entre eux en les intervertissant jusqu'à ce que l’un d’entre eux ne
vaille 0 l’autre membre sera le PGCD.
Utilisation du programme, présentation :
Pour lancer le programme il faut d’abord lancer « l’invite de commande » qui en général se
trouve dans « Démarrer/Programmes/Accessoires » puis il suffit de glisser+déposer le fichier
exécutable TPECRYPTOKTG.EXE.
Le menu propose de choisir une action, tout d’abord choisir 1 pour générer une clé, le
programme demander 2 nombres premiers, les entrer, le programme vérifie ensuite si ils sont
premiers, et il affiche automatiquement la valeur de la clé publique et de la clé privée.
Il lui faut ensuite publier sa clé publique et garder la clé privée dans un endroit sûr.
L’expéditeur relève ensuite la clé publique, lance à son tours le programme, il choisit l’option
2 pour crypter avec RSA, entre la clé publique, puis une clé principale de 4 chiffres. Le
programme retourne la clé principale cryptée. Cet utilisateur relance le programme et choisit
maintenant l’option 4 pour crypter en XOR, il choisit ensuite l’option 2 pour taper un texte
directement, il entre la clé principale non cryptée et le programme enregistre le message
crypté dans C:/, il envois ensuite le fichier texte crypter et la clé principale cryptée a son
correspondant.
Le destinataire place le fichier texte dans C:/ et lance le programme, il choisit l’option 2
décrypter avec RSA, entre sa clé privée, puis la clé principale cryptée, il obtient la clé
principale non cryptée, puis il relance le programme choisit l’option 4 puis 1 le programme lit
directement le message crypté, il entre la clé principale et peut enfin lire le message qui aura
été totalement sécurisé.
- Page 18 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Code Source du Programme :
Le code couleur permet de distinguer les fonctions, en vert entêtes, en rouge texte affiché…
Ce programme a été intégralement et uniquement conçu par les membres de notre groupe à
l’aide du logiciel libre, DEV-C++ de BloodShed.
/*================TPE 2003-2004 Baumont==== KHEMIRI=TAXU=GEORGE============
===========Comment sécuriser un transfert d'information, La Cryptographie=====
=====Code source de notre programme, les annotations sont grisées comme ici====*/
//fichiers d'entêtes déclarant au compilateurs les fonctions que l'ont veut utiliser
#include <math.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <iterator>
#include <fstream>
#include <stdio.h>
#include <conio.c>
//gestion des flux d'entrer sortie cin et cout
//pour la gestion de textes
//pour la sauvegarde du fichier
//idem
//purge fflush evite les bugs
//pour Clrsc
using namespace std;
int xorfichied();
int xorentred();
int crypt();
int keygen();
int decrypt();
int xormain();
int pgcd(int a, int b);
//déclarations des différents sous programmes
//l’ordre et les noms n’ont pas d’importance
int main()
// programme principal (menu)
{
int choix;
//déclaration d'un entier qui servira a choisir le menu
clrscr();
//efface l'écran
cout << "\n \t \t ::TPE TS1 LYCEE G.BAUMONT 2003-2004 KHEMIRI-TAXU-GEORGE GROUPE 5::: \n
<< "\n \t TPECRYPT v1 par Khemiri Karim, \n \n \n"
<< "\t Bienvenus dans notre programme de cryptographie \n"
<< "Tapez: \n \t 1 Pour utiliser le generateur de cle RSA \n \t 2 Pour Crypter une Cle
<< "RSA"
<< "\n \t 3 Pour decrypter une cle RSA \n \t 4 Pour acceder au menu de la fonction de
<< "cryptage XOR \n";
cin >> choix;
//ci dessus affichage du message dans la fenetre du
//programme, ici affectation d'une valeur dans l'entier choix par l'utilisateur
switch(choix)
{
case 1 : keygen();
break;
//gestion du menu
case 2 : crypt();
break;
case 3 : decrypt();
break;
- Page 19 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
case 4 : xormain();
break;
}
}
////////////////////////////////////////////////////////////////////////////////
int crypt()
//partie encrypton RSA
{
int n,e;
int motcle;
int clecrypt;
int part = 1;
//déclaration des variables
cout << "CRYPTAGE :: ENTREZ LA CLE PUBLIQUE n,e"; //propose d'entrer la cle publique
cin >> n
//entrée des cles
>> e;
//idem pour le mot
cout << "ENTREZ LE MOT CLE CRYPTER:";
cin >> motcle;
while (e > 0)
//ceci est une boucle while, la
//fonction permet ici de realiser une fonction puissance
{
//on réalise part = motclee
if (e % 2 != 0)
part = part * motcle;
motcle = motcle * motcle;
e = e / 2;
}
//% représente modulo on a bien la fonction
//d'encryption
// crypté = mot^e mod(n)
//affiche le mot crypté
clecrypt = part % n;
cout << clecrypt << endl;
}
//////////////////////////////////////////////////////////////////////////////
//Partie décryptage fonctionne de la meme
//maniere que la precedente
int decrypt()
{
int motcle, clecrypt, n, d, part = 1;
cout << "DECRYPTAGE :: ENTREZ LA CLE PRIVEE n,d";
cin >> n >> d;
cout << "ENTREZ LE MOT CLE A DECRYPTER";
cin >> clecrypt;
while (d > 0)
{
if (d % 2 != 0)
part = part * clecrypt;
clecrypt = clecrypt * clecrypt;
d = d / 2;
}
- Page 20 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
motcle = part % n;
cout << motcle << endl;
}
//////////////////////////////////////////////////////////////////////////////
int xormain()
{
//Partie Menu de la partie XOR
int menu;
//choix du menu idem menu principal
cout << "Veuillez: \n \t Entrer 1 pour Crypter/Décrypter un message a partir d'un fichier
<< "*.txt"
<< "\n \t Entrer 2 pour crypter entrer manuelement un texte a crypter puis
<< "l'enregistrer";
cin >> menu ;
fflush(stdin);
//purge permet de pourvoir utiliser un getline
//apres cin
switch(menu)
{
case 1 : xorfichied();
break;
case 2 : xorentred();
break;
}
}
//////////////////////////////////////////////////////////////////////////////
int xorentred()
{
string mot;
string cle;
cout << "mot?";
getline(cin, mot);
//Partie Xor "manuel"
//declaration des variables "string" gerant du texte
//aquisition de texte
cout << "cle?";
getline(cin, cle);
for(int i=0; i<mot.size(); i=i+4 )
//boucle For permettant de faire un roulement des 4 chiffre
de la clé
{
mot[i] = mot[i] ^ cle[0];
mot[i+1] = mot[i+1] ^ cle[1];
mot[i+2] = mot[i+2] ^ cle[2];
mot[i+3] = mot[i+3] ^ cle[3];
//Fonction XOR
//le symbole ^ permet de realiser la fonction
//Ou exclusif
}
cout << "\n Le message traite est \t" << mot
<< "\n le message est enregistre sous le nom Message.txt a la racine C:/"<< endl;
ofstream f("c:\\Message.txt",ios::binary|ios::out|ios::app); //Enregistrement du fichier
f << mot << "\r\n";
}
///////////////////////////////////////////////////////////////////////////////
int xorfichied()
//Partie XOR "automatique
- Page 21 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
{
string cle;
string mot;
cout << "cle?";
getline(cin, cle);
//ouvre directement le fichier message.txt
//place le contenu de ce fichier dans la
//variable mot
ifstream File("c:/Message.txt");
string Mot = "";
if (File.is_open())
{
getline(File, mot);
File.close();
cout << "Le messssage etait: \t" << mot;
//affichage du mesage initial
for(int j=0; j<mot.size(); j=j+4 )
//fonction XOR idem a la precedente
{
mot[j] = mot[j] ^ cle[0];
mot[j+1] = mot[j+1] ^ cle[1];
mot[j+2] = mot[j+2] ^ cle[2];
mot[j+3] = mot[j+3] ^ cle[3];
}
cout << "\n Le message traite est \t" << mot
//affichage du message codé/décodé
<< "\n le message est enregistre sous le nom Messagetraite.txt a la racine C:/"<< endl;
ofstream f("c:\\Messagetraite.txt",ios::binary|ios::out|ios::app); //enregistre le message
f << mot << "\r\n";
}
else
{
cout << "Impossible d'ouvrir le fichier" << endl; //gestion du message d'erreur si le fichier n'est
pas trouvé
}
}
///////////////////////////////////////////////////////////////////////////////
int keygen()
//partie Generation de Cle
{
int p;
int q;
int verif = 512;
//constante qi permettra de gere l'affichage des messages
cout << "Veuillez entrer les entiers premiers (p;q)";
cin >> p >> q;
if (( p==2) || (p==3))
{cout << "p OK"<< endl;
verif= 32;}
else {
for(int d = 2; (d <= p/2) && (p%d !=0); d++)
//vérification si les nombres son premiers
//ou pas
//par divisions successives
{
if (d == p/2)
{
if (p == 0)
{
cout << "ERREUR \a p n'est pas premier! Veuillez recommencer"<< endl;
}
- Page 22 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
else
{
cout << "p OK"<< endl;
verif= 32;
}
}
}
}
if(verif == 512)
//vérif permet ainsi de ne pas afficher p/2 fois ERREUR
{cout << "ERREUR \a p n'est pas premier! Veuillez recommencer" << endl;}
verif = 512;
if (( q==2) || (q==3))
//Meme procédé pour q
{cout << "q OK"<< endl;
verif= 32;}
else {
for(int d = 2; (d <= q/2) && (q%d !=0); d++)
{
if ( d == q/2)
{
if (q == 0)
{
cout << "ERREUR \a q n'est pas premier! Veuillez recommencer"<< endl;
}
else
{
cout << "q OK"<< endl;
verif= 32;
}
}
}
}
if(verif == 512)
{cout << "ERREUR \a q n'est pas premier! Veuillez recommencer" << endl;}
int n = p*q;
//n produit de p et de q
int e=2;
int valmod = ((p-1)*(q-1));
cout << "n = \t" << n
<< "\n \n Valmod \t" << valmod;
//initialisation de e a 2
//valmod représente (p-1)(q-1)
while(pgcd(e, valmod) != 1)
{
//boucle while, incrémente e de 1
//tant que le pgcd de e et valmod
//est inégal a 1
e++;
}
cout <<"\n e = \t" << e << "\n" << endl;
int d=1;
while((e*d)%valmod != 1%valmod)
//incrémentation de valmode jusqu'a
//ce qu'il remplice la condition
//ed congru a 1 modulo valmod
{
d++;
}
cout << "\n d = \t" << d << "\n" << endl;
cout << " \n \n \t \t :::GENERATION DE CLE TERMINEE::: \n \n"
<< "RECAPITULATIF: \n \n \t"
<< "Cle publique (n,e): (" << n << ", " << e << ") \n \t"
- Page 23 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
<< "Cle privee (n,d): (" << n << ", " << d << ") \n \n"
<< "Vous pouvez maintenant publier votre clee publique dans un annuaire, \n"
<< "et conserver la cle privee a l'abris des regards indiscrets" << endl;
}
////////////////////////////////////////////////////////////////////////////////
//algo de la fonction PGCD
int pgcd(int a,int b)
{
if (b==0) {return a;}
//qui nous permet de vérifier si
//e et valmod son premier entre eux
else {return pgcd(b,a%b);}
}
//================================FIN DU CODE===============================\\
- Page 24 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Conclusion Générale
La Cryptanalyse et les limites de la cryptographie
Comme montré dans notre historique dans l’introduction, le fait d’avoir des systèmes plus ou
moins sûr ne permet pas d’être totalement étanche aux attaques. Il a toujours existé des
personnes chargées de trouver des failles pour casser des systèmes, que ce soit chez l’ennemis
pour intercepter et rendre intelligible des messages ou chez les personnes utilisant ou créant
un système afin d’évaluer sa sécurité. Analyser un cryptosystème pour casser un code s’appel
la cryptanalyse
Les méthodes les plus fréquentes sont :
• L’analyse de l’algorithme : il faut être bon mathématicien et trouver par quel moyen
on peut remonter jusqu’à la clé de codage
• L’analyse de lettres redondantes : il s’agit d’analyser quelles lettres reviennent le plus
souvent, en double… par exemple trouver une lettre en double équivalente à un l ou t
qui son le plus souvent doublées dans des mots. Les lettres apparaissant souvent
permettent de les identifier, par exemple le E est fréquent alors que le K est rare dans
un texte en Français.
Ce système fonctionne très bien avec des systèmes a clé simple, mais si la clé à
plusieurs caractères il est rendu obsolète a moins de connaître ce nombre de caractères.
• Le Brute Force : cette méthode est longue mais est parfois efficace, il s’agit d’utiliser
un programme testant un grand nombre de clés (système utilisé en dernier recours)
Selon Rivest (un des créateurs du RSA) il faudrait environ 107 millions d'années à
ordinateur équipé d’un processeur à 1Ghz pour retrouver une clé RSA codée de
1024Bits.
• Le Social Engineering (mot à mot Ingénierie Sociale) est un système redoutable qui
peut être très efficace car la complexité d’un algorithme ne l’atteint pas. Il s’agit de
persuader l’ennemi de donner la clé, sans qu’il s’en rende compte, par exemple en se
faisant passer pour un allié, imposture téléphonique… (C’est une méthode souvent
employée pour les piratages de banques)
L’avenir de la Cryptographie ? La cryptographie Quantique :
La cryptographie quantique est un système utilisant la propriété des photons à changer
d’aspect à chaque fois qu’ils sont observés.
Il s’agit d’un envoi de photon (un par un) d’un point de l’expéditeur au destinataire, suivit
d’une étude statistique.
Ce système serait totalement inviolable, et permet de détecter directement toute tentative
d’intrusion.
En 2002 le système aurait été exécuté avec succès par une société suisse, cela représente un
point tournant dans l’histoire de la cryptographie
Ce système pourrait être commercialisé dans quelques mois à un prix avoisinant les 100 000€.
- Page 25 -
TPE 2004 - Khemiri Taxu George - « Quels sont les différents moyens de sécuriser une information »
Références
Sites Internet et ouvrages ayant servit de référence pour notre dossier :
• www.uqtr.ca/~delisle/Crypto
• www.commentcamarche.com
• www.developpez.com
• www.clubic.com
• www.01net.com
• http://casteyde.christian.free.fr/cpp/cours/online/book1.html
• http://perso.wanadoo.fr/jpq/
• Hors Série Science et Vie Junior de Juillet-Août 2003
• Science Avenir Spécial Cryptographie
- Page 26 -