%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Cryptographie/Cryptographie|Accueil · Cryptographie]]
%% nav-fin %%
# Évaluation - Machine Enigma
> [!info] 🎯 Objectif
> Programmer le chiffrement et le déchiffrement d'une machine Enigma simplifiée, puis présenter le programme en soutenance.
Cette page sert à la préparation de l'évaluation de la compétence [[Code et Développement/Programmation/Cryptographie/Cryptographie|Cryptographie]]. La validation se fait lors d'une soutenance individuelle.
## Le problème
La machine chiffre un message en deux étapes.
1. Un décalage de César incrémental. La première lettre du message est décalée de N rangs dans l'alphabet, la deuxième de N + 1 rangs, la troisième de N + 2 rangs, et ainsi de suite. Après Z, on repart de A.
2. Le passage dans trois rotors, l'un après l'autre. Un rotor est une permutation de l'alphabet, écrite sur 26 lettres. La lettre d'indice k dans l'alphabet devient la lettre d'indice k du rotor. Par exemple, avec le rotor `BDFHJLCPRTXVZNYEIWGAKMUSQO`, A devient B et C devient F.
Le déchiffrement applique les mêmes étapes dans l'ordre inverse : rotor 3, rotor 2, rotor 1, chacun lu à l'envers, puis le décalage incrémental retranché.
Les notions utilisées sont celles des pages [[Code et Développement/Programmation/Cryptographie/02_Le chiffre de César|Le chiffre de César]] et [[Code et Développement/Programmation/Cryptographie/03_Permutation alphabétique|Permutation alphabétique]].
## Entrée et sortie
L'entrée compte six lignes :
- `ENCODE` ou `DECODE` ;
- le nombre N, entier de 0 à 25 ;
- les trois rotors, un par ligne, de 26 lettres majuscules chacun ;
- le message, en lettres majuscules, sans espace.
La sortie est le message chiffré ou déchiffré, sur une ligne.
## Exemple
Avec N = 4, le message `AAA` devient `EFG` après le décalage. Les trois rotors de l'exemple donnent ensuite `KQF`.
## Les cas de test
```sq-fichier
nom: cas1.txt
---
ENCODE
4
BDFHJLCPRTXVZNYEIWGAKMUSQO
AJDKSIRUXBLHWTMCQGZNPYFVOE
EKMFLGDQVZNTOWYHXUSPAIBRCJ
AAA
```
```sq-fichier
nom: cas2.txt
---
ENCODE
9
BDFHJLCPRTXVZNYEIWGAKMUSQO
AJDKSIRUXBLHWTMCQGZNPYFVOE
EKMFLGDQVZNTOWYHXUSPAIBRCJ
BONJOURATOUS
```
```sq-fichier
nom: cas3.txt
---
DECODE
9
BDFHJLCPRTXVZNYEIWGAKMUSQO
AJDKSIRUXBLHWTMCQGZNPYFVOE
EKMFLGDQVZNTOWYHXUSPAIBRCJ
IXXBNDFRIFPL
```
```sq-fichier
nom: cas4.txt
---
ENCODE
25
BDFHJLCPRTXVZNYEIWGAKMUSQO
AJDKSIRUXBLHWTMCQGZNPYFVOE
EKMFLGDQVZNTOWYHXUSPAIBRCJ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
```
```sq-fichier
nom: cas5.txt
---
DECODE
0
BDFHJLCPRTXVZNYEIWGAKMUSQO
AJDKSIRUXBLHWTMCQGZNPYFVOE
EKMFLGDQVZNTOWYHXUSPAIBRCJ
A
```
## Votre programme
Écrivez la fonction `resoudre(texte)`. Elle reçoit le contenu complet d'un cas de test et renvoie la sortie attendue sous forme de chaîne. Les tests indiquent les cas réussis.
```sq-python
def resoudre(texte):
lignes = texte.strip("\n").split("\n")
# À compléter : renvoyer la sortie attendue sous forme de chaîne
return ""
print(resoudre(open("cas1.txt").read()))
#--- tests
assert resoudre(open("cas1.txt").read()) == "KQF", "cas 1 : chiffrement de AAA"
assert resoudre(open("cas2.txt").read()) == "IXXBNDFRIFPL", "cas 2 : chiffrement d'une phrase"
assert resoudre(open("cas3.txt").read()) == "BONJOURATOUS", "cas 3 : déchiffrement"
assert resoudre(open("cas4.txt").read()) == "XOZNVAKQFMDWICLPYSRGUETBHJXOZN", "cas 4 : décalage de 25 sur un long message"
assert resoudre(open("cas5.txt").read()) == "D", "cas 5 : déchiffrement d'une seule lettre avec N = 0"
```
## Pour la soutenance
- Expliquer le rôle de l'opérateur `%` dans le décalage.
- Montrer comment le déchiffrement inverse un rotor.
- Présenter un cas de test ajouté par vous.
Puzzle d'origine sur CodinGame : [Encryption/Decryption of Enigma Machine](https://www.codingame.com/training/easy/encryptiondecryption-of-enigma-machine).
%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Cryptographie/Cryptographie|Accueil · Cryptographie]]
%% nav-fin %%