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