Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 1017 minDébutant

Chiffrement de César et chiffrement affine

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • coder et décoder un message par le chiffrement de César ;
  • coder un mot par un chiffrement affine de clé (a, b) ;
  • justifier qu'une clé est valable et compter les clés ;
  • établir la formule de déchiffrement avec l'inverse modulaire ;
  • retrouver une clé à partir de deux lettres connues.

5 exercices corrigés1 schéma

Le chiffrement affine remplace chaque lettre, numérotée x de 0 (A) à 25 (Z), par la lettre numéro y ≡ a × x + b [26], où le couple (a, b) est la clé. Le chiffrement de César en est le cas particulier a = 1 : chaque lettre est décalée de b rangs. Pour déchiffrer, on utilise l'inverse de a modulo 26, ce qui impose que a soit premier avec 26. Ce chapitre applique toute l'arithmétique modulaire des chapitres précédents à ces deux chiffrements : codage, décodage, choix des clés, et la façon dont on les casse. Leur place dans l'histoire de la cryptographie, avec Vigenère et Enigma, est racontée dans le chapitre Chiffrements historiques du cours Cryptographie.

Numéroter les lettres

On remplace chaque lettre par son rang dans l'alphabet, en commençant à 0 :

ABCDEFGHIJKLM
0123456789101112
NOPQRSTUVWXYZ
13141516171819202122232425

Comme il y a 26 lettres, tous les calculs se font modulo 26 : après Z, on revient à A, comme sur une liste circulaire.

Le chiffrement de César

Jules César, selon l'historien Suétone, remplaçait chaque lettre de ses messages par celle située trois rangs plus loin. Avec une clé de décalage k :

Avec k = 3 : B (1) → 4 (E), T (19) → 22 (W), S (18) → 21 (V). « BTS » devient « EWV ». Pour « RESEAU » : R (17) → 20 (U), E (4) → 7 (H), S (18) → 21 (V), A (0) → 3 (D), U (20) → 23 (X). On obtient « UHVHDX ». Pour X (23) : 23 + 3 = 26 ≡ 0, X devient A : le modulo fait « boucler » l'alphabet.

Le casser est immédiat : il n'y a que 25 décalages utiles. On les essaie tous, c'est une attaque par force brute. Le message intercepté « YVBALBY » donne, en décalant de 1, 2, 3… vers l'arrière : XUAZKAX, WTZYJZW, VSYXIYV, URXWHXU, TQWVGWT, SPVUFVS, puis ROUTEUR pour k = 7. Un seul essai a un sens.

Le décalage de 13 (ROT13) a une curiosité : comme 13 + 13 = 26 ≡ 0, l'appliquer deux fois redonne le texte de départ. Il sert encore à masquer la réponse d'une devinette sur un forum, jamais à protéger une donnée.

Le chiffrement affine

Le chiffrement affine multiplie avant de décaler :

Chiffrer avec la clé (7, 3) : y ≡ 7x + 3 [26]Rrangx = 177x + 37 × 17 + 3 = 122modulo 26122 ≡ 18SDéchiffrer : x ≡ 15 (y − 3) [26], car 15 est l’inverse de 7 modulo 26Srangy = 1815 (y − 3)15 × 15 = 225modulo 26225 ≡ 17R7 × 15 = 105 = 4 × 26 + 1 ≡ 1 [26]
Clé (7, 3) : R → S. Pour revenir en arrière, on multiplie par 15, l'inverse de 7 modulo 26

Exemple : chiffrer « RESEAU » avec la clé (7, 3).

Lettrex7x + 3Reste modulo 26Lettre codée
R17122122 = 4 × 26 + 18 → 18S
E43131 = 26 + 5 → 5F
S18129129 = 4 × 26 + 25 → 25Z
E4315F
A033D
U20143143 = 5 × 26 + 13 → 13N

« RESEAU » devient « SFZFDN ». Les deux E sont codés par la même lettre F : c'est un chiffrement monoalphabétique, chaque lettre a toujours la même image.

Pourquoi a doit être premier avec 26

Essaie la clé (2, 1) sur « ROUTEUR » : R (17) → 35 ≡ 9 (J), E (4) → 9 (J). R et E sont codés tous les deux par J : à la lecture de J, impossible de savoir s'il faut lire R ou E. Le message « JDPNJPJ » ne peut pas être déchiffré sans ambiguïté.

C'est la propriété du chapitre 9 : les nombres a × x modulo 26 parcourent tous les restes, chacun une seule fois, si et seulement si PGCD(a, 26) = 1. Avec a = 2, PGCD(2, 26) = 2, les valeurs 2x ne prennent que 13 valeurs (les nombres pairs) : deux lettres différentes ont forcément la même image. Avec a premier avec 26, le codage est une bijection de l'alphabet sur lui-même : chaque lettre codée correspond à une seule lettre claire. Le cours de théorie des ensembles étudie ce même exemple sous l'angle des injections, surjections et bijections.

Combien de clés valables ? 26 = 2 × 13 : a doit être impair et différent de 13. Il y a 12 valeurs possibles pour a (1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25) et 26 pour b, soit 12 × 26 = 312 clés. Parmi elles, la clé (1, 0) ne change rien, et les 26 clés (1, b) sont des chiffrements de César.

Le sujet de l'E3 de la session 2026 demandait justement de compléter un algorithme qui compte ces clés : une boucle sur a de 1 à 25, un test PGCD(a, 26) = 1, un compteur, et un résultat multiplié par 26 (proposition de corrigé).

Déchiffrer avec l'inverse modulaire

Pour retrouver x à partir de y ≡ 7x + 3 [26] :

  1. on isole le terme en x : 7x ≡ y − 3 [26] ;
  2. on multiplie par l'inverse de 7 modulo 26, qui est 15 (7 × 15 = 105 = 4 × 26 + 1) : 15 × 7x ≡ 15(y − 3) [26] ;
  3. comme 15 × 7 ≡ 1 [26], il reste x ≡ 15(y − 3) [26], soit x ≡ 15y − 45 ≡ 15y + 7 [26] (car −45 + 52 = 7).

Exemple : déchiffrer « SFZFDN ».

Lettre codéey15y + 7Reste modulo 26Lettre claire
S18277277 = 10 × 26 + 17 → 17R
F58282 = 3 × 26 + 4 → 4E
Z25382382 = 14 × 26 + 18 → 18S
F5824E
D35252 = 2 × 26 → 0A
N13202202 = 7 × 26 + 20 → 20U

On retrouve « RESEAU ». Le déchiffrement d'un chiffrement affine est lui-même un chiffrement affine, de clé (15, 7).

La rédaction attendue dans un sujet. Les énoncés guident souvent le calcul ainsi : « Montrer que si 9x + 5 ≡ y [26], alors x + 15 ≡ 3y [26]. » La méthode est toujours la même : multiplier les deux membres par l'inverse de a (ici 3, car 9 × 3 = 27 ≡ 1 [26]), puis réduire. 3(9x + 5) = 27x + 15 ≡ x + 15 [26], donc x + 15 ≡ 3y [26], et x ≡ 3y − 15 ≡ 3y + 11 [26].

Casser un chiffrement affine

Avec 312 clés, la force brute reste à la portée d'un programme en une fraction de seconde. Mais même à la main, le chiffrement affine se casse par analyse de fréquences : comme chaque lettre a toujours la même image, la lettre la plus fréquente du message codé correspond probablement à la lettre la plus fréquente de la langue. En français, c'est E, loin devant les autres, suivie de A, S, I, N, T et R (l'ordre exact varie selon les textes).

Exemple. Dans un long message codé, les deux lettres les plus fréquentes sont F et G. On suppose que E (4) est codé par F (5) et T (19) par G (6) :

  • 4a + b ≡ 5 [26]
  • 19a + b ≡ 6 [26]

En soustrayant la première équation de la seconde : 15a ≡ 1 [26]. Donc a est l'inverse de 15 modulo 26 : a = 7. Puis b ≡ 5 − 4 × 7 = −23 ≡ 3 [26]. La clé est (7, 3), et on déchiffre tout le message. Il suffit de deux lettres devinées pour retrouver la clé.

Ce que ces chiffrements t'apprennent sur la cryptographie actuelle

César et le chiffrement affine ne protègent plus rien depuis longtemps, mais leurs principes sont toujours là :

  • la sécurité doit reposer sur la clé, pas sur le secret de la méthode (principe de Kerckhoffs) : tout le monde connaît la formule ax + b, seule la clé est secrète ;
  • un espace de clés trop petit se casse par force brute : 312 clés, c'est très peu. AES, le chiffrement symétrique standard, utilise des clés de 128, 192 ou 256 bits, soit au moins 2¹²⁸ possibilités ;
  • un chiffrement qui conserve les fréquences se casse par analyse statistique : les chiffrements modernes font en sorte que le texte chiffré ressemble à du hasard ;
  • l'arithmétique modulaire reste au cœur du chiffrement asymétrique : RSA calcule des puissances modulo un très grand nombre, et le déchiffrement utilise un inverse modulaire, comme ici. RSA est hors programme du module de maths ; le cours Cryptographie le déroule avec de petits nombres et montre ses usages (HTTPS, certificats, signatures).

Le chiffrement de Hill, qui code les lettres par paires avec une matrice modulo 26, combine cette arithmétique avec le calcul matriciel.

Chiffrer en Python

python
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

def chiffrer_affine(message, a, b):
    resultat = ""
    for lettre in message:
        x = ALPHABET.index(lettre)
        y = (a * x + b) % 26
        resultat = resultat + ALPHABET[y]
    return resultat

def dechiffrer_affine(message, a, b):
    a_inv = pow(a, -1, 26)      # inverse de a modulo 26 (erreur si PGCD(a, 26) ≠ 1)
    resultat = ""
    for lettre in message:
        y = ALPHABET.index(lettre)
        x = (a_inv * (y - b)) % 26
        resultat = resultat + ALPHABET[x]
    return resultat

print(chiffrer_affine("RESEAU", 7, 3))    # SFZFDN
print(dechiffrer_affine("SFZFDN", 7, 3))  # RESEAU

Le % 26 de Python renvoie toujours un résultat entre 0 et 25, même quand y - b est négatif. Le cours d'algorithmique détaille le traitement des chaînes de caractères et le code de César, et le chapitre 11 de ce cours écrit l'inverse modulaire sans pow.

Exercices

Exercice 1 sur 5 César Réussi À revoir

  1. Chiffre « SERVEUR » avec un décalage de 10.
  2. Le message « FDHVDU » a été chiffré par César avec un décalage de 3. Déchiffre-le.
  3. Combien de clés de César différentes existe-t-il, en comptant le décalage nul ?
Voir la réponseMasquer la réponse de l'exercice 1
  1. S (18) → 28 ≡ 2 (C) ; E (4) → 14 (O) ; R (17) → 27 ≡ 1 (B) ; V (21) → 31 ≡ 5 (F) ; E → O ; U (20) → 30 ≡ 4 (E) ; R → B. « COBFOEB ».
  2. On recule de 3 : F → C, D → A, H → E, V → S, D → A, U → R. « CAESAR ».
  3. 26 clés (décalages de 0 à 25) ; une 27e reviendrait au décalage 0, puisque 26 ≡ 0 [26].

Tu avais trouvé ?

Exercice 2 sur 5 Chiffrement affine Réussi À revoir

On utilise la clé (5, 8) : y ≡ 5x + 8 [26].

  1. Chiffre le mot « CODE ».
  2. L'inverse de 5 modulo 26 est 21. Vérifie-le, puis montre que le déchiffrement s'écrit x ≡ 21y + 14 [26].
  3. Déchiffre « NWVIWPC ».
Voir la réponseMasquer la réponse de l'exercice 2
  1. C (2) → 18 (S) ; O (14) → 78 ≡ 0 (A) ; D (3) → 23 (X) ; E (4) → 28 ≡ 2 (C). « SAXC ».
  2. 5 × 21 = 105 = 4 × 26 + 1 ≡ 1 [26] : 21 est bien l'inverse de 5. De y ≡ 5x + 8, on tire 5x ≡ y − 8, puis x ≡ 21(y − 8) = 21y − 168 [26]. Or −168 = −7 × 26 + 14, donc x ≡ 21y + 14 [26].
  3. N (13) → 21 × 13 + 14 = 287 = 11 × 26 + 1 → B ; W (22) → 476 = 18 × 26 + 8 → I ; V (21) → 455 = 17 × 26 + 13 → N ; I (8) → 182 = 7 × 26 + 0 → A ; W → I ; P (15) → 329 = 12 × 26 + 17 → R ; C (2) → 56 = 2 × 26 + 4 → E. « BINAIRE ».

Tu avais trouvé ?

Exercice 3 sur 5 Clés valables Réussi À revoir

  1. La clé (13, 4) est-elle valable ? Justifie et montre un exemple de problème.
  2. On ajoute l'espace à l'alphabet, en 27e caractère (rang 26). Les calculs se font modulo 27. Combien y a-t-il alors de clés (a, b) valables ?
Voir la réponseMasquer la réponse de l'exercice 3
  1. Non : PGCD(13, 26) = 13 ≠ 1. 13x modulo 26 ne vaut que 0 (x pair) ou 13 (x impair) : toutes les lettres de rang pair sont codées par E (0 + 4 = 4), toutes celles de rang impair par R (13 + 4 = 17). Par exemple A, C et E sont toutes trois codées E.
  2. 27 = 3³ : a doit être premier avec 27, donc non multiple de 3. Entre 1 et 26, il y a 26 − 8 = 18 valeurs (on retire 3, 6, …, 24). Avec 27 valeurs de b : 18 × 27 = 486 clés.

Tu avais trouvé ?

Exercice 4 sur 5 Retrouver la clé Réussi À revoir

Un message a été chiffré par un chiffrement affine de clé inconnue (a, b). On sait que A est codé par I et E par C.

  1. Écris le système de congruences vérifié par a et b.
  2. Trouve b, puis montre que 2a ≡ 10 [13].
  3. En déduis les valeurs possibles de a, puis la clé.
Voir la réponseMasquer la réponse de l'exercice 4
  1. A (0) → I (8) et E (4) → C (2) : b ≡ 8 [26] et 4a + b ≡ 2 [26].
  2. b = 8. Alors 4a ≡ 2 − 8 = −6 ≡ 20 [26]. Il existe donc un entier k tel que 4a = 20 + 26k ; en divisant par 2 (une égalité d'entiers, pas une congruence) : 2a = 10 + 13k, c'est-à-dire 2a ≡ 10 [13].
  3. L'inverse de 2 modulo 13 est 7 (2 × 7 = 14 ≡ 1). a ≡ 7 × 10 = 70 ≡ 5 [13], donc a = 5 ou a = 18 entre 0 et 25. 18 est pair, donc pas premier avec 26 : la clé ne serait pas valable. La clé est (5, 8). Vérification : 5 × 4 + 8 = 28 ≡ 2 (C).

Tu avais trouvé ?

Exercice 5 sur 5 Le message de l'administrateur Réussi À revoir

L'administrateur d'un réseau laisse dans un fichier le message « BGGBXJN », chiffré avec la clé (3, 1).

  1. Trouve l'inverse de 3 modulo 26.
  2. Établis la formule de déchiffrement.
  3. Déchiffre le message.
Voir la réponseMasquer la réponse de l'exercice 5
  1. 3 × 9 = 27 ≡ 1 [26] : l'inverse de 3 est 9.
  2. y ≡ 3x + 1 donne 3x ≡ y − 1, puis x ≡ 9(y − 1) = 9y − 9 ≡ 9y + 17 [26].
  3. B (1) → 26 ≡ 0 (A) ; G (6) → 71 = 2 × 26 + 19 (T) ; G → T ; B → A ; X (23) → 224 = 8 × 26 + 16 (Q) ; J (9) → 98 = 3 × 26 + 20 (U) ; N (13) → 134 = 5 × 26 + 4 (E). « ATTAQUE ».

Tu avais trouvé ?

Chapitre terminé !

Fais les 5 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Algorithmes d'arithmétique en PythonRevoir le sommaire du cours