%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %% > [!nav] > ↩ [[Code et Développement/Programmation/Cryptographie/Cryptographie|Accueil · Cryptographie]] > > | | [[Code et Développement/Programmation/Cryptographie/02_Le chiffre de César\|Le Chiffre de César →]] | > |:---|---:| %% nav-fin %% # ROT13 ## La cryptographie La cryptographie regroupe les techniques qui protègent un message. Le chiffrement rend un texte illisible pour toute personne qui ne possède pas la **clé** de déchiffrement. Le texte d'origine s'appelle le texte **clair**. Le texte obtenu s'appelle le texte **chiffré**. Les pages de cette compétence présentent d'abord des algorithmes de **chiffrement faible**, faciles à casser : ROT13, le chiffre de César, la permutation alphabétique et le chiffre de Vigenère. Elles présentent ensuite un chiffrement asymétrique, RSA, puis les fonctions de hachage. ## Le principe de ROT13 ROT13 signifie *rotate by 13 places*. L'algorithme remplace chaque lettre par la lettre située 13 rangs plus loin dans l'alphabet. Après la lettre z, le décompte reprend à la lettre a. L'alphabet compte 26 lettres. Appliquer ROT13 deux fois revient donc à décaler de 26 rangs, soit à retrouver la lettre d'origine. La même fonction sert à chiffrer et à déchiffrer. ## L'indice d'une lettre Le module `string` fournit les deux alphabets sous forme de chaînes. ```python from string import ascii_lowercase, ascii_uppercase lower = ascii_lowercase # 'abcdefghijklmnopqrstuvwxyz' upper = ascii_uppercase # 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' print(lower.index('a')) # 0 print(lower.index('k')) # 10 print(upper.index('R')) # 17 ``` La méthode `index` renvoie la position d'une lettre dans l'alphabet. Les positions vont de 0 pour a à 25 pour z. ## Décaler une lettre de 13 rangs On ajoute 13 à l'indice, puis on lit la lettre à ce nouvel indice. ```python lettre = 'j' indice = lower.index(lettre) print(lower[indice + 13]) # w ``` Avec la lettre x, l'indice 23 + 13 = 36 dépasse 25. Python lève l'erreur `IndexError: string index out of range`. Le reste de la division par 26, l'opérateur `%`, ramène l'indice entre 0 et 25. ```python lettre = 'x' indice = lower.index(lettre) print(lower[(indice + 13) % 26]) # k ``` **À manipuler :** choisissez une lettre et un décalage, avec ou sans modulo. Un clic sur une case choisit la lettre. ```sq-alphabet lettre: x décalage: 13 modulo: non ``` ## Traiter tous les caractères Un texte contient des minuscules, des majuscules, des chiffres et de la ponctuation. Les minuscules sont décalées dans `lower`. Les majuscules sont décalées dans `upper`. Les autres caractères sont recopiés sans changement. ```python lettre = 'D' if lettre in lower: indice = lower.index(lettre) print(lower[(indice + 13) % 26]) elif lettre in upper: indice = upper.index(lettre) print(upper[(indice + 13) % 26]) else: print(lettre) ``` **À manipuler :** le programme applique ce test à quatre caractères. ```sq-affiche from string import ascii_lowercase, ascii_uppercase lower = ascii_lowercase upper = ascii_uppercase for lettre in ['x', 'D', '7', '!']: if lettre in lower: indice = lower.index(lettre) print(lower[(indice + 13) % 26]) elif lettre in upper: indice = upper.index(lettre) print(upper[(indice + 13) % 26]) else: print(lettre) --- réponse: k\nQ\n7\n! explication: x a l'indice 23 et (23 + 13) % 26 = 10, soit k. D a l'indice 3 dans upper et 3 + 13 = 16, soit Q. Le chiffre 7 et le point d'exclamation ne sont pas des lettres : ils sont recopiés. ``` ## La fonction ROT13 La fonction parcourt le texte caractère par caractère et construit le texte chiffré. ```python def rot13(x): """Renvoie x chiffré avec ROT13.""" code = "" for c in x: if c in lower: code += lower[(lower.index(c) + 13) % 26] elif c in upper: code += upper[(upper.index(c) + 13) % 26] else: code += c return code chiffre = rot13('Bonjour !') print(chiffre) # Obawbhe ! print(rot13(chiffre)) # Bonjour ! ``` **À manipuler :** chiffrez un texte avec un décalage de 13, puis cliquez sur « Déchiffrer ». Le résultat est le même que si l'on chiffrait une seconde fois avec ROT13. ```sq-cesar texte: Bonjour ! clé: 13 ``` ROT13 n'a qu'une seule clé possible. Toute personne qui connaît l'algorithme peut lire le message. Le [[Code et Développement/Programmation/Cryptographie/02_Le chiffre de César|chiffre de César]] généralise ce principe à un décalage quelconque. %% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %% > [!nav] > ↩ [[Code et Développement/Programmation/Cryptographie/Cryptographie|Accueil · Cryptographie]] > > | | [[Code et Développement/Programmation/Cryptographie/02_Le chiffre de César\|Le Chiffre de César →]] | > |:---|---:| %% nav-fin %%