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