%% 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 %%