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