Technique du masque jetable
Dans la grande famille du chiffrement symétrique, le code le plus connu est celui de Jules César, plus techniquement dénommé chiffrement par décalage : on décale en effet chaque lettre de l'alphabet d'un certain nombre de rangs fixe qui est appelé la clé de chiffrement.
Exemple, avec la clé 3, A devient D, B devient E...
Le chiffrement par la méthode du masque jetable consiste à combiner le message en clair avec une clé présentant les caractéristiques très particulières suivantes :
La clé doit être une suite de caractères au moins aussi longue que le message à chiffrer.
Les caractères composant la clé doivent être choisis de façon totalement aléatoire.
Chaque clé, ou « masque », ne doit être utilisée qu'une seule fois (d'où le nom de masque jetable).
Ces 2 méthodes font partie de la famille des chiffrements symétriques.
Question
On considère la variable suivante :
masque = "LECHIFFREMENTENNSIESTCOMPLIQUEACOMPRENDREOUPAS"
Créer une fonction
chiffre(message, masque)qui chiffremessageen le XORant avecmasque.Cette fonction doit pouvoir aussi servir à déchiffrer le message chiffré.
Indice
La table de vérité de XOR est :
x | y | x^y |
|---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
XOR est une opération symétrique :
>>> 34^25
59>>> 59^25
34Indice
La fonction ord permet de renvoyer le code ASCII d'un caractère. La fonction chr fait l'opération inverse.
>>> ord('A')
65>>> chr(65)
'A'Solution
masque = "LECHIFFREMENTENNSIESTCOMPLIQUEACOMPRENDREOUPAS"
def chiffre(message, masque):
message_chiffre = ""
for i in range(len(message)):
lettre_chiffree = chr(ord(message[i]) ^ ord(masque[i]))
message_chiffre += lettre_chiffree
return message_chiffre
Question
Que constatez-vous, expliquez et proposez une solution...
Indice
Dans la table ASCII, est-ce que tous les caractères sont imprimables ?
Indice
Et si on décalait de 64 lors de nos transcodages afin de n'afficher que des caractères imprimables ? D'abord, on supprime 64 lors du calcul du ord(), puis on rajoute 64 lors du calcul du chr()
Solution
Une des solutions est de décaler de 64 de telle sorte de n'obtenir que des caractères imprimables...
def chiffre(message, masque):
message_chiffre = ""
for i in range(len(message)):
lettre_chiffree = chr(64+(ord(message[i])-64) ^ (ord(masque[i])-64))
message_chiffre += lettre_chiffree
return message_chiffre