Le chiffrage de César : c'est une technique de chiffrement pour (tenter de) rendre un texte incompréhensible pour toute personne n'ayant pas la clé de déchiffrement. Cette technique a été utilisée par Jules César pour éviter que des information secrètes transmises par courrier ne tombe aux mains des ennemis... Le texte obtenu n'est pas très compliqué à déchiffrer car il fonctionne simplement par décalage de lettres (comme indiqué dans cette image tirée de wikipedia):
Pour éviter le problème des caractères particuliers (é, è, ï, ç ...) on ne travaillera que sur des textes écrits en lettres capitales
On définit ci-dessous une chaîne de caractères représentant l'alphabet complet en lettres majuscules. Une chaîne de caractères est une séquence : chaque élément qui la compose a donc un index lié à sa position :
...
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# on peut obtenir le caractère ayant l'index i avec alphabet[i] comme par exemple :
i = 5
alphabet[i]
Compléter le code de la fonction rang_lettre(carac) qui permet de récupérer le rang (= l'index) auquel se trouve une des lettres de l'alphabet.
Par exemple rang_lettre('F') doit renvoyer la valeur 5 (le rang démarre à 0 avec la lettre 'A')
def rang_lettre(carac):
"""" fonction qui renvoie le rang du caractère 'carac' dans alphabet
:param carac: (str) un caractère
:return: (int) le rang du caractère dans l'alphabet ;si non trouvé : -1
Exemples :
>>> rang_lettre('A')
0
>>> rang_lettre('Z')
25
"""
for i in range(26):
if carac == ???
return ???
# test de la fonction rang_lettre(carac) :
rang_lettre('Z')
Mais on peut aussi vouloir faire la transformation inverse : on donne le rang et on récupère le caractère.
Ecrire le code de la fonction suivante qui renvoie la lettre correspondant au rang donné en argument :
def lettre_rang(rang):
"""" fonction qui renvoie la lettre de l'alphabet correspondant à son rang
:param rang: (int) le rang de la lettre
:return: (str) la lettre majuscule associée à rang
Exemple :
>>> lettre_rang(0)
'A'
>>> lettre_rang(4)
'E'
"""
# Code à écrire :
???
...
???
# Test de la fonction lettre_rang(rang) :
lettre_rang(4)
Munis de ces fonctions rang_lettre() et lettre_rang(), on va pouvoir écrire le code de la fonction decal_lettre(carac, dec).
Elle vous est donnée ci-dessous et son fonctionnement sera expliqué en classe.
Vérifier dans la cellule suivante qu'elle donne bien les résultats donnés en exemple dans la docstring.
def decal_lettre(carac, dec):
""" fonction qui produit une lettre décalée de 'dec' par rapport
à la lettre de départ 'carac'
:param carac: (str) la lettre à décaler
:param dec: (int) le décalage à réaliser
:return: (str) la lettre décalée ; si le caractère initial n'est pas une lettre
il est renvoyé tel quel
Exemple :
>>> decal_lettre('A', 3)
'D'
>>> decal_lettre('Y', 3)
'B'
>>> decal_lettre('!', 5)
'!'
"""
if carac in alphabet:
return lettre_rang((rang_lettre(carac) + dec)%26)
else:
return carac
# test de la fonction decal_lettre(carac, dec) :
On peut alors réaliser le chiffrage d'un texte complet :
def chiffrage_cesar(texte, decalage):
"""" fonction qui réalise le chiffrage de César d'un texte.
:param texte: (str) le texte (en majuscules) à coder
:param decalage: (int) le decalage à appliquer pour réaliser le chiffrement
"""
texte_chiffre = '' # on déclare une variable de type str mais initialement vide
# et que l'on va compléter lettre par lettre pour former le texte chiffré complet
# votre code à écrire ici !
# test de la fonction chiffrage_cesar(texte, decalage):
chiffrage_cesar('VOICI LE TEXTE A CHIFFRER !', 3)
La personne qui reçoit le texte chiffré doit disposer par avance de la clé de déchiffrement pour pouvoir récupérer le texte "en clair".
Ainsi, si le décalage utilisé pour chiffrer le texte vaut 3, alors à la réception il faut décaler là aussi de 3 lettres mais en sens inverse :
Ecrire la fonction dechiffre_cesar(texte_chiffre, cle) dans laquelle le paramètre cle est le décalage utilisé lors du chiffrement :
def decrypter_cesar(texte):
""" DOCSTRING A COMPLETER
"""
# code de la fonction :
# test de la fonction decrypter_cesar(texte) sur le texte mystere :
mystere = 'YRLFL OH WHAWH D FKLIIUHU !'
On a un texte incompréhensible :
incomprehensible = "KMBBM IKBQDQBM VWCA I XMZUQA LM DWQZ CV MFMUXTM LM KPQNNZMUMVB"
et on suppose qu'il est chiffré avec le code de César. Pourrait-on essayer de le décrypter ?
(décrypter = réussir par différentes techniques à obtenir l'information compréhensible, sans posséder la clé de chiffrement )
Ecrire un programme qui vous permet de décrypter le texte incomprehensible et de récupérer la clé de chiffrement utilisée.
Vérifier ensuite que le texte : "JZIDW ! DWCA IDMH BZWCDM TI KTM : PCQB" est chiffré avec la même clé.
incomprehensible = "KMBBM IKBQDQBM VWCA I XMZUQA LM DWQZ CV MFMUXTM LM KPQNNZMUMVB"
# votre code de décryptage :