<jupyter_start><jupyter_text>Coder et décoder comme les Romains  Objectifs* chaînes de caractères* boucles* tests conditionnels* fonctions  Le code de César**<NAME>** é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. ![<NAME>](https://upload.wikimedia.org/wikipedia/commons/thumb/9/9d/Portrait_of_Julius_Caesar_%281st_cent._B.C.%29_at_the_Archaeological_Museum_of_Sparta_on_15_May_2019.jpg/349px-Portrait_of_Julius_Caesar_%281st_cent._B.C.%29_at_the_Archaeological_Museum_of_Sparta_on_15_May_2019.jpg)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**.<jupyter_code>from IPython.display import YouTubeVideo

YouTubeVideo('vT8q1mXeZ2A', width=960, height=540)<jupyter_output><empty_output><jupyter_text>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](img/clef.png "Clef de chiffrement du code de Cesar")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 lettreC'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 clair1. 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 !<jupyter_code>alphabet_clair = 'abcdefghijklmnopqrstuvwxyz'<jupyter_output><empty_output><jupyter_text>Trouvez l'index (la position) de la lettre `h` dans la variable `alphabet_clair` à l'aide de la fonction `alphabet_clair.index('h')`<jupyter_code>alphabet_clair.index('h')<jupyter_output><empty_output><jupyter_text>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 !<jupyter_code>alphabet_code = 'bcdefghijklmnopqrstuvwxyza'<jupyter_output><empty_output><jupyter_text>Trouvez la lettre codée pour 'h' qui a l'index 7<jupyter_code>alphabet_code[7]<jupyter_output><empty_output><jupyter_text>Décoder une lettreC'est le processus inverse.Pour décoder une lettre, il faut:1. trouver l'index de la lettre dans l'alphabet codé1. trouver à quelle lettre correspond cet index dans l'alphabet clairTrouvez l'index de la lettre codée 'i'<jupyter_code>alphabet_code.index('i')<jupyter_output><empty_output><jupyter_text>Trouvez à quelle lettre dans l'alphabet clair correspond l'index 7<jupyter_code>alphabet_clair[7]<jupyter_output><empty_output><jupyter_text>Coder une phraseUne 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'`<jupyter_code>message_clair = 'gymnase bugnon'<jupyter_output><empty_output><jupyter_text>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)<jupyter_code>message_code = ''<jupyter_output><empty_output><jupyter_text>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:```pythonif 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.<jupyter_code>if message_clair[8] == ' ':
    print('espace')
else:
    print('pas espace')<jupyter_output>pas espace<jupyter_text>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 ```pythonfor c in message_clair:    if c == ' '          ajouter un espace à message_code    else:         coder la lettre c et l'ajouter au message_code```<jupyter_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)<jupyter_output>gymnase bugnon
hznobtf cvhopo<jupyter_text>Programme pour chiffrer (coder) un texte clairSi l'on met toutes les instructions à la suite, on obtient le programme suivant qui perme de coder un texte en clair :<jupyter_code>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)<jupyter_output>gymnase bugnon
hznobtf cvhopo<jupyter_text>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 lettreSi 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 :```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é<jupyter_code>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)<jupyter_output>hznobtf ef dibncmboeft
{'fraction_non_alphanumeric': 0.10345289079229122, 'fraction_numerical': 0.012981798715203427, 'mean_word_length': 4.797517455391777, 'pattern_counts': {'":': 0, '<': 51, '<?xml version=': 0, '>': 51, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 20, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '13', 'dir': 'jupyter-structured-clean-dedup', 'id': '193233', 'license': 'MIT', 'n_tokens_mistral': 2787, 'n_tokens_neox': 2631, 'n_words': 835, 'path': 'doc/python/vi/4/hacking-romain-v2-corrige.ipynb', 'repo_name': 'LeilaBHC/edunum', 'size': '7482'}