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 chiffremessage
en 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
34
Indice
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