%% 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/01_ROT13\|← ROT13]] | [[Code et Développement/Programmation/Cryptographie/03_Permutation alphabétique\|Permutation alphabétique →]] | > |:---|---:| %% nav-fin %% # Le chiffre de César Les notions de chiffrement, de clé et d'indice d'une lettre sont présentées dans la page [[Code et Développement/Programmation/Cryptographie/01_ROT13|ROT13]]. ## Le principe Jules César utilisait ce chiffrement pour sa correspondance privée. Chaque lettre est remplacée par la lettre située un nombre fixe de rangs plus loin dans l'alphabet. Ce nombre est la **clé** du chiffrement. ROT13 est le cas particulier où la clé vaut 13. C'est un chiffrement par **substitution** : chaque lettre est remplacée par une autre lettre. **À manipuler :** avec une clé de 3, a devient d, b devient e, et x devient a. ```sq-alphabet lettre: a décalage: 3 modulo: oui ``` ## La fonction de chiffrement La fonction reprend ROT13 et remplace 13 par le paramètre `cle`. ```python from string import ascii_lowercase, ascii_uppercase lower = ascii_lowercase upper = ascii_uppercase def cesar(x, cle): """Renvoie x chiffré avec le chiffre de César et la clé cle.""" code = "" for c in x: if c in lower: code += lower[(lower.index(c) + cle) % 26] elif c in upper: code += upper[(upper.index(c) + cle) % 26] else: code += c return code chiffre = cesar('Bonjour !', 3) print(chiffre) # Erqmrxu ! print(cesar(chiffre, -3)) # Bonjour ! ``` Pour déchiffrer, on applique la clé opposée. Un décalage de −3 ramène chaque lettre 3 rangs en arrière. L'opérateur `%` de Python renvoie toujours un reste positif : `(1 - 3) % 26` vaut 24. **À manipuler :** chiffrez un texte, puis cliquez sur « Déchiffrer ». La clé peut être négative. ```sq-cesar texte: Bonjour ! clé: 3 ``` ## L'attaque par force brute Le chiffre de César n'a que 26 clés possibles. Il suffit de les essayer toutes pour retrouver le texte clair. Cette méthode s'appelle l'attaque par **force brute**. ```python for cle in range(26): print(cle, cesar('Erqmrxu !', -cle)) ``` Parmi les 26 lignes affichées, une seule est lisible : celle de la clé 3. **À manipuler :** cliquez sur la ligne lisible. Le bouton repère la ligne dont les lettres et les mots ressemblent le plus au français. ```sq-force-brute texte: Erqmrxu ! ``` Pour résister à la force brute, un chiffrement doit avoir un très grand nombre de clés. La [[Code et Développement/Programmation/Cryptographie/03_Permutation alphabétique|permutation alphabétique]] en compte plus de 10^26. %% 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/01_ROT13\|← ROT13]] | [[Code et Développement/Programmation/Cryptographie/03_Permutation alphabétique\|Permutation alphabétique →]] | > |:---|---:| %% nav-fin %%