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
# -*- 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))
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