L'objectif de cette activité est de découvrir les différentes techniques de chiffrement utilisées en informatique.
Différence entre crypter et chiffrer |
Mais quelle est donc la différence entre le cryptage et le chiffrement ?
Par abus de langage, les termes de cryptographie et de chiffrement sont indifféremment utilisés alors qu’ils ne renvoient pas aux mêmes pratiques.
Chiffrer n’est pas crypter, même si le langage courant et les médias utilisent indifféremment ces deux termes. Pour ajouter à la confusion, le terme anglais « encryption » se traduit en français « chiffrement ». Or si la cryptographie et le chiffrement poursuivent le même but – garder confidentielles des informations sensibles – ces deux disciplines n’ont pas recours aux mêmes moyens.
Déchiffrer un message consiste à le décoder avec une clé tandis que décrypter un message revient à décoder sans clé.
Exemple de cryptage : on écrit le message en inversant l'ordre des caractères. Ainsi, le message BONJOUR se code RUOJNOB. Si j'ai le message crypté RUOJNOB et que je connaît ou reconnaît l'algorithme de cryptage (ici la simple inversion des lettres) alors je peut décrypter le message.
Autre exemple de cryptage : on permute les caractères 2 à 2. Ainsi, le message BONJOUR se code OBJNUOR. Là encore, si je connaîs l'algorithme de cryptage alors je peux décrypter le message.
A retenir :
Toutes les techniques ou les algorithmes vus ci-dessous utilisent une clé numérique pour encoder ou décoder les données, il s'agit donc d'algorithme de chiffrement et non d'algorithme de cryptage.
Problème de sécurité sur un réseau |
L'objectif d'un réseau informatique est d'échanger des données numériques (texte, images, mots de passe, etc.) entre plusieurs ordinateurs :
Le problème est que le réseau Internet n'est pas sécurisé. En effet, un pirate informatique bien informé n'a aucune difficulté à consulter les échanges sur le réseau, quelque soit la laison physique (filaire, wifi, fibre optique, etc.) :
Il ne faut donc jamais envoyer des données en clair sur le réseau (par exemple un texte encodé simplement avec les codes ASCII des caractères connus de tous) et il faut considérer que toutes les informations circulant sur Internet sont consultaples par tout le monde.
L'idée est alors de chiffrer les informations avant de les envoyer, et de les déchiffrer après réception. Ainsi, un pirate informatique qui consulterait les échanges n'obtiendrait que des données totalement brouillées et inexploitables puisqu'il ne connaît pas la clé numérique qui a chiffré les données :
Il existe 2 techniques de chiffrement :
![]() |
Chiffrement symétrique et asymétrique |
Quelle est la différence entre le chiffrement symétrique et le chiffrement asymétrique ?
Le chiffrement symétrique et le chiffrement asymétrique sont deux méthodes fondamentales utilisées en cryptographie pour sécuriser les données. Voici les principales différences entre les deux :
Chiffrement Symétrique
Chiffrement Asymétrique
Comparaison
En résumé, le chiffrement symétrique est rapide et efficace pour chiffrer de grandes quantités de données, tandis que le chiffrement asymétrique est utile pour sécuriser les communications initiales et gérer les clés de manière plus flexible.
Le chiffrement symétrique |
Le code de César
En cryptographie, le chiffrement par décalage, aussi connu comme le chiffre de César ou le code de César, est une méthode de chiffrement très simple utilisée par Jules César dans ses correspondances secrètes (ce qui explique le nom « codage de César »).
Le code César est un chiffrement basé sur un décalage de l'alphabet. Le décalage le plus souvent utilisé est de 3 lettres tel que A devient D . Exemple :
A l'origine, avant l'informatique, on utilisait une "roue de César" pour coder chaque caractère. Une roue de César est constituée de 2 parties :
Voici un exemple de roue de César :
Question : avec la roue de César ci-dessus, comment se code le message BONJOUR ?
Réponse : le B se code T, le O se code B, le N se code N, etc. et BONJOUR se code TONPOKI
Question : quel message se code DHVLX avec la roue de César ci-dessus ?
![]() |
Voici un autre exemple de roue de César :
Question : quel message se code IYHCVABHZNHNUL avec cette seconde roue de César ?
Remarque : à la base une roue de César ne peut coder que des messages écrits en lettres majuscules, sans lettre minuscule, sans chiffre, sans espace et sans caractères de ponctuation.
Comme le montre la roue de César on considère un alphabet cyclique :
Le code de César est un chiffrement symétrique : si on connaît la clé qui a permi de chiffrer le message alors on peut déchiffrer le message.
Ici la clé de chiffrage correspond au décalage de l'alphabet qui peut être positif comme négatif. Exemples :
Voici un dernier exemple avec un décalage de 13 :
Ainsi avec un décalage de 13 le mot HELLO se code URYYB.
Question : quel message se code CLGUBA en utilisant le code de César avec un décalage de 13 ?
Travail à faire :
Testez le programme exemple donné ci-dessous pour chiffrer des messages avec le code de César en utilisant des décalages positifs puis négatifs.
Contrairement à une simple roue de César qui était limitée aux seules lettres majuscules, un programme informatique en Python devrait pouvoir chiffrer n'importe quel caractère.
Le message à chiffrer peut-il contenir tous les codes ASCII (lettres majuscules, lettres minuscules, chiffres, caraactères de ponctuation, caractères accentués, caractères spéciaux, etc.) ?
Quel est l'intervale des codes ASCII utilisables avec le chiffrement de César ?
Quel est l'intervale du décalage utilisable avec le chiffrement de César ?
![]() |
|
![]() |
|
![]() |
A retenir : il existe 2 solutions pour chiffrer et déchiffrer un message par le code de César en Python :
Le chiffrement par Ou-Exclusif
Le chiffrement par Ou-Exclusif ("codage XOR") est un système de codage basique mais assez efficace. Ainsi, il a beaucoup été utilisé dans les débuts de l'informatique et continue à l'être encore aujourd'hui car il est facile à implémenter, dans toutes sortes de programmes, notamment en Python.
Le XOR est un opérateur logique qui correspond à un "OU-exclusif" : c'est le A OU B qu'on utilise en logique mais qui exclue le cas où A et B sont simultanément vrais. Voici pour rappel sa table de vérité :
A |
B |
A XOR B |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
En informatique, chaque caractère du message à coder est représenté par un entier correspondant à son code ASCII. Ce nombre est lui-même représenté en mémoire comme un nombre binaire à 8 chiffres (sur 8 bits). On choisit une clé que l'on place en dessous du message à coder, en la répétant autant de fois que nécessaire. Le message et la clé étant converti en binaire, on effectue un Ou-Exlusif bit par bit. Le résultat en binaire peut être reconverti en caractères ASCII et donne alors le message codé.
L'algorithme est complètement symétrique : la même opération est réappliquée au message final pour retrouver le message initial :
Rappel : le terme anglais ENCRYPT signifie chiffrer en français, et le mot anglais DECRYPT se traduit par déchiffrer en français (et non crypter et décrypter).
Autre exemple de chiffrement symétrique par ou-exclusif :
Rappel : l’opérateur XOR est réversible : si a XOR b = c alors b XOR c = a et c XOR a = b
Le codage par Ou-Exclusif est un chiffrement symétrique : la même clé permet de chiffrer et de déchiffrer le message.
Dans la pratique le message à coder est un texte et chaque caractère a pour valeur numérique son code ASCII. De plus, la clé peut être sur plusieurs octets, mais elle peut être donnée également sous forme de texte.
Exemple avec une clé sur 4 octets. Le message à chiffrer est Blaise Pascal et la clé est info :
Voici pour rappel la table ASCII complète (128 caractères dont les codes en décimal vont de 0 à 127) :
Et voici seulement les 95 caractères imprimables de la table ASCII (code 32 à 126 en décimal) :
La méthode XOR pour chiffrer un message utilise un masque binaire. Tous les caractères du message et du masque sont traduits en octets. On peut alors appliquer un "ou-exclusif" entre chaque octet. Mais tous les codes ASCII ne sont pas des caractères imprimables. Par exemple une grande partie des codes inférieurs à 32 ainsi que le code 127 sont des caractères de contrôles utilisés dans les premiers échanges de données et ne sont pas imprimables.
Pour illustrer le principe et éviter certains de ces problèmes, on va adapter la situation. Les caractères utilisés seront les 32 caractères de code compris entre 64 et 95 inclus. (en grande partie les lettres capitales). Afin de rester dans cette plage, on effectuera un décalage de 64 avant d'effectuer un XOR et avant de retrouver le caractère chiffré.
On veut chiffrer le caractère "E" avec le caractère "S" du masque.
Le code de "E" est 69 : on effectue un décalage de 64, ce qui donne 5, qui en binaire se note 00101.
Le code de "S" est 83 : on effectue un décalage de 64, ce qui donne 19, qui en binaire se note 10011.
On effectue l'opération 00101 XOR 10011 = 10110
Le résultat correspond à 22. Or le caractère de code ASCII 22 n'est pas imprimable.
On effectue un décalage dans l'autre sens, en ajoutant 64 cette fois, et on obtient 86 qui correspond au caractère "V"
Donc le caractère "E" chiffré avec le masque "S" donne le caractère "V".
Voici le code Python d'une fonction qui chiffre le message message avec le masque masque. Le masque doit être ici de longueur supérieure ou égale à celle du message.
Rappel : le "ou-exclusif" bit à bit se note ^ en python
def chiffre(message, masque):
message_chiffre = ""
for i in range(len(message)):
lettre_chiffree = chr(64+(ord(message[i])-64) ^ (ord(masque[i])-64))
message_chiffre += lettre_chiffree
return message_chiffre
Exemple d'utilisation pour chiffrer le message BONJOUR avec le masque CLESECRETE :
>>> chiffre("BONJOUR","CLESECRETE")
'ACKYJV@'
Vocabulaire utilisé :
Travail à faire :
Tester cette fonction dans EduPython avec le message et le masque de votre choix (composés uniquement de lettres capitales et un des 6 caractères @, [, \, ], ^, et _).
Puis avec la même situation :
Que remarque-t-on ?
Proposez une solution en Python pour chiffrer par OU-Exclusif un message quelconques avec une clé quelconque :
Votre programme doit afficher 3 informations dans la console de Python :
![]() |
Le chiffrement asymétrique |
Dans un algorithle de chiffrement asymétrique on utilise 2 clés numériques différentes :
Principe du chiffrement asymétrique et rôle de chaque clé
Dans le chiffrement asymétrique la clé publique sert à chiffrer, et seulement à chiffrer : elle peut donc circuler sur le réseau car elle ne permet pas de déchiffrer les données. Comme son nom l'indique la clé publique peut être connue de tous.
La clé privée permet de déchiffrer les données (et ne peut pas chiffrer). Elle est différente de la clé publique (mais elle y est liée mathématiquement) et elle dot rester absolument secrète.
L'objectif du chiffrement asymétrique est de ne jamais faire circuler sur le réseau la clé privée qui sert à déchiffrer, et qui, comme son nom l'indique doit rester privée.
Comme les deux clés sont liée entre elle mathématiquement, elle doivent être générées par le même personne.
Prenons un exemple concret d'échange d'information : Bob et Alice veulent communiquer de manière sécurisé. C'est Bob qui veut envoyé un message chiffré à Alice.
Comme c'est Bob qui envoie le message à Alice :
Alice calcule donc 2 clés numériques :
Après avoir calculé les 2 clés, Alice envoie en clair à Bob la clé publique (ne manière non sécurisé).
Lorsque Bob a reçu la clé publique, il chiffre son message puis l'envoie à Alice.
Lorsqu'Alice reçoit le message chiffré, elle le déchiffre avec sa clé privée qu'elle a concervé précieusement :
Au final Alice retrouve bien le message en clair que Bob lui a écrit, mais ce n'est pas la même clé qui a chiffré et qui a déchiffré ce message.
En pratique, l'algorithle de chiffrement asymétrique le plus connu et le plus utilisé est le chiffrement RSA.
Le chiffrement RSA
Le chiffrement RSA permet aux utilisateurs de chiffrer les messages avec un code appelé clé publique qu'ils peuvent partager ouvertement. En raison des propriétés mathématiques spécifiques de l'algorithme RSA, une fois qu'un utilisateur chiffre un message avec une clé publique, seule une clé privée peut le déchiffrer.
Principe de l'algorithme de chiffrement asymétrique RSA si Bob veut envoyer un message chiffré à Alice :
Étape 1 : Alice génère 2 clés : une clé publique qui servira seulement à chiffrer, et une clé privée qui servira seulement à déchiffrer. Alice garde bien avec elle la clé privée sans l'envoyer sur le réseau
Étape 2 : Alice envoie la clé publique à Bob. Cet envoie peut être non sécurisé, la clé publique ne servant qu'à chiffrer (et non à déchiffrer) elle n'a rien de secret
Étape 3 : Avec la clé publique que Bob a reçu il chiffre son message
Étape 4 : Bob envoie ensuite son message chiffré à Alice
Étape 5 : Avec la clé privée qu'elle a concervée, Alice peut déchiffrer le message que Bob lui a envoyé
La difficulté est de trouver 2 clés numériques de telle sorte que :
Les clés sont des couples de valeurs permettant le calcul de l’information chiffrée et de l’information déchiffrée.
Appliquons l'algorithme de chiffrement asymétrique RSA dans un cas précis :
Exemple : la clé publique est (33, 3), et la clé privée est (33, 7). Ces clés sont bien différentes. On remarque qu'elles ont le premier nombre en commun.
On note mod l'opérateur modulo (reste de la division Euclidienne), qui s'écrit % en langage Python :
Chiffrement à partir de la clé publique (n, e)
Soit un nombre M que l'on souhaite chiffrer. Son chiffrement est donné par la formule C = Me (mod n)
On obtient le nombre chiffré C. M doit être strictement inférieur à n.
Chiffrons, grâce à Python, le nombre 25 à l’aide de la clé publique (33, 3) : C = 25**3%33 = 16
Déchiffrement à partir de la clé privée (n, d)
Pour déchiffrer C et obtenir M, la formule est M = Cd (mod n)
Déchiffrons le nombre chiffré précédent à l’aide de la clé privée (33, 7) : M = 16**7%33 = 25
On a bien retrouvé la valeur de départ de M avant chiffrement, soit 25.
Qu'obtient-on si on essaye de déchiffrer en utilisant la clé publique (33, 3) ? Réponse : 16**3%33 = 4
On obtient la valeur 4 qui n'a aucun rapport avec la valeur de départ de M qui valait 25.
Conclusion : la clé privée est indispensable pour déchiffrer, et la clé publique ne permet pas de déchiffrer.
Mais en RSA la difficulté n'est pas de chiffrer ou de déchiffrer :
La difficulté est de calculer un couple de clés cohérent : la clé publique (n, e) et la clé privée (n, d)
Génération des clés
Voici l'algorithme à suivre, en 5 étapes, pour générer un couple de clés privée et publique.
Étape 1 : Choisir p et q, deux nombres premiers distincts.
Étape 2 : Calculer leur produit n = p.q, appelé module de chiffrement.
Étape 3 : Calculer la valeur de la fonction indicatrice d’Euler φ (n)=(p−1)×(q−1)
Étape 4 : Choisir un entier naturel e premier avec φ(n) et strictement inférieur à φ(n), appelé exposant de
chiffrement.
Étape 5 : Calculer l'entier naturel d, inverse de e modulo φ(n), et strictement inférieur à φ(n), appelé
exposant de déchiffrement. d peut se calculer efficacement par l'algorithme d'Euclide étendu.
Dans la pratique, plus les nombres premiers de départ p et q son grand, plus le chiffrement sera sécurisé.
Exemple chiffré étape par étape pour calculer un couple de clés :
Étape 1 : on choisit p=47 et q=59 (deux nombres premiers différents)
Étape 2 : on calcule leur produit n = 47*59 = 2773 (module de chiffrement)
Étape 3 : on calcule φ (n)=(p−1)×(q−1)=46*58=2668
Étape 4 : calcul de la clé publique e : on choisit un entier naturel e premier avec φ(n) et strictement inférieur à φ(n) : prenons par exemple e=157 (exposant de chiffrement). En effet 157 est inférieur à 2668 et 2668 n'est pas multiple de 157.
Étape 5 : calcul de la clé privée d : on calcule l'entier naturel d, inverse de e modulo φ(n), et strictement inférieur à φ(n), appelé exposant de déchiffrement. On trouve alors d=17
Remarque : pour calculer d, connaissant p, q et e on pourra utiliser l'application interactive ci-dessous (pour obtenir d à la main il faut appliquer l'algorithme d'Euclide étendu non dévelopé ici consistant à effectuer une série de divisions Euclidiennes consécutives). Parmi les 5 étapes permettant de générer un couple de clés pour le chiffrement asymétrique RSA, l'étape 5 calculant d pour trouver la clé privée est le loin l'étape la plus complexe.
![]() |
Nous avons maintenant deux nombres :
Et nous avons maintenat un couple de clés utilisable pour le chiffrement asymétrique RSA :
Comme ici n=2773 on peut chiffrer des nombres compris entre 0 et 2772. Exemple :
Remarque : si M=0 alors C=0 et si M=1 alors C=1. En clair, les valeurs 0 et 1 sont inchangées une fois chiffrées car 0**k=0 et 1**k=1. L'algorithme RSA ne peut réellement chiffrer que des nombres entiers M supérieur à 1 (et toujours inférieur à n) :
1 < M < n
Voici pour information la liste des 50 premiers nombres premiers (à utiliser pour les valeurs de p et q) :
2 |
3 |
5 |
7 |
11 |
13 |
17 |
19 |
23 |
29 |
31 |
37 |
41 |
43 |
47 |
53 |
59 |
61 |
67 |
71 |
73 |
79 |
83 |
89 |
97 |
101 |
103 |
107 |
109 |
113 |
127 |
131 |
137 |
139 |
149 |
151 |
157 |
163 |
167 |
173 |
179 |
181 |
191 |
193 |
197 |
199 |
211 |
223 |
227 |
229 |
Travail à faire en binôme : et si on jouait à Bob et Alice ?
Programme en Python à réaliser :
Pour chiffrer et déchiffrer avec l'algorithme asymétrique RSA il faut disposer des deux clé publique et privée.
Pour générer les clés publique et privée il faut partir de 2 nombres premiers.
Pour savoir si un nombre est premier ou pas, il faut appliquer un test de primalité.
Vous trouvrez ci-dessous 3 programmes en Python servant de base :
En vous inspirant de ces programmes exemples, vous devez réaliser un seul programme en Python dont le fonctionnement est le suivant :
![]() |
|
![]() |
|
![]() |
Ressources disponibles :
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
Conclusion |
Vous connaissez maintenant la différence entre les deux techniques de chiffrement :
Il n'y a pas de lien caché ici ! ! !
Réalisé par Jean-Christophe MICHEL
© Mars 2025