TP2-PROG-08: Coder et décoder comme les Romains
Contents
TP2-PROG-08: Coder et décoder comme les Romains#
Objectifs#
chaînes de caractères
boucles
tests conditionnels
fonctions
Le code de César#
Jules César était un général Romain (il n’a jamais été empereur) qui a vécu au 1er siècle avant Jésus-Christ. Comme chef militaire, il souhaitait pouvoir communiquer avec ses officiers de plus hauts rangs localisés aux quatre coins de son immense empire. Notamment avec Ciceron durant la Guerre des Gaules.
Pour qu’un éventuel ennemi ne s’empare jamais du message de César, il a décidé d’utiliser une technique de cryptage afin de rendre le message illisible si on ne connaît pas la clef de chiffrement. C’est l’une des toutes premières applications de la cryptographie.
from IPython.display import YouTubeVideo
YouTubeVideo('vT8q1mXeZ2A', width=960, height=540)
Encoder une lettre#
C’est la première étape.
Nous allons travailler avec deux chaînes de caractères. alphabet_clair
contient toutes les lettres de l’alphabet en minuscule et alphabet_code
qui contient toutes les lettres codée
index |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
a |
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
|
b |
c |
d |
e |
f |
g |
h |
i |
j |
k |
l |
m |
n |
o |
p |
q |
r |
s |
t |
u |
v |
w |
x |
y |
z |
a |
Pour encoder une lettre, il faut donc:
trouver l’index (la position) de la lettre dans l’alphabet clair
trouver à quelle lettre correspond cet index dans l’alphabet codé
Déclarez une variable alphabet_clair
de type chaîne de caractères qui contient toutes les lettres de l’alphabet en minuscules. Cette chaîne a une longueur de 26 !
alphabet_clair = 'abcdefghijklmnopqrstuvwxyz'
Trouvez l’index (la position) de la lettre h
dans la variable alphabet_clair
à l’aide de la fonction alphabet_clair.index('h')
print(alphabet_clair.index('h'))
7
Définissez une nouvelle chaîne de caractères alphabet_code
qui contient toutes les lettres de l’alphabet minuscules et décalées de 1 : a devient b, b devient c, etc.. jusqu’à z qui devient a. Cette chaîne a une longueur de 26 !
alphabet_code = 'bcdefghijklmnopqrstuvwxyza'
Trouvez la lettre codée pour ‘h’ qui a l’index 7
print(alphabet_code[7])
i
Décoder une lettre#
C’est le processus inverse.
Pour décoder une lettre, il faut:
trouver l’index de la lettre dans l’alphabet codé
trouver à quelle lettre correspond cet index dans l’alphabet clair
Trouvez l’index de la lettre codée ‘i’
print(alphabet_code.index('i'))
7
Trouvez à quelle lettre dans l’alphabet clair correspond l’index 7
print(alphabet_clair[7])
h
Coder une phrase#
Une phrase c’est plusieurs lettres. Nous allons donc coder chaque lettre de la phrase. Attention : un espace (le caractère ' '
) en clair reste un espace en codé.
Déclarez un message en clair message_clair = 'bonjour'
message_clair = 'gymnase de beaulieu'
Déclarez un message codé vide message_code = ''
. Cette chaîne de caractère contiendra le message codé (on ajoute au fur et à mesure les lettres codées)
message_code = ''
Pour chaque lettre du message clair, il faut vérifier si le caractère est un espace ou non. On utilise pour cela un test conditionnel:
if c == ' ':
message_code = message_code + ' '
else:
# on encode la lettre
Ecrivez un test conditionnel (4 lignes !) qui affiche espace
si le caractère d’index 8 de la chaîne message_clair
est un espace, pas d'espace
sinon.
if message_clair[8] == ' ':
print('espace')
else:
print('pas espace')
pas espace
Une boucle for permet de répéter les instructions pour encoder les lettres en ayant vérifié qu’il s’agit d’un espace ou non. La variable c
va
for c in message_clair:
if c == ' '
# ajouter un espace à message_code
else:
# coder la lettre c et l'ajouter au message_code
Par exemple :
gymnase de beaulieu
hznobtf ef cfbvmjfv
Exercice 1 : Programme pour chiffrer un texte clair#
Déclarez l’alphabet en clair. Variable de type string :
alphabet_clair
Déclarez l’alphabet codé. Variable de type string :
alphabet_code
Déclarez un message clair (variable de type string)
Déclarez le massage codé (variable de type string vide)
Utilisez une boucle sur l’ensemble des lettres du message clair pour le coder
Exercice 2 : Programme pour déchiffrer un texte codé#
On rappelle que pour décoder une lettre, on applique le processus inverse que pour celui de coder.
Décoder une lettre#
Si la lettre à décoder est un espace, alors il reste un espace. Sinon il faut rechercher l’index de la lettre codée dans l’alphabet codé puis rechercher la lettre correspondant à cet index dans l’alphabet en clair.
En python :
if c == ' ':
message_clair = message_clair+c
else:
Modifiez le programme suivant pour qu’il décode le message codé donné
alphabet_clair = 'abcdefghijklmnopqrstuvwxyz'
alphabet_code = 'bcdefghijklmnopqrstuvwxyza'
message_clair = ''
message_code = 'm jogpsnbujrvf d ftu nbhjrvf'
for c in message_clair:
if c == ' ':
message_code = message_code+c
else:
message_code = message_code + c
print(message_clair)
print(message_code)
m jogpsnbujrvf d ftu nbhjrvf
Exercice 3 : Construction de deux fonctions : chiffrer et dechiffrer#
Implémentez deux fonctions qui permettent de coder et de décoder n’importe quelle chaîne de caractères. La fonction chiffrer(texte)
prend comme argument la phrase à coder et renvoie la chaîne codée.
def chiffrer(texte):
texte_code = ''
# code
return texte_code
La fonction dechiffrer(texte_cde)
prend comme argument la phrase codée et renvoie la chaîne décodée.
def dechiffrer(texte_code):
texte = ''
# code
return texte
Exercice 4 : Augmentez l’alphabet#
Votre système de codage fonctionne avec les lettres minuscules. Modifiez vos fonctions pour qu’il fonctionne avec des lettres majuscules aussi. Voir avec des chiffres !
Exercice 5 : N’importe quelle clef !#
Votre programme fonctionne avec la clef de César (clef = 3
). Modifiez vos fonctions pour qu’elles généralisent à n’importe quelle clef comprise entre 0
(pas de chiffrement) et len(alphabet)
Conseil : copier-coller vos fonctions chiffrer(code)
et dechiffrer(texte_code)
dans un nouveau fichier source et modifiez ce nouveau fichier source.
Astuce : L’utilisation de l’opérateur modulo (le symbole est %
) permet de “voir” la chaîne de caractères comme un ruban.
Exercice 6 : Hacking (pour aller plus loin)#
Vous savez coder et décoder un texte avec n’importe quelle clef. Il est temps de vous glisser dans la peau d’un hacker et de retrouver la clef utilisée pour chiffrer un texte que voici :
message_code1 = "yvtl huapxbl bul jpcpspzhapvu xbp h thyxbl s opzavpyl wlukhua wsbz k bu tpssluhpyl klz obtislz vypnpulz zby slz ypclz kb apiyl yvtl lza klclubl bul wbpzzhual ylwbispxbl wbpz bu chzal ltwpyl zvu vynhupzhapvu wvspapxbl ihzll zby sl zluha la slz jvuzbsz h puzwpyl kl uvtiylbzlz jpcpspzhapvuz slz yvthpuz lahplua kl nyhukz jvuzaybjalbyz shpzzhua klyyplyl lbe klz tvubtluaz ltislthapxblz jvttl sl jvspzl la sl whuaolvu slby jbsabyl tlshunl kl ayhkpapvuz la k pumsblujlz nyljxblz h lal ayhuztpzl h ayhclyz sh shunbl shapul la sl kyvpa yvthpu sh jobal kl s ltwpyl yvthpu k vjjpklua thyxbl sh mpu k bul lyl thpz zvu olypahnl wlykbyl lujvyl hbqvbyk obp clbe ab xbl q hqvbal wsbz kl klahpsz zby bu hzwlja whyapjbsply kl sh yvtl huapxbl jvttl why leltwsl sh cpl xbvapkpluul klz yvthpuz slz jvuxblalz tpspahpylz kl yvtl slz kplbe la sh ylspnpvu yvthpul s hya la s hyjopaljabyl yvthpul"
Ce texte, affecté à la variable message_code1
est long : il comporte 872 caractères. Il est écrit en français en utilisant les 26 lettres minuscules de l’alphabet.
Votre travail : découvrir la clef avec laquelle il a été chiffré. L’algorithme est le suivant :
Analyser la fréquence de chacune des lettres codées
déclarer une liste de longueur 26 avec que des
0
ajouter
1
à l’index de chacune des lettre analysée dans le texte codé
Trouver la valeur la plus grande. Elle correspond au
e
du texte clairDéduire la valeur de la clef
Utiliser cette clef pour déchiffrer le message codé.
Comment fonctionne le code de Cesar ?#
Le texte chiffré (codé) s’obtient en remplaçant chaque lettre du texte clair original par un décalage à distance fixe, toujours du même côté, dans les lettres de l’alphabet. Cette distance est appelée clef de chiffrement
Par exemple, si la clef de chiffrement vaut 1, alors on décalera chaque lettre du texte clair de un sur la droite :
le “a” devient “b”
le “b” devient “c”
et ainsi de suite. On peut ensuite chiffrer et déchiffrer des messages plus longs :
le texte clair “inf”, chiffré avec la clef 1 devient le texte chiffré “jog”