Classic Cipher Projects

Robin Boucher - Cryptography Portfolio

Caesar Ciphers

Chiffrement de César: Chaque lettre du message est décalée dans l’alphabet (ex. "A" → "D" avec un décalage de 3).

def caesar_cipher(text: str, shift: int, mode: str = 'encrypt') -> str:
    """Chiffre ou déchiffre un texte avec l'algorithme César."""
    # (Le code de la fonction reste inchangé)
    ...

# Exemple : Chiffrement simple
original = "Bonjour le monde!"
chiffre = caesar_cipher(original, 3)  # Décalage de 3 vers la droite
print(f"Original: {original}")
print(f"Chiffré (décalage +3): {chiffre}")  # Sortie : "Erqmrxu oh prqgh!"

Déchiffrement de César: Chaque lettre du message est décalée dans l’alphabet (ex. "A" → "D" avec un décalage de 3).

def decrypt_ciphertext(ciphertext: str, shift: int = None) -> str:
    # (Le code de la fonction reste inchangé)
    ...

# Exemple : Déchiffrement avec interface
texte_chiffre = "Erqmrxu oh prqgh!"

# Mode 1 - Décalage connu
print("\nMode 1 - Avec décalage connu:")
resultat = decrypt_ciphertext(texte_chiffre, 3)
print(f"Résultat: {resultat}")  # Sortie : "Bonjour le monde!"

Comment briser le chiffrement Caesar:

Attaque force brute et fréquentiel:

Le César n'a que 25 décalages possibles (pour un alphabet de 26 lettres). On teste toutes les combinaisons :

Attaque force-brute César: Une méthode de cryptanalyse qui consiste à essayer toutes les combinaisons possibles de clés jusqu’à trouver celle qui déchiffre correctement le message.

# Brute Force Attack
def brute_force_attack(ciphertext):
    """Teste tous les décalages possibles (1 à 25)"""
    print("\n=== Attaque par force brute ===")
    for shift in range(26):
        decrypted_message = caesar_cipher(ciphertext, shift, 'dechiffrer')
        print(f"Décalage {shift:2d}: {decrypted_message}")

Attaque fréquentiel César: Une méthode de cryptanalyse qui exploite les fréquences d’apparition des lettres ou des bigrammes dans un texte chiffré pour deviner le message original ou la clé utilisée.

FREQUENCY_TABLES = {
    'en': 'etaoinshrdlcumwfgypbvkjxqz',
    'fr': 'easnrtoulidcmpévqfbghjàxèyêzwk'
}

def frequency_attack(ciphertext: str, lang: str = 'fr') -> str:
    """
    Déchiffre par analyse des fréquences linguistiques.
    """
    letters = [c.lower() for c in ciphertext if c.isalpha()]
    if not letters:
        return "Erreur : Aucune lettre à analyser"

    most_common = Counter(letters).most_common(1)[0][0]
    expected_char = FREQUENCY_TABLES.get(lang, 'fr')[0]
    shift = (ord(most_common) - ord(expected_char)) % 26
Caesar Cipher Toolkit
Ici pour voir le fichier caesar.py complet
# -*- coding: utf-8 -*- """ CAESAR CIPHER TOOLKIT ===================== Un outil complet de chiffrement/déchiffrement César avec : - Fonctions de base - Interface de déchiffrement - Méthodes d'attaque (force brute et analyse fréquentielle) - Support français/anglais """ from collections import Counter # ============================================================================= # SECTION 1 : FONCTION DE BASE # ============================================================================= def caesar_cipher(text: str, shift: int, mode: str = 'encrypt') -> str: """ Chiffre ou déchiffre un texte avec l'algorithme César. Paramètres : text (str): Texte à transformer shift (int): Décalage (1-25) mode (str): 'encrypt' ou 'decrypt' (par défaut: 'encrypt') Retourne : str: Texte transformé """ if not text: return "" effective_shift = shift if mode == 'encrypt' else -shift result = [] for char in text: if char.isalpha(): base = ord('A') if char.isupper() else ord('a') new_pos = (ord(char) - base + effective_shift) % 26 result.append(chr(base + new_pos)) else: result.append(char) return ''.join(result) # ============================================================================= # SECTION 2 : INTERFACE DE DÉCHIFFREMENT # ============================================================================= def decrypt_ciphertext(ciphertext: str, shift: int = None) -> str: """ Interface simplifiée pour le déchiffrement. Paramètres : ciphertext (str): Texte chiffré shift (int): Décalage connu (optionnel) Retourne : str: Texte déchiffré ou message d'erreur """ if not ciphertext: return "Erreur : Texte vide" if shift is not None: return caesar_cipher(ciphertext, shift, 'decrypt') else: print("\nOptions de déchiffrement :") print("1. Entrer un décalage connu") print("2. Utiliser l'analyse fréquentielle") print("3. Essayer la force brute") choice = input("\nVotre choix (1-3): ") if choice == '1': try: shift = int(input("Décalage connu (1-25): ")) return caesar_cipher(ciphertext, shift, 'decrypt') except ValueError: return "Erreur : Décalage invalide" elif choice == '2': lang = input("Langue (fr/en): ").lower() return frequency_attack(ciphertext, lang if lang in ['fr', 'en'] else 'fr') elif choice == '3': return brute_force_attack(ciphertext) # Retourne directement les résultats return "Option invalide" # ============================================================================= # SECTION 3 : MÉTHODES D'ATTAQUE # ============================================================================= # Brute Force Attack def brute_force_attack(ciphertext): """Teste tous les décalages possibles (1 à 25)""" print("\n=== Attaque par force brute ===") for shift in range(26): decrypted_message = caesar_cipher(ciphertext, shift, 'dechiffrer') print(f"Décalage {shift:2d}: {decrypted_message}") FREQUENCY_TABLES = { 'en': 'etaoinshrdlcumwfgypbvkjxqz', 'fr': 'easnrtoulidcmpévqfbghjàxèyêzwk' } def frequency_attack(ciphertext: str, lang: str = 'fr') -> str: """ Déchiffre par analyse des fréquences linguistiques. """ letters = [c.lower() for c in ciphertext if c.isalpha()] if not letters: return "Erreur : Aucune lettre à analyser" most_common = Counter(letters).most_common(1)[0][0] expected_char = FREQUENCY_TABLES.get(lang, 'fr')[0] shift = (ord(most_common) - ord(expected_char)) % 26 print("\nRAPPORT D'ANALYSE") print("=" * 40) print(f"Langue: {lang.upper()}") print(f"Lettre la plus fréquente: '{most_common}'") print(f"Supposée représenter: '{expected_char}'") print(f"Décalage calculé: {shift}") print("-" * 40) return caesar_cipher(ciphertext, shift, 'decrypt') # ============================================================================= # SECTION 4 : DÉMONSTRATION # ============================================================================= if __name__ == '__main__': # Configuration TEXTE_FR = "Bonjour le monde, ceci est un test!" DECALAGE = 3 # Démonstration print("\n" + "=" * 50) print("DÉMONSTRATION DU CHIFFREMENT CÉSAR".center(50)) print("=" * 50) # Chiffrement chiffre = caesar_cipher(TEXTE_FR, DECALAGE) print(f"\nOriginal: {TEXTE_FR}") print(f"Chiffré (décalage {DECALAGE}): {chiffre}") # Déchiffrement avec décalage connu print("\nDéchiffrement direct:") print(decrypt_ciphertext(chiffre, DECALAGE)) # Demonstrate the attacks brute_force_attack(chiffre) # Déchiffrement automatique print("\nDéchiffrement par analyse:") print(frequency_attack(chiffre)) # Menu interactif print("\nMode interactif (tapez 'quit' pour sortir)") while True: texte = input("\nEntrez un texte chiffré: ") if texte.lower() == 'quit': break print(decrypt_ciphertext(texte))
Démonstration du chiffrement César

Quelles sont les façons d'améliorer le chiffrement de César ?

Double Chiffrement

Appliquer deux décalages successifs (ex: +3 puis +5).

  • Équivalent à un décalage de +8, mais obscurcit la logique.
  • Masquer les espaces et la ponctuation

    Remplacer les espaces/ponctuation par des codes (ex: " " → #SP#).

  • Cache la structure des mots et phrases.
  • Inversion du texte

    Inverser le texte avant chiffrement ("HELLO" → "OLLEH").

  • "HELLO" (+3) → "ROOMI" (au lieu de "KHOOR").
  • Lettres fantômes

    Ajouter des caractères aléatoires ("A" → "AX").

  • Fausse les statistiques mais allonge le message.
  • Alphabet custom

    Utiliser un alphabet mélangé (A=Z, B=Y...).

  • Rend le brute-force moins évident.
  • À retenir

    Ces techniques complexifient l'attaque mais ne garantissent pas la sécurité. Pour une vraie protection :

    • Le César reste uniquement pédagogique
    • Vigenère offre un niveau supérieur de sécurité
    • AES/RSA sont indispensables pour des données sensibles