Aller au contenu

Le chiffre de César⚓︎

Le chiffrement de César transforme un message en changeant chaque lettre par une autre obtenue par décalage circulaire dans l'alphabet de la lettre d'origine. Par exemple, avec un décalage de 3, le 'A' se transforme en 'D', le 'B' en 'E', ..., le 'X' en 'A', le 'Y' en 'B' et le 'Z' en 'C'.

flowchart TD
  subgraph "Décalage de 3"
    direction TB
    bef1[...]
    W1[W]
    X1[X]
    Y1[Y]
    Z1[Z]
    A1[A]
    B1[B]
    C1[C]
    D1[D]
    aft1[...]
  end
  subgraph " "
    bef2[...]
    Z2[Z]
    A2[A]
    B2[B]
    C2[C]
    D2[D]
    E2[E]
    F2[F]
    G2[G]
    aft2[...]
  end
  W1 --> Z2
  X1 --> A2
  Y1 --> B2
  Z1 --> C2
  A1 --> D2
  B1 --> E2
  C1 --> F2
  D1 --> G2

Les autres caractères ('!', '?'...) ne sont pas transformés et sont simplement recopiés tels quels dans le message codé.

Dans cet exercice, nous ne prendrons que des lettres majuscules.

On fournit les deux fonctions

  • indice : renvoie l'indice dans l'alphabet d'une lettre majuscule en commençant à 0.
  • majuscule : renvoie la lettre majuscule d'indice donné.
Exemples
🐍 Console Python
>>> indice('C')
2
>>> majuscule(4)
'E'

Remarque

Pour opérer un décalage circulaire d'un indice, on utilise l'opération modulo \(26\) qui renvoie un résultat de \(0\) inclus à \(26\) exclu.

Décalage de 8 pour la lettre 'Z'

🐍 Console Python
>>> indice('Z')
25
>>> 25 + 8
33
>>> 33 % 26
7
>>> majuscule(7)
'H'
Le chiffrement de 'Z' sera ici 'H'.

Objectif

Écrire la fonction cesar qui prend en paramètres une chaine de caractères message et un nombre entier decalage et renvoie le nouveau message chiffré avec le chiffre de César utilisant ce decalage.

On constate que pour déchiffrer un message, il suffit d'utiliser la clé opposée à celle du chiffrement.

Exemples
🐍 Console Python
>>> cesar("HELLO WORLD!", 5) 
'MJQQT BTWQI!'
>>> cesar("MJQQT BTWQI!", -5) 
'HELLO WORLD!'
###
# testsbksl-nlassert cesar("HELLO WORLD!", 5) == "MJQQT BTWQI!"bksl-nlassert cesar("MJQQT BTWQI!", -5) == "HELLO WORLD!"bksl-nlassert cesar("BONJOUR LE MONDE !", 23) == "YLKGLRO IB JLKAB !"bksl-nlassert cesar("YLKGLRO IB JLKAB !", -23) == "BONJOUR LE MONDE !"bksl-nlbksl-nlbksl-nl# autres testsbksl-nlbksl-nlassert cesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 1) == "BCDEFGHIJKLMNOPQRSTUVWXYZA"bksl-nlassert cesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 24) == "YZABCDEFGHIJKLMNOPQRSTUVWX"bksl-nlassert cesar("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0) == "ABCDEFGHIJKLMNOPQRSTUVWXYZ"bksl-nlassert cesar("", 7) == ""bksl-nlassert cesar("!?.:", 7) == "!?.:"bksl-nlassert cesar("CESAR", 139) == "LNBJA"bksl-nlbksl-nl 5/5

def indice(caractere):bksl-nl "Renvoie l'indice de caractere qui doit être une majuscule"bksl-nl return ord(caractere) - ord('A')bksl-nl bksl-nldef majuscule(i):bksl-nl """Renvoie la majuscule d'indice donnéebksl-nl majuscule(0) renvoie 'A'bksl-nl majuscule(25) renvoie 'Z'bksl-nl """bksl-nl return chr(ord('A') + i)bksl-nlbksl-nldef cesar(message, decalage):bksl-nl resultat = ''bksl-nl for caractere in ...:bksl-nl if 'A' <= caractere <= ...:bksl-nl i = ...(caractere)bksl-nl i = (i + ...) ...bksl-nl resultat += ...(i)bksl-nl else:bksl-nl resultat += ...bksl-nl return ...bksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nlassert cesar('HELLO WORLD!', 5) == 'MJQQT BTWQI!'bksl-nlassert cesar('MJQQT BTWQI!', -5) == 'HELLO WORLD!'bksl-nlbksl-nlassert cesar('BONJOUR LE MONDE !', 23) == 'YLKGLRO IB JLKAB !'bksl-nlassert cesar('YLKGLRO IB JLKAB !', -23) == 'BONJOUR LE MONDE !'bksl-nlbksl-nldef indice(caractere):bksl-nl "Renvoie l'indice de caractere qui doit être une majuscule"bksl-nl return ord(caractere) - ord("A")bksl-nlbksl-nlbksl-nldef majuscule(i):bksl-nl """Renvoie la majuscule d'indice donnéebksl-nl majuscule(0) renvoie 'A'bksl-nl majuscule(25) renvoie 'Z'bksl-nl """bksl-nl return chr(ord("A") + i)bksl-nlbksl-nlbksl-nldef cesar(message, decalage):bksl-nl resultat = ""bksl-nl for caractere in message:bksl-nl if "A" <= caractere <= "Z":bksl-nl i = indice(caractere)bksl-nl i = (i + decalage) % 26bksl-nl resultat += majuscule(i)bksl-nl else:bksl-nl resultat += caracterebksl-nl return resultatbksl-nlbksl-nl

A

Aspect sécurité⚓︎

Jules César utilisait cette méthode avec l'alphabet grec, non compris de la plupart des gaulois, mais maitrisé par l'élite romaine.

Cette méthode de chiffrement n'est pas sécurisée et très facile à casser en tentant tous les décalages possibles ou en faisant une analyse des fréquences des lettres.

Aujourd'hui, elle est utilisée dans les livres-jeu où on souhaite donner un indice masqué, facilement accessible.

Z