Aller au contenu

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 :

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)

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.

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)

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

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞

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'

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞

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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞

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...

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞

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 !"

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞

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.'

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞

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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Évaluations restantes : /∞