TP1 - Introduction à la sécurisation des communications
- Comprendre l'importance du chiffrement ;
- Mettre en place des solutions de chiffrement ;
Les questions se répondent sur feuille (ou word).
La programmation se fait sur python.

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
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.
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
- Avec notre alphabet, jusqu’à combien de décalage pouvons-nous faire ?
- Cette méthode est-elle sécurisée ? Pourquoi ?
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.
- É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.Exempledecalage("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é.
- 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. - Modifier la fonction
decalage
pour qu’elle puisse prendre en compte une valeur négative pourdecal
, permettant de déchiffrer le message. - Tester avec l’appel suivant :
La fonction doit afficher la même chaîne de caractères.
print(chiffrementCesar(chiffrementCesar("bonjour",-1),1))
- Que donne la phrase suivante avec un décalage de 17 (vers la gauche) :
mflj vkvj kifg wfikj
?

Décrypter
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.
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.
- É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. - É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. - 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 :

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
.
- 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.
- Créer une fonction
matriceLettre()
permettant de retourner la matrice de lettres. - 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). - É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. - Tester la fonction avec pour lettre r et pour clé j.