ROT13 est l’un des exemples les plus simples pour comprendre un chiffrement par substitution. Chaque lettre est remplacée par la lettre située 13 positions plus loin dans l’alphabet. Comme l’alphabet latin contient 26 lettres, appliquer ROT13 deux fois permet de revenir au texte de départ.
En Python, la façon la plus courte d’utiliser ROT13 est de passer par le module codecs.
import codecs
message = "Bonjour Python"
encode = codecs.decode(message, "rot_13")
decode = codecs.decode(encode, "rot_13")
print(encode)
print(decode)
Résultat :
Obawbhe Clguba
Bonjour Python
ROT13 est pratique pour apprendre les chaînes de caractères, les transformations de texte et les substitutions. En revanche, ce n’est pas une méthode de sécurité. N’importe qui peut la décoder immédiatement.
La réponse courte
Pour encoder ou décoder une chaîne en ROT13 avec Python :
import codecs
texte = "Hello World"
resultat = codecs.decode(texte, "rot_13")
print(resultat)
Résultat :
Uryyb Jbeyq
Pour revenir au texte d’origine, appliquez la même opération une deuxième fois :
original = codecs.decode(resultat, "rot_13")
print(original)
Résultat :
Hello World
La même fonction sert donc à encoder et à décoder.
Comment fonctionne ROT13 ?
ROT13 signifie “rotate by 13 places”. On décale chaque lettre de 13 positions dans l’alphabet.
A -> N
B -> O
C -> P
...
N -> A
O -> B
P -> C
Avec les minuscules, c’est la même logique :
a -> n
b -> o
c -> p
...
n -> a
o -> b
p -> c
Les caractères qui ne sont pas des lettres peuvent rester inchangés : espaces, virgules, points, chiffres ou ponctuation.
Exemple :
import codecs
texte = "Python 3.14, c'est pratique !"
print(codecs.decode(texte, "rot_13"))
Résultat :
Clguba 3.14, p'rfg cengvdhr !
Les chiffres et la ponctuation restent visibles. Seules les lettres sont transformées.
Pourquoi ROT13 se décode avec la même opération
ROT13 est réversible parce que le décalage vaut exactement la moitié de l’alphabet.
L’alphabet contient 26 lettres. Si vous décalez une lettre de 13 positions, puis encore de 13 positions, vous avez fait un tour complet :
13 + 13 = 26
Exemple avec A :
A -> N -> A
Exemple avec P :
P -> C -> P
C’est pour cette raison que la même ligne Python peut servir aux deux sens :
codecs.decode(texte, "rot_13")
On ne choisit pas une fonction encode_rot13 puis une fonction decode_rot13. ROT13 est son propre inverse.
Méthode 1 : utiliser codecs.decode
La méthode la plus simple en Python est :
import codecs
def rot13(texte):
return codecs.decode(texte, "rot_13")
message = "Le pingouin aime Python."
secret = rot13(message)
clair = rot13(secret)
print(secret)
print(clair)
Résultat :
Yr cvatbhva nvzr Clguba.
Le pingouin aime Python.
Cette approche est courte, lisible et s’appuie sur la bibliothèque standard. Elle convient très bien si votre objectif est d’utiliser ROT13 sans réécrire l’algorithme.
Point important : rot_13 est un codec texte vers texte. On l’utilise ici avec codecs.decode, ce qui est accepté par Python pour ce type de transformation.
Méthode 2 : utiliser str.maketrans et translate
Si vous voulez comprendre l’algorithme, une version pédagogique consiste à construire une table de correspondance.
def rot13_translate(texte):
alphabet = "abcdefghijklmnopqrstuvwxyz"
alphabet_maj = alphabet.upper()
decalage = alphabet[13:] + alphabet[:13]
decalage_maj = alphabet_maj[13:] + alphabet_maj[:13]
table = str.maketrans(
alphabet + alphabet_maj,
decalage + decalage_maj,
)
return texte.translate(table)
Utilisation :
message = "Bonjour Python"
secret = rot13_translate(message)
clair = rot13_translate(secret)
print(secret)
print(clair)
Résultat :
Obawbhe Clguba
Bonjour Python
Cette version montre clairement le principe :
- on définit l’alphabet ;
- on crée l’alphabet décalé de 13 positions ;
- on construit une table de traduction ;
- on applique cette table à la chaîne.
Comprendre la table de traduction
str.maketrans crée une table utilisable par translate.
Exemple minimal :
table = str.maketrans("abc", "xyz")
print("cab".translate(table))
Résultat :
zxy
Pour ROT13, la table est simplement plus longue :
alphabet = "abcdefghijklmnopqrstuvwxyz"
decalage = alphabet[13:] + alphabet[:13]
print(alphabet)
print(decalage)
Résultat :
abcdefghijklmnopqrstuvwxyz
nopqrstuvwxyzabcdefghijklm
Chaque lettre de la première chaîne correspond à la lettre située à la même position dans la deuxième.
Méthode 3 : écrire ROT13 à la main
Pour bien comprendre le calcul, on peut aussi écrire une version manuelle avec ord() et chr().
def rot13_manuel(texte):
resultat = []
for caractere in texte:
if "a" <= caractere <= "z":
base = ord("a")
nouveau = (ord(caractere) - base + 13) % 26 + base
resultat.append(chr(nouveau))
elif "A" <= caractere <= "Z":
base = ord("A")
nouveau = (ord(caractere) - base + 13) % 26 + base
resultat.append(chr(nouveau))
else:
resultat.append(caractere)
return "".join(resultat)
Test :
texte = "ROT13 en Python !"
print(rot13_manuel(texte))
print(rot13_manuel(rot13_manuel(texte)))
Résultat :
EBG13 ra Clguba !
ROT13 en Python !
Cette version est plus longue, mais elle est intéressante pour apprendre :
ord(), qui donne le code Unicode d’un caractère ;chr(), qui reconstruit un caractère depuis un code ;% 26, qui permet de revenir au début de l’alphabet.
Le rôle du modulo dans ROT13
La formule centrale est celle-ci :
nouveau = (position + 13) % 26
Si une lettre dépasse la fin de l’alphabet, le modulo la ramène au début.
Exemple avec z :
position_z = 25
nouvelle_position = (position_z + 13) % 26
print(nouvelle_position)
Résultat :
12
La position 12 correspond à m si l’on commence à compter à partir de 0.
Cette idée est exactement celle du modulo en Python : revenir dans un intervalle fixe. Pour approfondir ce point, voir le guide Modulo en Python : comprendre %, // et divmod avec exemples.
ROT13 respecte-t-il les accents ?
Les exemples ci-dessus traitent les lettres ASCII de A à Z et de a à z. Les caractères accentués comme é, è, à, ç ne sont pas transformés par la version translate proposée.
print(rot13_translate("été à Paris"))
Résultat possible :
éé à Cnevf
Les lettres non accentuées sont transformées. Les accents restent tels quels.
Ce comportement est souvent acceptable pour un exercice d’algorithmique. Si vous voulez gérer toutes les langues, ROT13 n’est généralement pas le bon outil. C’est un exemple pédagogique, pas un système de chiffrement moderne.
ROT13 n’est pas une sécurité
ROT13 ne doit jamais être utilisé pour protéger un mot de passe, une clé API, un message sensible ou une donnée personnelle.
Il n’y a pas de clé secrète. Tout le monde connaît la transformation. Un attaquant n’a même pas besoin de “casser” le chiffrement : il suffit d’appliquer ROT13 une seconde fois.
ROT13 peut être utilisé pour :
- masquer légèrement une réponse dans un forum ;
- cacher temporairement un spoiler ;
- apprendre les substitutions de caractères ;
- illustrer un chiffrement de César ;
- s’exercer avec les chaînes Python.
ROT13 ne doit pas être utilisé pour :
- stocker des mots de passe ;
- chiffrer des fichiers ;
- protéger des données d’utilisateur ;
- sécuriser une communication ;
- remplacer une bibliothèque cryptographique.
Cette distinction est importante. Un exemple d’algorithmique peut être utile sans être une bonne pratique de sécurité.
Comparer les trois méthodes
| Méthode | Avantage | Inconvénient |
|---|---|---|
codecs.decode(texte, "rot_13") |
très court, bibliothèque standard | moins pédagogique |
str.maketrans + translate |
clair, rapide, explicite | demande de construire une table |
version manuelle avec ord et chr |
excellente pour apprendre | plus longue, plus facile à mal écrire |
Pour un script simple, utilisez codecs.
Pour un tutoriel ou un exercice, utilisez str.maketrans ou la version manuelle.
Pour de la vraie sécurité, n’utilisez pas ROT13.
Écrire des tests simples
Comme ROT13 est réversible, il est très facile à tester.
def test_rot13():
textes = [
"Bonjour Python",
"Hello World",
"ROT13!",
"abc xyz ABC XYZ",
"",
]
for texte in textes:
assert rot13_translate(rot13_translate(texte)) == texte
Vous pouvez aussi tester quelques résultats connus.
assert rot13_translate("abc") == "nop"
assert rot13_translate("nop") == "abc"
assert rot13_translate("Python") == "Clguba"
Ces tests permettent de vérifier :
- les minuscules ;
- les majuscules ;
- les caractères non alphabétiques ;
- le retour au texte d’origine.
Erreurs fréquentes
Décaler sans revenir au début
Si vous ajoutez simplement 13 au code d’un caractère, vous dépassez la fin de l’alphabet.
ord("z") + 13
Il faut utiliser % 26 pour revenir au début.
(ord("z") - ord("a") + 13) % 26
Oublier les majuscules
Une fonction qui traite seulement a à z ne transformera pas A à Z.
if "a" <= caractere <= "z":
...
Ajoutez un second cas pour les majuscules, ou utilisez str.maketrans avec les deux alphabets.
Modifier la ponctuation
ROT13 classique laisse la ponctuation inchangée. Une bonne fonction doit conserver les espaces, chiffres, virgules et points.
texte = "Python 3.14!"
Le résultat doit garder 3.14! tel quel.
Croire que ROT13 chiffre vraiment
ROT13 est une transformation réversible et publique. Il peut servir à comprendre l’idée d’un chiffrement par substitution, mais il n’offre aucune confidentialité.
Mini-exercices
Exercice 1
Prédisez le résultat :
print(rot13_translate("abc"))
print(rot13_translate("xyz"))
Réponse :
nop
klm
Exercice 2
Que renvoie ce code ?
texte = "Clguba"
print(rot13_translate(texte))
Réponse :
Python
Exercice 3
Complétez cette fonction pour qu’elle utilise codecs.
import codecs
def rot13_codecs(texte):
...
Réponse :
import codecs
def rot13_codecs(texte):
return codecs.decode(texte, "rot_13")
Pour aller plus loin
ROT13 est une bonne première étape pour comprendre les substitutions de caractères, mais il s’inscrit dans une famille plus large de transformations.
Vous pouvez continuer avec :
- le chiffre de Vigenère en Python, plus riche qu’un simple décalage fixe ;
- les équations XOR en Python, utiles pour comprendre les opérations binaires ;
- Modulo en Python, indispensable pour comprendre les cycles et les décalages.
Si vous retenez une seule règle : ROT13 est parfait pour apprendre, mais pas pour sécuriser. Pour un exercice Python, c’est un très bon support. Pour une application réelle, utilisez des bibliothèques de cryptographie conçues pour cet usage.
Références
- Documentation Python –
codecs - Documentation Python –
str.translate - Documentation Python –
str.maketrans

