Aller au contenu

Corrigé des exercices — Sécurité


Exercice : Algorithme ROT13

Rappel

L'algorithme ROT13 décale chaque lettre de 13 positions dans l'alphabet. Comme l'alphabet a 26 lettres, appliquer ROT13 deux fois revient au message original.

Solution

def chiffrement_rot13_mot(mot):
    """
    Chiffre un mot avec l'algorithme ROT13.

    :param mot: (str) Le mot à chiffrer (en minuscules)
    :return: (str) Le mot chiffré
    """
    resultat = ""
    for lettre in mot.lower():
        if 'a' <= lettre <= 'z':
            # Calculer la nouvelle position
            code = ord(lettre) - ord('a')  # Position 0-25
            nouveau_code = (code + 13) % 26  # Décalage de 13
            nouvelle_lettre = chr(nouveau_code + ord('a'))
            resultat += nouvelle_lettre
        else:
            # Garder les caractères non alphabétiques
            resultat += lettre
    return resultat


def chiffrement_rot13(message):
    """
    Chiffre un message complet avec l'algorithme ROT13.

    :param message: (str) Le message à chiffrer
    :return: (str) Le message chiffré
    """
    mots = message.split()
    mots_chiffres = [chiffrement_rot13_mot(mot) for mot in mots]
    return " ".join(mots_chiffres)

Version alternative (plus concise)

def rot13(message):
    """Version concise du chiffrement ROT13."""
    resultat = ""
    for car in message.lower():
        if 'a' <= car <= 'z':
            resultat += chr((ord(car) - ord('a') + 13) % 26 + ord('a'))
        else:
            resultat += car
    return resultat

Tests

>>> chiffrement_rot13("bonjour")
'obawbhe'

>>> chiffrement_rot13("python")
'clguba'

>>> chiffrement_rot13("Vive les numériques et sciences informatiques")
'ivir yrf ahzrevdhrf rg fpvraprf vasbezngvdhrf'

Exemples de chiffrement de noms

Prénom/Nom ROT13
Alice nyvpr
Bob obo
Florian sybevna
Mathieu znguvrh

Propriété remarquable

ROT13 est son propre inverse : appliquer ROT13 deux fois redonne le message original.

>>> rot13(rot13("bonjour"))
'bonjour'

Cela s'explique car 13 + 13 = 26, soit un tour complet de l'alphabet.

Généralisation : Chiffre de César

On peut généraliser avec un décalage variable (chiffre de César) :

def cesar(message, decalage):
    """
    Chiffre un message avec le chiffre de César.

    :param message: (str) Le message à chiffrer
    :param decalage: (int) Le décalage (clé)
    :return: (str) Le message chiffré
    """
    resultat = ""
    for car in message.lower():
        if 'a' <= car <= 'z':
            resultat += chr((ord(car) - ord('a') + decalage) % 26 + ord('a'))
        else:
            resultat += car
    return resultat


def decesar(message, decalage):
    """Déchiffre un message chiffré avec César."""
    return cesar(message, -decalage)
>>> cesar("bonjour", 3)  # Décalage de 3 (César classique)
'erqmrxu'

>>> decesar("erqmrxu", 3)
'bonjour'

>>> cesar("bonjour", 13)  # ROT13
'obawbhe'

Auteur : Florian Mathieu

Licence CC BY NC

Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.