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 chiffre
qui prend en paramètres mot
un mot et alpha
un dictionnaire de chiffrement, telle que chiffre(mot, alpha)
renvoie mot
sous forme de chaine chiffrée avec le dictionnaire de chiffrement alpha
.
Réponse
def chiffre(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 :
def dico_dechiffrement(dico):
nouveau = {}
for lettre in dico:
code = dico[...]
nouveau[...] = ...
return nouveau
Réponse
def dico_dechiffrement(dico):
nouveau = {}
for lettre in dico:
code = dico[lettre]
nouveau[code] = lettre
return nouveau
3.c. Écrire une fonction telle que dechiffre(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
def dechiffre(mot_chiffre, dico):
dico_inverse = dico_dechiffrement(dico)
return chiffre(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 :
>>> tableau = ["A", "B", "C", "D"]
>>> shuffle(tableau)
>>> tableau
["B", "A", "D", "C"]
Réponse
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é.