Le chiffrement de César⚓︎
Introduction⚓︎
Vocabulaire de la cryptographie
La cryptographie est l'étude des méthodes qui permettent de protéger un secret (généralement un message) en le transformant ou en le cachant dans un autre message. On appelle message en clair le message que l'on souhaite transmettre et message chiffré la version transformée.
On appelle chiffrer la transformation du message en clair au message chiffré et déchiffrer l'opération inverse.
En général pour faire ces deux opérations il faut connaître un secret qu'on appelle clef.
Les méthodes de chiffrement symétrique utilisent la même clef pour chiffrer et déchiffrer. Les méthodes de chiffrement asymétrique utilise une clef de chiffrement et une clef de déchiffrement. La première peut être publique.
On dit qu'on décrypte un message lorsqu'on le déchiffre sans utiliser la clef de déchiffrement. C'est ce qui doit être difficile pour qu'une méthode de chiffrement soit robuste. On ne dit pas crypter, qui est un anglissisme.
Il ne faut pas confondre (dé)chiffrer et (dé)coder. Lorsqu'on code un message, on le transforme pour faciliter sa transmission ou son stockage. Par exemple, on code un message en morse. Il n'y a pas de secret et n'importe qui peut décoder le message. Par exemple, les textes sont codés en binaires (avec un encodage donné) par l'ordinateur pour être manipulés ou stockés.
Présentation
Le chiffrement de César est une méthode de chiffrement symétrique relativement simple. On choisit un entier \(k\) et on décale les lettres de \(k\) dans l'ordre alphabétique.
Exemple : avion
-> cxkqp
Exemple : avion
-> ezmsr
Exemple : avion
-> ytgml
Cette méthode de chiffrement était utilisée par Jules César, d'où son nom.
L'objectif de ce projet est de programmer cette méthode de chiffrement.
Étude du problème⚓︎
Exercice 1
Faire l'exercice de la feuille.
Exercice 2
Faire l'exercice de la feuille.
Si vous avez des calculs à faire, vous pouvez utiliser ce terminal :
Préparatifs⚓︎
Utilisation des minuscules
Pour simplifier le travail, nous transformerons tous les textes en minuscule à l'aide de la méthode lower
.
>>> "BONJOUR".lower()
'bonjour'
>>> "Il était une fois.".lower()
'il était une fois.'
>>> "Ça MArcHE MÊme aVEc LeS CaraCTÈRES spÉcIAuX !!!".lower()
'ça marche même avec les caractères spéciaux !!!'
>>> texte = "ET AUSSI AVEC LES VARIABLES"
>>> texte.lower()
'et aussi avec les variables'
Codage des lettres
Pour pouvoir faire le décalage, on va convertir les lettres minuscules en nombres selon la table suivante :
On évitera les accents parce que sinon, ils ne seront pas décalés.
Rappel sur les points de code
Dans la table Unicode, tous les symboles sont associés à un nombre, appelé point de code.
On rappelle qu'en Python on peut utiliser les fonctions ord
et chr
pour obtenir ou utiliser les points de codes.
>>> ord("B")
66
>>> ord("é")
233
>>> ord("!")
33
>>> chr(32)
' '
>>> chr(234)
'ê'
>>> chr(70)
'F'
Nous allons utiliser les points de code pour obtenir le nombre que nous souhaitons pour représenter les minuscules.
Exercice 3
Répondre sur la feuille.
Vous pouvez vous aider de ce terminal.
Exercice 4
Compléter le code de la fonction code_de
qui prend en paramètre un symbole lettre
, qu'on supposera être une lettre minuscule, et qui renvoie le code associé pour le chiffrement.
Recopier votre réponse sur la feuille.
>>> code_de('a')
0
>>> code_de('h')
7
>>> code_de('r')
17
>>> code_de('z')
25
Exercice 5
Compléter le code de la fonction lettre_nb
qui prend en paramètre un entier code
, qu'on supposera entre 0 et 25, et qui renvoie la lettre correspondant aux code.
Recopier votre réponse sur la feuille.
>>> lettre_nb(0)
'a'
>>> lettre_nb(4)
'e'
>>> lettre_nb(16)
'q'
>>> lettre_nb(25)
'z'
# Tests
(insensible à la casse)(Ctrl+I)
Comparaisons multiples en Python
Python permet de tester si une valeur se trouve entre deux autres en une seule expression :
>>> 3 <= 7 <= 79
True
>>> 3 <= 98 <= 79
False
>>> 3 <= -1 <= 79
False
Exercice 6
Compléter le code de la fonction dans_alphabet
qui prend un texte symbole
, qu'on supposera de longueur 1, et qui renvoie un booléen indiquant si symbole
est une lettre minuscule.
Recopier votre réponse sur la feuille.
>>> dans_alphabet('r')
True
>>> dans_alphabet('R')
False
>>> dans_alphabet('é')
False
>>> dans_alphabet('!')
False
Indice
On pourra comparer le point de code du symbole avec le plus petit et le plus grand que peut avoir une lettre minuscule.
# Tests
(insensible à la casse)(Ctrl+I)
Programmation du chiffrement de César⚓︎
La fonction decale
Afin de programmer le chiffrement de César, il faut une méthode qui fait les décalages.
Nous souhaitons écrire une fonction decale
qui prend en paramètres un texte symbole
, qu'on suppose de longueur 1, et un entier nb
. Si symbole
est une lettre minuscule, alors la fonction renvoie la lettre correspondant à un décalage de nb
avec le chiffrement de César. Sinon, elle renvoie symbole
sans le modifier.
>>> decale('g', 3)
'j'
>>> decale('g', -3)
'd'
>>> decale('!', 3)
'!'
>>> decale('a', -3)
'x'
Exercice 7
Répondre sur la feuille.
Exercice 8
Compléter le code de la fonction decale
, en utilisant les fonctions précédentes et recopier le résultat sur la feuille.
Indice
On rappelle que l'opération a % n
correspond au reste r
de la division euclidienne de l'entier a
par l'entier n
. Cela veut dire que a
= r
+ k
×n
, avec un certain entier k
.
>>> 3 % 5
3
>>> 6 % 5
1
>>> 12 % 5
2
>>> -1 % 5
4
>>> -17 % 5
3
Il faut aussi se rappeler de l'exercice 2 sur la feuille...
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 9
Compléter le code de la fonction chiffre
qui prend en paramètres un texte message
et un entier nb
, et qui renvoie de chiffrement de message
avec un décalage de nb
. Le texte de message
est transformée en minuscules avant le chiffrement.
Indice
Vous pouvez vous inspirer de cette fonction qui prend en paramètre un texte et renvoie un nouveau texte identique :
def copie(texte):
resultat = ""
for symbole in texte:
resultat = resultat + symbole
return resultat
>>> chiffre("avion", 5)
'fants'
>>> chiffre("Le chien.", 10)
'vo mrsox.'
>>> chiffre("C'est presque fini !", -89)
"r'thi egthfjt uxcx !"
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 10
Compléter le code de la fonction dechiffre
qui prend en paramètre un texte message
et un entier nb
, et qui renvoie de déchiffrement de message
avec un décalage de nb
.
>>> dechiffre('fants', 5)
'avion'
>>> dechiffre('vo mrsox.', 10)
'le chien.'
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 11
En utilisant la fonction dechiffre
de l'exercice précédent (vous pouvez l'utiliser dans cet IDE si vous avez validé l'exercice), décrypter ce message et répondre sur la feuille. Le décalage n'est pas donné et c'est à vous de le trouver.
# Tests
(insensible à la casse)(Ctrl+I)
# Tests
(insensible à la casse)(Ctrl+I)