Aller au contenu

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
🐍 Console Python
>>> 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'

🐍 Console Python
>>> indice('Z')
25
>>> 25 + 8
33
>>> 33 % 26
7
>>> majuscule(7)
'H'
Le chiffrement de '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'

🐍 Console Python
>>> indice('Z')
25
>>> 25 + 8
33
>>> 33 - 26
7
>>> majuscule(7)
'H'
Le chiffrement de '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
🐍 Console Python
>>> césar("HELLO WORLD!", 5) 
'MJQQT BTWQI!'
>>> césar("MJQQT BTWQI!", -5) 
'HELLO WORLD!'

Coup de pouce

  • Pour tester si un caractère est une lettre,
    • on peut effectuer le test à compléter : 'A' <= caractère <= ...

Il s'agit d'une comparaison entre chaines de caractères avec l'ordre lexicographique.

On a, par exemple :

🐍 Console Python
>>> 'abcdef' < 'ghi'
True
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013x/.ùTr;nbOylae%êu)d6Jz3Am?(P+02è-,59fqZ7B8 N_o=pcwgv41`kRéhtsSàCjDi:E050t0o0,0n0?0m0-0R0X0m0n0-0-0V010,0?0W010406050-0r0z0z0n0g0l040.0U0m0r190U0i0R020n0z0W0h0R0)0o1j0g0M0r0o0-050c1g1i1k1m1e0W04051R1K1U0c1R1e0t0?0!111315170+0?0Z0+0m1,0+0,1c050|0j0m0o1%1416011+1-1/1-0,1^1`1?0,0g1S0,0+1|1)010L0~0o0i1x0o01111p0-0W0n0i170F1?2p2r2d1~2g1`2j0z2l040a0R0C0g0U0W0U0-0?1s1u0`2n0g0g0o0X2P1K2w0i1S0c2b2#282a291@0t2y171/0i2i2M1?1!1$121}2/0?2;0i0U2^1?0W2U1S2Z2#361f2q1u2`2e2 0g1j0m1c0R0$2Y3a1d392x3c1~3e3g3i0F3l2r3n2Z2.013s0n3h040R0x3w2!1e3z3q173C3E0R0#3I3y3a3A3O3i0J3S3K3U3M3B0U3f3D3i0u3Z3o3b1(3r3(3t3F0O3-3L3:3N3=3*3F0Q3_3#3{3%3)3P0K413p433W040$0E3S1V341K2^2(0t2a2-3$0X302E0_1#1S330o353m4f4p0`4x492{010(1c0`0L4f3`4E0Y3i4K424E0i0L1c0X0*0-1k4P4D2e1b040B4Z3/4R1c2D150n0Z0o4)3A4$0I3S0R3.3V4H0*0X3D4/4;1L4y4L4#1c0s0@3Z0R5b4`553r1c0g4W0r0m0|0,4_4{3$0U1c0V5n5e170-2u0401015a5c5o434G040L3(5t4Q3d4U1k0n2W0G2U5J4!1~0U4N042}5S4*5L044-4X4:4=3$4$59533x065c5;5d5K1~5F0?4J5.2!5?5T5v5x010y5A5|3F5D4E5q04025k0h5s655~5!5f044 0g5O0,5Q52366g3A696b0,6d5Z3A5w1c010N64385u015,5B5=5=675#0?0T1`245R6f6L5U5r6x3$0i1c2}1!0X6p545@174$4(656T3N5M6l5P6R6E6)6G576I6J5C6F6Y5X0T4A6%3x6r5p6V6S6F6+5*4a6Z6O0{28735}6.01690D6W7c040t4~505)6-796`786^690p7n4E0z0?1c0F3,655:6|5;7j6 5h1g5k0n5m7x5 7k1c0D6e6q7M4,0n0;0r0-0X5j7h4C6h6*1c6,6@7U6 6N727b4E4$0s6{7L6F5F0o0 7,7j6H7I7K7 6^7N5i7Q7S7Z6F7l7Y3m757o6k6m6o6{7j5F2U0,0r0g0i7B5#7O5j5l3-0c722#4v2#4j1K0,4l8J2+2$0n1_4w4i4t1Q7-3A2U0z0T0L0n0(0o0T0+0x1c1C1E1G1I0R5-381X3n2^3A0n0t0z1t2O0?1t0R2 0,2E1Q8_8{8}2P0H190,26040:4q0R0`105H0i2W8 0i100t000}0`1V8@1#3A201.1:1=8V3$2A2i2k1c2G0.0X0g1a0,2H0l2b1t4f8G3.374y8E8q4H0o5{7=7.015W4`7u8a4T5X0i6#847v4%7`5#8m6=9;6^7|8;3m3!7U9)5C9+7U0-0t6A5z1C0i0!0U0?1{0m006!0?6$9h1{0%9_6n2U0%0R1G0?9had9N0q7g0R0r2;0R1j7%7)7+3Za09%a63i5c020Z6vaOaQaP1Aai6$0B000y007}7I7jaL3F5c4ea$6Fa(5;aR0ha:a:0RaV0oaX0Na!48aKa7a)5b0F3Y7IaJ6ya 5;5z6D9 897U8r0{8u8w7T9%0i0j1c3(0t9@1~7aa4bj6:8n6?6(7U7|8x6U040HbA3Nbl04bnbp7/9?bs6y0$1caY00bJ6_04a#3606b53$5F4IbS9)bS4S7#aF7*1`bSbr9$4|5Xb.579~5/7ja25bbSa(b9aaacae0R13aD7$7(b,1{9qa^av0i0i0*7,bXa%b7aNaTa=aTc5b+7+0B0EbV9 ciaM5bbQa}b6cw1vclcD6vcoc7cqb2ctb_a-cjcxa{aIcvb00Rb98p805gbf8vbE3BbG0X0+0gb?bLb:6XbGbIbM5+7:b}bO04cyc:43bzbi6s7Wc!7@c*cK3J1K9X1X4h0c4j8U0S0U930w2n1i2i9N902}121rc38/930-0,9p2r10c40t0U0Xdr9L0i0Z0d5d281t0Z9e001I9NaB1{0o0b6$0m2B930R337R0?8.0d2YdGdC8F3nd98T4s2_438`8|0i8~dk4S69953$d/989n9a2O9d0y2p2V9N0-4~8u2O0*9u8U0v7+100:4W1kaA191/4X2O117f1{0z0*9Q2R0n0!2Vc39r0m0W0+8P0{0R0Z2U0X0I91904p1y9L9paf0ndV1q2q0g9N9ieE0n5jad0-eI1j0?10e%28e(0*dVehag0*1/dU2Je%2;d!8?8U0:eoaDer0+9g2Rc%5`0L8Xdi91dKdre.10e57*eNcf0ReD280G9j5O2h060/111}0o0gfi1u930i0|fy0R0,0U7(do9p7r134:102L150?8Q10fDfv0R8!e(2rdM2;062r3D0l0-c98/f60*8.9l8/eW6P7g0-e`1Y1T040y0r0;fD0g9q0+0r0?eI821`fifb1r0~e,c9dufFc31#2U0-0H0;0o0r0R0U0egl1u0-fDeB2Oc91t2;fuaBa@9/ajep141G0*eI8!0X2h2DfA5O6$fM8Qf=d)da4i0{0}0 9vd-4Ed{d;2P0R0j1t7(1cd_d.97g#d}9b9d0Pg)1Je{f@0=gb8.0mfrfK1k19b,aefu0tgk7q4 fI0oeIc49k9m90f31+0Lf61Df82Ref4XfudL0R0*0Z3D0Rfq4XfS1thf2Qc94~hihkgK9N0A0R0^0b0W1/8.fuak1Gfa9N0)0k0f0$0xgQ1ed*0!04.