TD Chiffrement de César⚓︎
Introduction Historique⚓︎
Avant les Romains⚓︎
L'une des premières techniques de Chiffrement, au \(V\)ème Siècle av J.C., est utilisée par les Hébreux pour les textes religieux. La méthode consiste à :
- remplacer un \(A\) par un \(Z\)
- remplacer un \(B\) par un \(Y\), etc...
Cette méthode est appelée atbash, du nom des 1ères et dernières lettres de l'alphabet Hébreu : aleph (\(\aleph=A\)), tav (ת\(\approx Z\)), beth (\(\beth=B\)), shin (ש\(\approx Y\)).
Il s'agit du premier exemple dans l'Histoire d'une méthode cryptographique connue de nos jours sous le nom de chiffrement par substitution monoalphabétique :
Def
Un
- On remplace/substitue une lettre par une (autre) lettre
- une même lettre de départ étant toujours chiffrée par la même lettre d'arrivée
Les Romains⚓︎
Quelques Siècles par tard, l'armée Romaine, via son commandeur en Chef Jules César, au \(I\)er Siècle av. J.C., utilisait le codage suivant pour communiquer avec ses troupes situées quelquefois très loin de Rome.
Def
Le
- coder une lettre en une autre lettre, de la manière suivante :
- On décale chaque lettre d'un certain nombre de crans, ou de rangs, vers la droite ou vers la gauche : c'est le
décalage (de chiffrement) . On le note usuellementdoudecalage
Il s'agit donc d'un autre exemple de Chiffrement par Substitution monoalphabétique
Par exemple d = +3 signifie qu'on décale chaque lettre de 3 rangs vers la droite (+ = vers la droite, - = vers la gauche)
But de ce TD⚓︎
Le but de ce TD est de créer des fonctions pour:
- préparer/nettoyer un texte initial, au sens où on enleve tous les signes diacritiques (lettres accentuées, ç, ñ, etc..), on le met en majuscules, on lui enlève tout autre caractère
- Cryptographie : Chiffrer un texte avec le chiffrement de César
- Cryptanalyse : Déchiffrer un texte, en connaissant à l'avance, ou pas, le décalage
dutilisé - Apprendre à lire, et écrire dans des fichiers texte avec Python
Préparation du texte⚓︎
-
Créer une fonction
sans_accents(texte:str)->strqui accepte en entrée untexte:strpouvant contenir des signes diacritiques (caractères accentués, ç, ñ, etc..), et qui renvoie en sortie, le même texte mais sans les accents, ni aucun signe diacritique. On devra pour cela, utiliser scrupuleusement le tableau de remplacement des caractères détaillé sur cette page qui résume :- les Alt Codes / Point de Code Unicode permettant de taper ces signes diacritiques (caractères accentués/spéciaux, etc..) dans votre IDE et votre OS favoris, et également,
- par quel.s caractère.s précisément, la fonction
sans_accents()doit le/les remplacer.
Remarque
Le but de la fonction
sans_accents()est purement pédagogique : il manquera inévitablement de nombreux caractères accentués à remplacer (on ne va pas tous les traiter, c'est trop long), mais on pourra au moins en traiter quelques uns, comme première approche... -
Créer une fonction
vers_maj(texte:str)qui accepte en entrée une variabletexte:str, et qui renvoie en sortie le même texte en majuscules (seules les lettres de l'alphabet minuscules doivent être transformées) -
Créer une fonction
sans_autres_caract(texte:str)->strqui supprime de letextetous les caractères autres que des lettres de l'alphabet Exemple : Suppression de.,;:!-_*etc... -
Créer une fonction
preparer(texte:str)->strqui prépare le texte clair non nettoyé :- supprimer les accents, et remplacer les caractères avec signes diacritiques (ç, ñ, etc..)
- mettre le texte en majuscule
- supprimer tous les autres caractères (autres ques lettres de l'alphabet)
-
Créer une fonction
afficher(texte:str)->Nonequi accepte en entrée untexteclair déjà preparé, et qui renvoie en sortie le même texte nettoyé, mis en forme de la manière suivante :- Lettres regroupées par paquets de \(5\),
- Les paquets de \(5\) lettres (Colonnes) sont séparés par des espaces
- le tout sur \(8\) colonnes (de \(5\) lettres), ensuite on doit forcer le retour à la ligne
\n
Exemple d'affichage attendu :
ABCDE XYZTE GKEID PANVL JEIDK SSEOV JZOCD AZEOF GFDRS FQOES FLEOF QORNV DXEOP DAPEI CNWBF QDLDP FPEOG QNDLG MPOEZ DLEOZ LFPEM FLEPA XLKIO FDKQO GKTOP FGX etc..
Cryptographie⚓︎
- Créer une fonction
chiffrer(texte:str,decalage:int)->stroucoder(texte:str, decalage:int)->str, qui :- accepte en entrée les paramètres suivants :
- un texte
texte:strà présenter, ainsi que - le
decalagede chiffrement, qui est le nombre de rangs décalés (vers la droite, si positif) - renvoie en sortie le même texte chiffré (dont chaque lettre a été décalée - droite ou gauche - d'un nombre de rangs égal à
decalage) Exemple : Pourdecalage=3, la lettreAest chiffrée enD(\(A \rightarrow B \rightarrow C \rightarrow D\)) donc décalée de 3 rangs vers la droite
Cryptanalyse⚓︎
-
Créer une fonction
dechiffrer_connu(texteChiffre:str,decalage:int)qui déchiffre un texte chiffré dont on connaît à l'avance le décalage DE CHIFFREMENT. -
On adopte maintenant le point de vue de l'attaquant que l'on appelle la cryptanalyse, consistant à:
- ne connaître QUE le texte chiffré
- En particulier, on ne connaît plus le texte en clair, ni le décalage de chiffrement
Quelles stratégies de décodage (cryptanalyse) peut-on adopter dans ce cas-là?
-
Écrire une fonction
frequences(texte:str)->listqui :- reçoit en entrée un paramètre
textecontenant une certaine chaîne de caractère - qui renvoie en sortie, la liste de toutes les fréquences des lettres de l'alphabet (majuscules) présentes (ou pas) dans la
texte(qui est censée être déjà préparée, càd qu'elle ne contient QUE des lettres de l'alphabet majuscules, deA -> Z) Exemple de renvoi attendu:[4,6,0, ..., 20]modélise :4occurences de la lettreA6occurences de la lettreB0(donc aucune) occurence.s de la lettreC...20occurences de la lettreZ
- reçoit en entrée un paramètre
-
Créer une fonction
maxi(l:list)->floatqui a:- reçoit en entrée une liste d'entiers correspondant aux occurences des lettres de l'alphabet (majuscule) dans ma texte chiffré.
- renvoie en sortie la valeur maximale de cette liste
l
-
Créer une fonction
mini(l:list)->floatqui a:- reçoit en entrée une liste d'entiers correspondant aux occurences des lettres de l'alphabet (majuscule) dans ma texte chiffré.
- renvoie en sortie la valeur minimale de cette liste
l
-
Créer une fonction
indice_du_max_dans(l:list)->intqui a:- reçoit en entrée une liste d'entiers correspondant aux occurences des lettres de l'alphabet (majuscule) dans ma texte chiffré.
- renvoie en sortie l'indice correspondant à la valeur maximale de cette liste
l
Lecture & Écriture de Fichiers⚓︎
-
Créer une fonction
get_texte(name:str)->strqui :- Ouvre en lecture seule le fichier
nameet - stocke son contenu dans une variable
textede typestr, préparé (en majuscules, sans les espaces ni autres caractères non alphabétiques, etc..)
- Ouvre en lecture seule le fichier
-
Créer une fonction
ecrire_dans_fichier(texte:str, name:str)->Nonequi :- Ouvre en écriture le fichier
nameet - écrit le contenu de la variable
textede typestr, dans le fichiername, mais mis en forme de la manière suivante : - sans accents, en majuscules, sans caractères non alphabétiques
- regroupement des lettres : par groupes de 5
- 8 colonnes (de 5 lettres) en tout, ensuite retour à la ligne
\nobligatoire
- Ouvre en écriture le fichier
Cryptanalyse (suite)⚓︎
-
Créer une fonction
get_caract_le_plus_frequent(texte:str)->strqui :- reçoit en entrée un
textede typestret - renvoie en sortie le caractère le plus fréquent du
texte
- reçoit en entrée un
-
Créer une fonction
decalage(texteChiffre:str)->intqui :- reçoit en entrée un
texteChiffre - calcule puis renvoie le
decalage(un nombre entier donc) qu'on a utilisé pour chiffrer ce texte
- reçoit en entrée un
-
Créer une fonction
dechiffrer(texteChiffre:str)->strqui :- reçoit en entrée une
texteChiffre - renvoie le décodage/déchiffrage, appelé
texteClair, dutexteChiffre, grâce au décalage calculé grâce à la fonctiondecalage()précédente
- reçoit en entrée une
-
Créer une fonction/procédure
dechiffrer_fichier(nameEntree:str, nameSortie:str)->Nonequi :- reçoit en entrée :
- le nom
nameEntreedu fichier (déjà existant) contenant le texte Chiffré, et - le nom
nameSortiedu fichier (à créer), dans lequel la fonction doit écrire le texte Déchiffré
- le nom
- crée et ouvre en écriture un fichier
nameSortieet écrit dedans le texte Déchiffré. Par exemple :nameEntree="texteInitial.txt"etnameSortie="texteDechiffre.txt"
- reçoit en entrée :
Défie tes amis!
⚓︎
-
Trouver sur internet un livre quelconque de ton choix, au format
.txt, téléchargez-le, puis placer-le dans le même répertoire que votrefichier.py.On pourra par exemple en choisir un, tombé dans le domaine public, en français, sur le site du Projet Gutenberg.org. Vous ne savez pas lequel choisir ? Télécharger Une Saison en Enfer, d'Arthur Rimbaud
Renommez le fichier téléchargé de votre livre en
monLivre.txt -
Créer une fonction
defi_jeu(filenameEntree,filenameSortie), qui automatise le chiffrement de César d'un livre stocké dans"monLivre.txt", ainsi cette fonction :- reçoit en entrée une chaîne de caractère
name="monLivre.txt"correspondant au nom du fichier texte qui contient ton livre quelconque téléchargé sur internet (au format.txt, et à l'état brut : sans aucun traitement). - prépare le texte contenu dans le fichier
name, au sens de : enlève les signes diacritiques, mets en majuscules, enlève les autres caractères non alphabétiques, et stocke le résultat dans une variabletexteClairde typestr - Calcule un nombre entier aléatoire
decalagecompris entre1et25(pourquoi pas0? pourquoi pas plus que25? pourquoi pas moins de0?) Afficher cette valeur dans le terminal (pour que vous puissiez connaître le décalage que vous utilisez...)
- Chiffre le
texteClairavec ledecalagecalculé aléatoirement (dans le point précédent), et - stocke le résultat dans une variable
texteChiffrede typestr - Enregistre le contenu de la variable
texteChiffredans un fichier"defi.txt"(à placer dans le même répertoire que votrefichier.py) Défie tes amis !!envoie-leur ton fichier et mets les au défi de le décoder !! Tu n'as pas d'amis
? Essaye de décoder ce livre
- reçoit en entrée une chaîne de caractère