Chiffrement selon le code de César⚓︎
D'après 2021, Centres étrangers, J1, Ex. 1
Dans cet exercice, on étudie une méthode de chiffrement de chaines de caractères alphabétiques. Pour des raisons historiques, cette méthode de chiffrement est appelée « code de César ».
On considère que les messages ne contiennent que les lettres capitales de l'alphabet "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
et la méthode de chiffrement utilise un nombre entier fixé appelé la clé de chiffrement.
1. Soit la classe CodeCesar
définie ci-dessous :
class CodeCesar:
def __init__(self, cle):
self.cle = cle
def decale(self, lettre):
indice_1 = indice(lettre)
indice_2 = indice_1 + self.cle
if indice_2 >= 26:
indice_2 = indice_2 - 26
if indice_2 < 0:
indice_2 = indice_2 + 26
nouvelle_lettre = lettre(indice_2)
return nouvelle_lettre
On dispose aussi des fonctions lettre(indice)
et indice(lettre)
qui renvoient respectivement la lettre majuscule correspondant à un indice donné et l'indice (la position d'une lettre) dans l'alphabet latin usuel. Cette position est comprise entre 0
pour le A
et 25
pour le Z
.
Passer d'un indice à une lettre
Les fonctions lettre
et indice
sont fournies ci-dessous :
def lettre(indice: int) -> str:
"""Renvoie la lettre capitale dont on fournit
l'indice dans l'alphabet (entre 0 et 25)
"""
return chr(ord("A") + indice)
def indice(lettre: str) -> int:
"""Renvoie l'indice dans l'alphabet (entre 0 et 25)
de la lettre capitale passée en argument
"""
return ord(lettre) - ord("A")
Représenter le résultat d'exécution du code Python suivant :
>>> code = CodeCesar(3)
>>> code.decale("A")
...
>>> code.decale("X")
...
Réponse
La première instruction permet d'initialiser un objet CodeCesar
correspondant à un décalage de 3 caractères. Ainsi "A"
, en position 0
devient la lettre en position 3
, c'est-à-dire 'D'
.
Pour le "X"
, si on appliquait le même décalage, on obtiendrait la lettre en position 23 + 3 = 26
, ce qui ferait échouer la fonction lettre
. On soustrait donc 26
pour trouver 'A'
.
>>> code = CodeCesar(3)
>>> code.decale("A")
'D'
>>> code.decale("X")
'A'
2. La méthode de chiffrement du « code de César » consiste à décaler les lettres du message dans l'alphabet d'un nombre de rangs fixé par la clé.
Par exemple, avec la clé 3
, toutes les lettres sont décalées de 3 rangs vers la droite : le "A"
devient le "D"
, le "B"
devient le "E"
, etc.
Ajouter une méthode chiffre(self, texte)
dans la classe CodeCesar
définie à la question précédente.
Cette méthode reçoit en paramètre une chaîne de caractères (le message à chiffrer) et renvoie une chaîne de caractères (le message chiffré).
La méthode chiffre(self, texte)
doit chiffrer la chaîne texte
avec la clé de l'objet de la classe CodeCesar
qui a été instanciée.
Exemple :
>>> code = CodeCesar(3)
>>> code.chiffre("NSI")
'QVL'
Réponse
def chiffre(self, texte):
chaine = ""
for caractere in texte:
chaine = chaine + self.decale(caractere)
return chaine
3. Écrire une fonction qui :
-
prend en argument la clef de chiffrement et le message à chiffrer ;
-
instancie un objet de la classe
CodeCesar
; -
renvoie le texte chiffré.
Réponse
def chiffre_texte(clef, texte):
code = CodeCesar(clef)
return code.chiffre(texte)
Il est aussi possible de se passer de la variable code
en faisant :
def chiffre_texte(clef, texte):
return CodeCesar(clef).chiffre(texte)
4. On ajoute la méthode transforme(texte)
à la classe CodeCesar
:
def transforme(self, texte):
self.cle = -self.cle
message = self.chiffre(texte)
self.cle = -self.cle
return message
On exécute la ligne suivante dans une console CodeCesar(10).transforme("PSX")
Que va-t-il s'afficher ? Expliquer votre réponse.
Réponse
Le message 'FIN'
va s'afficher dans la console.
La méthode proposée permet de déchiffrer le message en appliquant la transformation opposée.