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.

Jules Cesar

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

alt text

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

alphabet_clair

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

alphabet_code

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:

  1. trouver l’index (la position) de la lettre dans l’alphabet clair

  2. 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:

  1. trouver l’index de la lettre dans l’alphabet codé

  2. 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