From 0e0c4ba1c19bbe6fd5d7e2d60676892a3dbee48d Mon Sep 17 00:00:00 2001 From: Dimitri Merejkowsky Date: Sun, 24 Nov 2019 11:24:29 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20des=20consignes=20pour=20l'atelier=20de?= =?UTF-8?q?=20l'=C3=A9pisode=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- saison-2/sessions/python-S02-E06.md | 122 +++++++++++++++++++++++++--- 1 file changed, 110 insertions(+), 12 deletions(-) diff --git a/saison-2/sessions/python-S02-E06.md b/saison-2/sessions/python-S02-E06.md index c2fce49..99742df 100644 --- a/saison-2/sessions/python-S02-E06.md +++ b/saison-2/sessions/python-S02-E06.md @@ -102,23 +102,19 @@ https://docs.python.org/fr/3/library/index.html Mettez ce lien dans vos favoris - il vous sera très utile. -# sys +# Le module sys -Contient notamment `sys.argv`, une liste de chaînes de caractères, qui -n'est *jamais vide*. +Le module `sys` est disponible par défaut, et contient plusieurs variables +utiles. -Dans l'interpréteur intéractif, le premier élément est le -chemin du binaire python: - -```bash -$ python3 ->>> import sys ->>> sys.argv -["/usr/bin/python3"] -``` +On va parler ici de l'une d'entre elles: `argv`. # sys.argv avec un fichier +`sys.argv` est une liste de chaînes de caractères, qui +n'est *jamais vide*, et est utile quand on lance python +avec un fichier source: + ```python # Dans lancez_moi.py import sys @@ -390,3 +386,105 @@ Réponse 1. `argv` a une taille 1, et on accède à l'index 1. # \center \huge Atelier + +# Introduction + +Vous allez jouer le rôle successivement d'un espion Bordure, puis d'un +espion Syldave (les noms viennent de l'univers de Tintin), et l'atelier +comporte trois parties. + +# Chiffrement v1 + +Vous devez implémenter le script suivant, nommé `chiffrer.py`. + +Il se lance ainsi: + +```bash +$ python chiffrer.py n MESSAGE +``` + +où `n` est en entier entre 0 et 25, et `MESSAGE` une chaîne de caractères +non accentués. + +L'algorithme est le suivant: + +* Supprimer les espaces et les signes de ponctuation du message +* Remplacer chaque lettre par une majuscule +* Décaler chaque lettre du message en utilisant le pas `n`. + +Par exemple, si le message est `BONJOUR` et le pas 2, le message +chiffré devient `DQPLQWT`. + +Notez que si on décale la lettre `Y` avec un pas de 3, on doit obtenir +`B` (il faut effectuer une rotation) + + +# Chiffrement v2 + +Pour le chiffrement version 2, il faut maintenant utiliser une *clé* `k` +à la place de l'entier `n`. + +Le script devient: + +```bash +$ python chiffrer2.py k MESSAGE +``` + +Pour chiffrer le message, on continue à décaler chaque lettre d'un pas, +mais la valeur du pas n'est plus constante. À la place, elle est +donnée par les lettres de la clé. + +Par exemple, avec la clé 'ACB', le pas prend les valeurs `0, 2, 1, 0, 2, 1` etc. + +En chiffrant `tintin` avec la clé `ACB`, on doit obtenir `TKOTKO`. + +# Casser le chiffrement + +Maintenant vous jouez le rôle d'un espion Syldave. Voici ce que vous avez +à votre disposition: + +* Le script `chiffrer2.py` +* Le message secret suivant: `IHDXUVZKRISCBNJWBXIDUWVVODUBPRFQRIRGBUR` + +Vous savez également que: + +* La clé utilisée contient 3 lettres +* Le message parle du maréchal Plekszy-Gladz + +Vous devez déchiffrer le message, et obtenir la valeur de la clé. + +# Indications - 1 + +Quelques indices: + +* La fonction `ord` permet de convertir une lettre en son code ASCII: + + `ord('A') = 65, ord('B') = 66, ... ,ord('Z') = 90` + +* La fonction `chr` permet de convertir un entier en lettre: + + `chr(65) = 'A', chr(66) = 'B', ..., chr(90) = 'Z'` + +# Indications - 2 + +* L'opérateur `%` permet de s'assurer qu'une valeur est comprise dans un intervalle donné. + +`0 % 26 = 0, 1 % 26 = 1, ..., 26 % 26 = 0` + +`27 % 26 = 1, 28 % 26 = 2, ...` + +* Toutes les chaînes de caractères en Python contiennent les méthodes `is_alpha()` et `upper()`: + +`"a".is_alpha() = True, "!".is_alpha() = False` + +`"Message Important".upper() = "MESSAGE IMPORTANT"` + +# Conseils pour l'implémentation + +* Dans `chiffrer.py`, assurez-vous d'avoir une fonction `décale_lettre` prenant une lettre et un pas. Cela facilitera l'implémentation de `chiffrer2.py`. + +* Pour la dernière partie: + * Pour casser le message, vous pouvez partir de `chiffrer2.py`. Il y a très peu de code à changer ... + * Il y a $26^3$ clés possibles. Un ordinateur n'aura aucun mal à les essayer toutes une par une (ça ne fait "que" 17 000 possibilités environ) + * Quand vous aurez déchiffré le message, vérifiez que votre clé est correcte, en essayant de le re-chiffrer avec l'algorithme v2 - vous devez retomber sur le message chiffré initial. +