%% 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]] | [[Code et Développement/Programmation/Cryptographie/04_Le chiffre de Vigenère\|Le chiffre de Vigenère →]] | > |:---|---:| %% nav-fin %% # Permutation alphabétique 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 La permutation alphabétique est une substitution **mono-alphabétique**. On associe à chaque lettre de l'alphabet une autre lettre, choisie au hasard. Deux lettres différentes reçoivent toujours deux images différentes. La clé est la **table de correspondance** complète. Avec la table du cours, a devient w, b devient e, o devient o. Le texte « Bonjour » devient « Eocyosd ». ## Construire la table La fonction `sample` du module `random` renvoie les lettres de l'alphabet dans un ordre aléatoire. Un dictionnaire associe ensuite chaque lettre à son image. ```python from string import ascii_lowercase, ascii_uppercase import random lower = ascii_lowercase upper = ascii_uppercase val = ''.join(random.sample(lower, len(lower))) # par exemple 'weiupvxmjynzacobkdgrsftqlh' table = {} for i in range(26): table[lower[i]] = val[i] table[upper[i]] = val[i].upper() ``` Les majuscules reçoivent la même image que les minuscules, en majuscule. ## Chiffrer et déchiffrer Pour chiffrer, on remplace chaque lettre par son image dans la table. ```python def chiffrer(x, table): """Renvoie x chiffré par la table de correspondance.""" code = "" for c in x: if c in table: code += table[c] else: code += c return code ``` Pour déchiffrer, il faut retrouver la lettre dont l'image est le caractère lu. La version suivante parcourt toute la table pour chaque caractère. ```python def dechiffrer(x, table): """Renvoie x déchiffré par la table de correspondance.""" texte = "" for c in x: if c in table: for lettre in table: if table[lettre] == c: texte += lettre else: texte += c return texte ``` Une table inversée évite ce parcours : `inverse = {v: k for k, v in table.items()}`. Le déchiffrement devient alors un simple accès `inverse[c]`. Les noms des fonctions et des variables doivent rester distincts. L'instruction `chiffrer = chiffrer('Bonjour !', table)` remplacerait la fonction par une chaîne, et un second appel échouerait. ```python code = chiffrer('Bonjour !', table) print(code) # Eocyosd ! avec la table du cours print(dechiffrer(code, table)) # Bonjour ! ``` **À manipuler :** mélangez l'alphabet, puis saisissez un texte. ```sq-permutation texte: Bonjour ! ``` ## Le nombre de clés Pour la lettre a, il y a 26 images possibles. Pour la lettre b, il en reste 25. Pour la lettre c, il en reste 24, et ainsi de suite. Le nombre de tables est donc 26 × 25 × … × 1 = 26!, soit environ 4 × 10^26. L'attaque par force brute du [[Code et Développement/Programmation/Cryptographie/02_Le chiffre de César|chiffre de César]] est impossible en pratique. ## L'analyse de fréquences La permutation conserve la fréquence de chaque lettre. En français, la lettre e est de loin la plus fréquente. Dans un texte chiffré assez long, la lettre la plus fréquente est donc presque toujours l'image de e. Les lettres suivantes et les groupes fréquents, comme « es » ou « ent », donnent les autres correspondances. Les mots courts reconnus complètent la table. **À manipuler :** proposez une lettre claire sous chaque lettre chiffrée. Le bouton propose les correspondances dans l'ordre des fréquences du français ; corrigez ensuite à partir des mots reconnus. ```sq-permutation mode: deviner ``` Le [[Code et Développement/Programmation/Cryptographie/04_Le chiffre de Vigenère|chiffre de Vigenère]] résiste à cette attaque. %% 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]] | [[Code et Développement/Programmation/Cryptographie/04_Le chiffre de Vigenère\|Le chiffre de Vigenère →]] | > |:---|---:| %% nav-fin %%