GuerreDesGaules

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.

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')

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:

  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’

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
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 de beaulieu
hznobtf ef cfbvmjfv

Exercice 1 : Programme pour chiffrer un texte clair#

  1. Déclarez l’alphabet en clair. Variable de type string : alphabet_clair

  2. Déclarez l’alphabet codé. Variable de type string : alphabet_code

  3. Déclarez un message clair (variable de type string)

  4. Déclarez le massage codé (variable de type string vide)

  5. 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:
        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 = 'm jogpsnbujrvf d ftu nbhjrvf'
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)
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.