Aller au contenu principal

TP1 - Introduction à la sécurisation des communications

Objectifs
  1. Comprendre l'importance du chiffrement ;
  2. Mettre en place des solutions de chiffrement ;
TP

Les questions se répondent sur feuille (ou word).
La programmation se fait sur python.

Introduction

Du grec λόγος (lógos, la parole) et κρυπτός (krúptô, caché), la cryptologie désigne la science des secrets.
Elle se découpe en 2 branches :

  • La cryptographie : l'art de protéger les messages;
  • La cryptanalyse : l'art de décrypter les messages.

Nous allons nous intéresser aux bases de la cryptologie, avec les premières méthodes de sécurisation inventées durant l'Antiquité : le chiffrement de César et le carré de Vigenère.

Chiffrement de César

Histoire

Aussi appelé chiffrement par décalage, cette méthode était utilisée jadis par Jules César lors d'échanges de messages avec ses généraux durant les guerres.

Méthode

La méthode consiste à remplacer chaque lettre du message par une autre lettre, en décalant d’un certain nombre(clé) vers la droite dans l’alphabet.

Exemple :

"Bonjour" avec un décalage de 1 donne "Cpokpvs", car :

  • B devient C ;
  • O devient P ;
  • N devient O ;
  • ... Lorsque le décalage dépasse la lettre Z, on revient à la lettre A.

Chiffrer/Déchiffrer

  1. Avec notre alphabet, jusqu’à combien de décalage pouvons-nous faire ?
  2. Cette méthode est-elle sécurisée ? Pourquoi ?
Chiffer un caractère

Pour faire un décalage sur python, nous allons utiliser la table ASCII, qui associe une lettre à un nombre (codification). Il existe 2 fonctions permettant de passer d’un caractère à sa valeur dans la table, et inversement :

  • ord(char) : prend un caractère, et renvoie son entier dans la table ASCII ;
  • chr(int) : prend un entier et renvoie le caractère associé à cet entier dans la table.
  1. Écrire la fonction decalage(lettre, decal) qui prend une lettre et un entier, décale la lettre en fonction de l’entier dans la table ASCII, et renvoie la nouvelle lettre associée.
    Exemple

    decalage("a",2) donne "c".

On souhaite écrire une fonction chiffrementCesar(message, decal) qui prend une chaine de caractères à chiffrer en paramètre et le décalage à effectuer, et renvoie le message chiffré.

  1. Implémenter cette fonction avec l’aide de la fonction decalage écrite juste avant. Ne pas oublier de faire la vérification des espaces si vous avez plusieurs mots.
  2. Modifier la fonction decalage pour qu’elle puisse prendre en compte une valeur négative pour decal, permettant de déchiffrer le message.
  3. Tester avec l’appel suivant :
    print(chiffrementCesar(chiffrementCesar("bonjour",-1),1))
    La fonction doit afficher la même chaîne de caractères.
  4. Que donne la phrase suivante avec un décalage de 17 (vers la gauche) : mflj vkvj kifg wfikj ?

Décrypter

Définition

On parle de décryptage lorsque l'on chercher à déchiffrer le message sans en connaître la clé.
Ici, on va chercher le décalage à effectuer pour déchiffrer un message.

Dans la langue française, on estime que les lettres utilisées se répètent à une certaine fréquence. On retrouve ainsi le tableau suivant :

qui indique par exemple que la lettre A existe à 7.68% dans la langue française, 0.8% pour la B, etc... La lettre E est utilisée à 17.76%, ce qui représente la lettre la plus utilisée et la plus fréquente dans un texte.

Objectif

Dans un message chiffré par César, l’objectif est de retrouver quelle est la lettre que l'on retrouve le plus dans le message, et déterminer le décalage qu’il y a entre elle et la lettre E.

Il peut arriver que ce ne soit pas toujours la lettre E, il faut donc regarder dans le tableau les autres lettres les plus utilisées.

  1. Écrire une fonction dicoLettre(message) qui prend un message chiffré en paramètre,et retourne un dictionnaire dont les clés sont les lettres du message, et la valeur est le nombre de fois que la lettre apparaît dans le message.
    Il faudra faire attention à ne pas prendre en compte l’espace dans les clés.
  2. Écrire une fonction lettreFrequente(message) qui, à partir d’un dictionnaire créé avec le message en paramètre, retourne la lettre la plus fréquente du message.
  3. On dispose du message suivant : hw joe aop hw iaehhaqna zao iwpeanao. Quelle est la lettre la plus fréquente?

Carré de Vigenère

Le carré de Vigenère utilise une matrice de lettres pour chiffrer :

Méthode

Pour chiffrer un message, on utilise un mot en guise de clé. La clé est répétée autant de fois que nécessaire, pour que chaque lettre du message ait une lettre de la clé qui lui est associée.
La lettre correspondant à la clé se trouve dans la colonne rose, la lettre du mot à chiffrer se trouve dans la rangée verte. La lettre chiffrée se trouve à l’intersection.

Exemple
  • Mot à chiffrer : bonjour
  • Clé : nsi

Résultat :

  • clair : bonjour
  • clé : nsinsin
  • chiffré : ogvwgce

Pour déchiffrer, on regarde la lettre de la clé dans la colonne rose, on parcourt sa rangée jusqu’à tomber sur la lettre du message chiffré, et on remonte la colonne jusqu’à arriver à la case verte.

  1. Créer une fonction matriceLettre() permettant de retourner la matrice de lettres.
  2. Créer une fonction associerCle(message, cle) qui retourne une chaîne de caractères contenant autant de fois la clé que la longueur du message (voir exemple plus haut).
  3. Écrire une fonction chiffrerLettre(lettre,cle) qui prend une lettre du message en clair, ainsi qu'une lettre de la clé, et retourne la lettre chiffrée.
  4. Tester la fonction avec pour lettre r et pour clé j.