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