Dictionnaire de chiffrement

D'après 2022, Centres étrangers, J2, Ex. 2

La cryptographie est un ensemble de techniques permettant de chiffrer un message.

Une technique de cryptographie consiste à mélanger les lettres d'un alphabet et à réécrire le message avec ces permutations. En Python, on peut créer un dictionnaire dans lequel les clés sont les lettres de l'alphabet et les valeurs sont celles de l'alphabet mélangé.

Exemple

Par exemple, si l'alphabet contient les 4 lettres A, B, C et D, et si le dictionnaire de l'alphabet mélangé est alpha = {"A": "B", "B": "D", "C": "A", "D": "C"}, la chaine de caractères "BAC" sera chiffrée "DBA".

Un tel dictionnaire sera appelé dictionnaire de chiffrement.

1. On souhaite chiffrer un message écrit avec l'alphabet A, B, C, D, E, F, G à l'aide du dictionnaire alpha ={"A": "B", "B": "D", "C": "A", "D": "C", "E": "F", "F": "G", "G": "E"}

1.a. Quelle est la valeur associée à la clé "D" ? En Python, comment l'obtenir ?

Réponse

la valeur associée à la clé "D" est "C", on l'obtient en Python avec alpha["D"].

1.b. Chiffrer la chaine de caractères "BAGAGE" avec le dictionnaire alpha.

Réponse

On obtient "DBEBEF".

2. On considère qu'un mot est une chaine de caractères (un objet de type str) écrite uniquement avec les 26 lettres de l'alphabet en majuscule. Par exemple, "ARBRE" est un mot et "L'ARBRE !" n'est pas un mot à cause des caractères : "'", " "(espace) et "!".

Écrire une fonction chiffrer qui prend en paramètres mot un mot et alpha un dictionnaire de chiffrement, telle que chiffrer(mot, alpha) renvoie mot sous forme de chaine chiffrée avec le dictionnaire de chiffrement alpha.

Réponse
🐍 Script Python
def chiffrer(mot, alpha):
    resultat = ""
    for c in mot:
        resultat = resultat + alpha[c]
    return resultat

3. On souhaite déchiffrer un mot chiffré avec cette méthode.

3.a. Si un mot est chiffré avec le dictionnaire de chiffrement alpha = {"A": "B", "B": "D", "C": "A", "D": "C", "E": "F", "F": "G", "G": "E"}, donner un dictionnaire permettant de le déchiffrer.

Réponse

On peut déchiffrer avec le dictionnaire {"A": "C", "B": "A", "C": "D", "D": "B", "E": "G", "F": "E", "G": "F"}

3.b. Écrire une fonction en Python appelée dico_dechiffrement qui prend en paramètre dico un dictionnaire de chiffrement et qui renvoie un dictionnaire permettant le déchiffrement. On pourra s'inspirer du code incomplet ci-dessous ou proposer une autre solution :

🐍 Script Python
def dico_dechiffrement(dico):
    nouveau = {}
    for lettre in dico:
        code = dico[...]
        nouveau[...] = ...
    return nouveau
Réponse
🐍 Script Python
def dico_dechiffrement(dico):
    nouveau = {}
    for lettre in dico:
        code = dico[lettre]
        nouveau[code] = lettre
    return nouveau

3.c. Écrire une fonction telle que dechiffrer(mot_chiffre, dico) renvoie le mot décodé, quand mot_chiffre est chiffré par le dictionnaire de chiffrement dico. On utilisera les fonctions écrites dans les questions précédentes.

Réponse
🐍 Script Python
def dechiffrer(mot_chiffre, dico):
    dico_inverse = dico_dechiffrement(dico)
    return chiffrer(mot_chiffre, dico_inverse)

4. On souhaite à présent créer un dictionnaire de chiffrement. Écrire une fonction dico_chiffrement qui prend en paramètre alphabet un tableau de lettres et qui renvoie un dictionnaire de chiffrement dont les clés sont les lettres du tableau alphabet et les valeurs sont les lettres du tableau alphabet mélangées.

On pourra utiliser la fonction shuffle du module random qui mélange en place un tableau. Par exemple, on a :

🐍 Console Python
>>> tableau = ["A", "B", "C", "D"]
>>> shuffle(tableau)
>>> tableau
["B", "A", "D", "C"]
Réponse
🐍 Script Python
def dico_chiffrement(alphabet):
    alpha = alphabet.copy()
    shuffle(alpha)
    dico = {}
    for i in range(len(alphabet)):
        dico[alphabet[i]] = alpha[i]
    return dico

⚠ Il est important de faire une copie de alphabet avant de faire le mélange.

Pour la copie on peut aussi faire

  • alpha = [lettre for lettre in alphabet] une liste en compréhension ;
  • alpha = alphabet[:] une copie de tranche complète ; ceci est hors programme et déconseillé.