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)
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 »
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')
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
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”
alphabet_code.index('i')
7
Trouvez à quelle lettre dans l’alphabet clair correspond l’index 7
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 bugnon'
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
for c in message_clair:
if c == ' ':
message_code = message_code+c
else:
index = alphabet_clair.index(c)
message_code = message_code + alphabet_code[index]
print(message_clair)
print(message_code)
gymnase bugnon
hznobtf cvhopo
Programme pour chiffrer (coder) un texte clair¶
Si l’on met toutes les instructions à la suite, on obtient le programme suivant qui perme de coder un texte en clair :
alphabet_clair = 'abcdefghijklmnopqrstuvwxyz'
alphabet_code = 'bcdefghijklmnopqrstuvwxyza'
message_clair = 'gymnase bugnon'
message_code = ''
for c in message_clair:
if c == ' ':
message_code = message_code+c
else:
index = alphabet_clair.index(c)
message_code = message_code + alphabet_code[index]
print(message_clair)
print(message_code)
gymnase bugnon
hznobtf cvhopo
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:
index = alphabet_code.index(c)
message_clair = message_clair + alphabet_clair[index]
Modifiez le programme suivant pour qu’il décode le message codé donné
alphabet_clair = 'abcdefghijklmnopqrstuvwxyz'
alphabet_code = 'bcdefghijklmnopqrstuvwxyza'
message_clair = ''
message_code = 'hznobtf ef dibncmboeft'
for c in message_clair:
if c == ' ':
message_code = message_code+c
else:
index = alphabet_clair.index(c)
message_code = message_code + alphabet_code[index]
print(message_clair)
print(message_code)
hznobtf ef dibncmboeft