Le chiffre de César
Le cadre
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, on a les transformations :
- le
'A'en'D', - le
'B'en'E', - ...,
- le
'W'en'Z', - le
'X'en'A', - le
'Y'en'B', - 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é.
Deux fonctions d'aide
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
>>> indice('C')
2
>>> majuscule(4)
'E'
Remarque
Pour opérer un décalage circulaire d'un indice, on peut utiliser deux techniques :
On peut faire l'opération modulo \(26\) qui renvoie un résultat de \(0\) inclus à \(26\) exclu.
Décalage de 8 pour la lettre 'Z'
>>> indice('Z')
25
>>> 25 + 8
33
>>> 33 % 26
7
>>> majuscule(7)
'H'
'Z' sera ici 'H'.
Cette méthode est plus lente, plus complexe, mais pédagogique !
Cette technique permet de présenter l'opérateur modulo qui est omniprésent en arithmétique modulaire... La discipline indispensable pour devenir un pro de cryptographie !
Cette technique permet d'utiliser n'importe quel décalage entier !
On suppose ici que l'indice est dans l'intervalle d'entiers \([\![0..26[\![\) et que le décalage est dans l'intervalle d'entiers \(]\!]-26..26[\![\)
- Si l'indice décalé est supérieur ou égal à 26, on soustrait 26, pour rester dans l'intervalle d'entiers \([\![0..26[\![\)
- Si l'indice décalé est strictement négatif, on ajoute 26, pour rester dans l'intervalle d'entiers \([\![0..26[\![\)
Décalage de 8 pour la lettre 'Z'
>>> indice('Z')
25
>>> 25 + 8
33
>>> 33 - 26
7
>>> majuscule(7)
'H'
'Z' sera ici 'H'.
Cette méthode est plus efficace !
Il faut que le décalage soit dans l'intervalle d'entiers \(]\!]-26..26[\![\).
Exercice
Coder une fonction césar qui prend en paramètres une chaine de caractères message et un nombre entier décalage et renvoie le nouveau message chiffré avec le chiffre de César utilisant ce décalage.
On constate que pour déchiffrer un message, il suffit d'utiliser la clé opposée à celle du chiffrement.
Exemples
>>> césar("HELLO WORLD!", 5)
'MJQQT BTWQI!'
>>> césar("MJQQT BTWQI!", -5)
'HELLO WORLD!'
Coup de pouce
- Pour tester si un
caractèreest une lettre,- on peut effectuer le test à compléter :
'A' <= caractère <= ...
- on peut effectuer le test à compléter :
Il s'agit d'une comparaison entre chaines de caractères avec l'ordre lexicographique.
On a, par exemple :
>>> 'abcdef' < 'ghi'
True
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)