| @@ -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. | 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 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 | ```python | ||||
| # Dans lancez_moi.py | # Dans lancez_moi.py | ||||
| import sys | import sys | ||||
| @@ -390,3 +386,105 @@ Réponse 1. `argv` a une taille 1, et on accède à l'index 1. | |||||
| # | # | ||||
| \center \huge Atelier | \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. | |||||