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 chiffre message en le XORant avec masque.

  • 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 :

1
>>> 34^25
2
59
3
>>> 59^25
4
34

Indice

La fonction ord permet de renvoyer le code ASCII d'un caractère. La fonction chr fait l'opération inverse.

1
>>> ord('A')
2
65
3
>>> chr(65)
4
'A'

Solution

1
masque = "LECHIFFREMENTENNSIESTCOMPLIQUEACOMPRENDREOUPAS"
2
3
def chiffre(message, masque):
4
    message_chiffre = ""
5
    for i in range(len(message)):
6
        lettre_chiffree = chr(ord(message[i]) ^ ord(masque[i]))
7
        message_chiffre += lettre_chiffree
8
    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...

1
def chiffre(message, masque):
2
    message_chiffre = ""
3
    for i in range(len(message)):
4
        lettre_chiffree = chr(64+(ord(message[i])-64) ^ (ord(masque[i])-64))
5
        message_chiffre += lettre_chiffree
6
    return message_chiffre
7