Aller au contenu

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 :

🐍 Script Python
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 :

🐍 Script Python
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 :

🐍 Console Python
>>> 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'.

🐍 Console Python
>>> 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 :

🐍 Console Python
>>> code = CodeCesar(3)
>>> code.chiffre("NSI")
'QVL'

Réponse
🐍 Script Python
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
🐍 Script Python
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 :

🐍 Script Python
def chiffre_texte(clef, texte):
    return CodeCesar(clef).chiffre(texte)

4. On ajoute la méthode transforme(texte) à la classe CodeCesar :

🐍 Script Python
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.