Pour ceux qui prennent peur devant un texte long
Chaque partie de ce défi, identifiée par un titre, peut être réalisée séparément. Il n’est absolument pas besoin de tout lire (ni de tout faire) d’un seul coup. Alors ne partez pas tout de suite.
Pour ce Défi de Clem de février, on revient vers de la cryptographie, mais promis, ce sera plus simple que la dernière fois. Le but de ce défi va être de réaliser un programme capable de décrypter1 automatiquement un texte rendu illisible par l’utilisation de certains chiffrements simples. Semi-automatiquement serait plus exact : un tel programme peut se tromper, et il faut toujours un œil humain pour vérifier le résultat obtenu et, éventuellement, remettre la recherche sur les rails.
Nous allons procéder en trois étapes, permettant d’introduire des outils de décryptage au fur et à mesure, et de présenter trois systèmes de chiffrement, pour ceux qui ne les connaissent pas encore.
Tout au long de ce défi, gardez à l’esprit que, du fait des méthodes de décryptage employées, le programme sera d’autant plus efficace que le message fourni en entrée sera long.
Étape 0 : pré-traiter un message
Il est d’usage, dans les systèmes de chiffrement les plus basiques, de simplifier le message à chiffrer en enlevant toutes les espaces et les ponctuations, en remplaçant les caractères spéciaux par leurs versions sans diacritiques (p. ex. ç > c, œ > oe, ê > e, etc.) et en mettant toutes les lettres en majuscule, ou en minuscule, selon ce que vous préférez.
Cette étape 0 consiste donc à écrire une fonction qui prenne un message écrit en français courant (on n’utilisera que du français dans ce défi) et en fasse un message traitable par les fonctions de chiffrement. Dans l’idéal la fonction sera paramétrable, permettant de choisir une sortie en minuscules ou majuscules, de conserver les espaces d’origine ou de les enlever totalement, ou de redécouper le message toutes les $n$ lettres.
Par exemple, le texte que j’écris en ce moment même, avec les options « majuscules » et « découpage toutes les cinq lettres », doit donner le résultat suivant.
PAREX EMPLE LETEX TEQUE JECRI SENCE MOMEN TMEME AVECL ESOPT IONSM AJUSC ULESE TDECO UPAGE TOUTE SLESC INQLE TTRES DOITD ONNER LERES ULTAT SUIVA NT
Étape 1 : chiffre de César
Le chiffre de César est ce que l’on appelle un chiffrement par substitution simple : chaque lettre du message en clair (c’est-à-dire, le message que l’on va chiffrer) sera remplacée par une et une seule autre lettre ; en outre, deux lettres de l’alphabet de départ ne peuvent pas être remplacées par la même lettre de l’alphabet d’arrivée.
Plus précisément, le chiffre de César se contente de décaler les lettres du message en clair d’un certain nombre de rangs dans l’alphabet. Par exemple, le chiffre de César « classique » décale de trois lettres : A devient D, B devient E, C devient F, etc. Et pour déchiffrer, on procède simplement dans l’autre sens : on décale chaque lettre du même nombre de rangs dans l’autre sens.
Commencez donc par écrire une fonction qui prend un texte et un décalage, et permet de chiffrer / déchiffrer le texte avec le chiffre de César utilisant ce décalage.
Avec un décalage de 12, le message « Rends à César ce qui est à moi ! » doit devenir DQZPEMOQEMDOQCGUQEFMYAU.
Comment l’attaquer ?
L’avantage du chiffre de César (du point de vue de l’attaquant, bien sûr), c’est qu’il n’y a que 25 décalages possibles à essayer et à vérifier, ce qui est donc très rapide. Et c’est précisément ainsi que va fonctionner votre première fonction de décryptage : il s’agira de décaler le message de un rang, puis de deux, puis de trois, etc. et de laisser l’utilisateur trouver lui-même quelle combinaison est la bonne.
Cette méthode a l’avantage de fonctionner quelle que soit la longueur du message, mais elle demande encore une trop grande participation de l’utilisateur. Pour mieux automatiser le processus, on va utiliser une forme simplifiée d’analyse des fréquences.
Vous l’avez sans doute déjà remarqué, toutes les lettres n’apparaissent pas aussi souvent dans un texte : on trouve beaucoup plus de T que de J, par exemple. Eh bien, en français, c’est le E qui truste la première place, et de très loin : en moyenne, 17,26 % des lettres d’un texte en français sont des E. En deuxième et troisième places arrivent le A avec 8,4 % et le S avec 8,08 % : une domination incontestable, vous disais-je.
Ce que vous devez faire, c’est compter combien de fois apparaît chaque lettre du message à décrypter : celle qui apparaît en première position a de très fortes chances d’être un E dans le texte en clair, ce qui vous permet de déduire le décalage qui a été utilisé. Allez ! Au travail !
En guise d’exercice, essayez de retrouver quel message se cache derrière le cryptogramme suivant.
SYKMA OTTGB GOZPG SGOYK AJKHU TNKAX GBKIY KYINB XKYOR RKYVK XJGOZ ZUAZK YJKRG SSKLG UTATH KGASG ZOTKR RKYIG YYGOK TZRKA XIUXJ KYKTG RRGOK TZJGT YRGSU TZGMT KKZRN GAZRK RUAVR KYSGT MKGOZ TORKY IGXKY YKYJK RKAXS GZXKT ORGVK AXJAR UAVXO KTTKR KYXKZ KTGOZ IZGOZ VGXGZ ORJKY INBXK YOTJV KTJGT ZKYBU ARGTZ ZUAZV XODRK MXGTJ GOXKZ RGROH KXZ
Il s’agissait du tout début de La chèvre de M. Seguin.
M. Seguin n’avait jamais eu de bonheur avec ses chèvres.
Il les perdait toutes de la même façon : un beau matin, elles cassaient leur corde, s’en allaient dans la montagne, et là-haut le loup les mangeait. Ni les caresses de leur maître, ni la peur du loup, rien ne les retenait. C’était, paraît-il, des chèvres indépendantes, voulant à tout prix le grand air et la liberté.
Pistes d’amélioration
Le ROT13 est un cas particulier du chiffre de César, celui où le décalage est de 13 : la même fonction permet alors de chiffrer et déchiffrer le message. Vous pouvez, si vous le désirez, ajouter une fonction spécifique pour ce chiffrement-là.
Sur un texte court, l’analyse fréquentielle peut donner de mauvais résultats. Vous pouvez proposer plusieurs résultats possibles, par ordre de probabilité : d’abord, la lettre la plus fréquente du cryptogramme correspond à un E, puis c’est la deuxième plus fréquente, puis la troisième. S’il faut aller plus loin, c’est que vous n’avez pas de chance, ou qu’un petit malin a décidé de chiffrer La Disparition de Georges Perec.
(Niveau avancé) Il est possible d’aller encore plus loin pour limiter le besoin de recourir à une vérification humaine. Une fois que vous avez déterminé quelle lettre correspond à un E et décrypté le message en fonction de cela, vous pouvez utiliser un dictionnaire pour chercher des mots de sept ou huit lettres dans le texte ainsi décrypté : si vous n’en trouvez aucun, c’est mauvais signe, et vous pouvez passer à la deuxième solution la plus probable.
Étape 2 : substitution simple
Je vais répéter ici la définition d’un chiffrement par substitution simple : chaque lettre du message en clair sera remplacée par une et une seule autre lettre ; en outre, deux lettres de l’alphabet de départ ne peuvent pas être remplacées par la même lettre de l’alphabet d’arrivée.
La différence avec le chiffre de César, c’est qu’il n’y a aucune espèce de logique dans la manière d’échanger les lettres. On peut décider, par exemple, que A devient K, B devient W, C reste C, D devient A, E devient J, etc. On constitue ainsi un alphabet désordonné qui devient la clé de notre message : ici, il s’agirait de KWCAJ…
Pour chiffrer un message, on prend chaque lettre du message en clair et on la remplace par son équivalent dans l’alphabet desordonné. Pour déchiffrer le message, on procède dans l’autre sens. Vous pouvez dès à présent coder ces deux fonctions.
Avec l’alphabet désordonné GHSUKNMLTCQXVZJIDORYABWPEF, le message « La réforme, oui. La chienlit, non ! » doit devenir XGOKN JOVKJ ATXGS LTKZX TYZJZ.
Il n’est cependant pas très pratique de générer (et surtout, de retenir !) un alphabet désordonné parfaitement aléatoire. Il existe donc deux techniques pour générer un alphabet désordonné à partir d’une clé.
- L’alphabet désordonné commence par la clé, nettoyée bien sûr de ses doublons, puis les autres lettres de l’alphabet suivent leur ordre habituel.
- On procède de même, mais en répartissant les lettres sur cinq ou six colonnes, puis on prend les lettres colonne par colonne.
Vous pouvez donc ajouter à votre code la possibilité de générer des alphabets désordonnés à partir d’une clé.
Avec la clé DISMOITOUTBILOUTE, la première méthode donne l’alphabet désordonné DISMOTUBLEACFGHJKNPQRVWXYZ. La seconde méthode, elle, avec un tableau de cinq colonnes, donne le résultat suivant.
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
D | I | S | M | O |
T | U | B | L | E |
A | C | F | G | H |
J | K | N | P | Q |
R | V | W | X | Y |
Z |
Ce qui donne l’alphabet désordonné DTAJRZIUCKVSBFNWMLGPXOEHQY.
Comment l’attaquer ?
La seule technique viable consiste à généraliser l’analyse des fréquences. Il faut compter combien de fois apparaît chaque lettre dans le cryptogramme, et donc quel pourcentage de l’ensemble des lettres elle représente, et comparer avec la répartition fréquentielle des lettres en français pour tenter une correspondance entre alphabet désordonné et alphabet ordinaire.
Pour cela, vous aurez besoin de ladite répartition fréquentielle du français, que je vous donne directement sous une forme utilisable informatiquement, parce que je suis gentil.
1 2 3 4 5 | (0.084,0.0106,0.0303,0.0418,0.1726, 0.0112,0.0127,0.0092,0.0734,0.0031, 0.0005,0.0601,0.0296,0.0713,0.0526, 0.0301,0.0099,0.0655,0.0808,0.0707, 0.0574,0.0132,0.0004,0.0045,0.0030,0.0012) |
Cependant, si vous testez votre fonction de décryptage, vous verrez que même avec un texte de plus de huit mille caractères, le résultat obtenu par cette seule méthode est assez illisible. Il vous faudra donc ajouter deux possibilités de post-traitement, afin de rendre la fonction plus utilisable.
Tout d’abord, il faudra que l’utilisateur puisse signaler au programme où il s’est trompé. Supposez par exemple que le programme aboutisse au résultat « JEIUSITOUJOURILA » : il faudrait pouvoir lui dire « En fait, tu as inversé le S et le I dans ton décryptage, essaye encore. ». Je vous laisse décider quelle forme cela peut prendre.
Ensuite, il serait même encore mieux que le programme propose de lui-même ce genre de corrections. En effet, si vous regardez attentivement les fréquences, à part le E qui est tout seul en première place, les autres sont assez susceptibles de changer de place si le texte en clair ne respecte pas strictement la répartition fréquentielle.
Par exemple, C (3,03 %), P (3,01 %) et M (2,96 %) qui ont un score très proche, et assez nettement séparé de leurs plus proches voisins D (4,18 %) et V (1,32 %), ont de fortes chances de se retrouver mélangés. Il pourrait être assez intéressant que le programme propose plusieurs versions alternatives du décryptage, où ces trois lettres arriveraient dans un ordre différent. Et bien évidemment, faire de même avec d’autres lettres susceptibles d’être inversées. À vous de voir comment rendre cette amélioration progressive du rendu la plus ergonomique possible.
En guise d’exercice, essayez de retrouver quel message se cache derrière le cryptogramme suivant. Gardez bien à l’esprit, cependant, qu’il est à peu près impossible d’arriver à un résultat parfait du premier coup, donc ne vous inquiétez pas si votre programme ne donne pas un retour optimal.
IMGPB MUMBB RRIRG APBMB SGRIR ONHAP PMGQR RQDMS IAQRB SAQLM AEBRD RGQQM ABBMG QIRPR PJHAG QRPUM OABBM GQRPS GJMPP MVRMP MBSDA RNRMQ NMURN PBRLR SABBM VRDHN QRBIS GVNMG ISJMP IMGPB RPJNH LHGIR SNPIR BMUMB BRRHS BMBSD ARNRG RJMNU ARGQJ MPPRD RSURG QIRPL HNDRP KSAGR PHGQJ MPIRP QAGRR PMRQN RUSRP LHAPH GGMGQ RBMUR VRQMQ AHGNR OHSUN ROCMK SRURN PMGQH SBMUA VGRUA RNVRD MBRLA KSRRQ BRPJB MGQRP VNADJ MGQRP NMDJR GQJMN DABRP JARNN RPIRP JMBMA PRGNS AGRPR GBMOM GQRQN HAQRD RGQIR POHBH GGRPE NAPRR PRQIR QNMGV RPDHG HBAQC RPPHS BRUMG QBRPI MBBRP IRDMN ENRJH PRRPJ MNIRP DMAGP HSEBA RRPRQ IMGPB RPMNE NRPKS AJHSP PRGQV AVMGQ RPKSR PIMGP IRPOH SNPIR BMENR RPEHG IAPPR GQIRJ RQAQP PAGVR PQMGI APKSM BBMGQ RQURG MGQJM NBRPO NYJQR PJNHL HGIRP PRGQH NQABB RGQIR PPRNJ RGQPU RGADR SXRQI RPRQN RPPKS MDRSX PMGPG HDADD RGPRP PHGQB RPJAR NNRPK SAIHN DRGQP HSPBR POHSU NRBAQ PIRDH SPPRL NHAIR RQCSD AIRRQ JSAPP MGQPP HGQBR PDSNP IHGQR BBRPP HGQQH DERRP JHSNB RQRNG AQRBR SNPEM QAPPR SNPBR PMUMA RGQRN AVRPR QMBMU RNAQR ABPPR NURGQ RGOHN RGHEB RDRGQ OMNOR PQMSI RPPHS PIRSX KSRBR ONMJM SIVNA PMLMA QPMIR DRSNR QHSQM SLHGI IRBMU MBBRR PRQNH SURBM NAUAR NRQCH DIHGQ BRPRM SXPHG QUAPK SRSPR PRQNR DJBAR PIRLR SABBR PIRPH SNORP OMOCR RPRBB RFMAB BAQRQ URNPI RPVNH QQRPP HSQRN NMAGR PRBBR PROHS BRPAE ARGKS RBRIR DHGIR BMUMB BRRGR PMAQJ MPJHS NKSHA PRPRM SXPHG QNHSV RPGAM KSRBP BARSX RBBRP PHGQB ARRPB RVRGA RKSAC MGQRB RPNMY HGPIR BMBSG RJMNB MMSIR DHGIR BMUMB BRRIA PMGQF RPSAP UARSX RQQNR PHSEB ARSXI APDHA BRPMO QRPBM JJMNR GORRQ BRGHD IRORS XKSAH GQOHG PQNSA QORPO CHPRP IRJAR NNRRQ BRIRD HGNRJ HGIAQ FRPSA PDRDH ANRRQ FRPSA PURNP RIMGP BRPQN MIAQA HGPIS JMPPR DMAPD HAMSP PAFRP SAPUA RSXOR PRQNR PRQMA RGQOH DDRBR PRMSX IRBMN AUARN RQCHD HGGRJ HSUMA QBRPO HDJNR GINRI RBRSN PMOQR PFRGR DRPHS UARGP JMPOM NABPG RXAPQ RNRGQ KSRIM GPBAG PQMGQ IRBRS NMJJM NRGOR FRDRP HSUAR GPUMV SRDRG QRBBR RQMAQ JMNRA BBRMO RBBRI RPJRQ AQPPA GVRPI MGPBR PMNEN RPIRB RSNGH DFRDR PHSUA RGPOB MANRD RGQOM NABNA DRMUR OORBS AIRBM NAUAR NRORP RQNRP ICARN PMJJR BMARG QCHDD RMBHN PBRVR GARPR GUHBM IRGHS URMSU RNPBR DAGOR ONHAP PMGQI RBMBS GRRQB RIRDH GNRVM NIMMQ QRGQA URDRG QSGJR QAQPA GVRIM GPSGM NENRK SAJHS PPMAQ IMGPS GROHS NIRBM ENRR
Il s’agissait du court texte Mémoire écrit par H. P. Lovecraft, dans la traduction donnée par Wikisource. L’alphabet désordonné est généré à partir de la clé « MemoireLovecraft », par la méthode horizontale.
Pistes d’amélioration
Pour poser les premiers jalons d’un décryptage sur ce type de chiffrements, on peut employer la méthode des mots probables : vous faites l’hypothèse qu’un certain mot se trouve dans le texte (par exemple, « attaque », « bataillon » ou « soldats » dans un texte d’origine militaire), et vous essayez de trouver des suites de lettres dans le cryptogramme qui pourraient correspondre à ce mot. Par exemple, pour « attaque », vous chercheriez une suite de sept lettres, la première et la quatrième étant identiques, la deuxième et la troisième aussi, mais les autres étant toutes différentes. En combinant cela et l’analyse fréquentielle, on peut arriver assez vite à de bons résultats.
Il est également possible de compter combien de fois apparaît chaque combinaison de deux ou trois lettres, et de comparer là encore avec la répartition attendue en français. Cela peut lever certaines ambiguïtés. Par exemple, on a vu que C, P et M ont, prises individuellement, une fréquence d’apparition très proche. En revanche, ME est nettement plus courant que CE, lui-même nettement plus courant que PE. De même, malgré la fréquence assez faible du D, c’est lui qui a le plus de chance d’apparaître entre deux E.
(Niveau avancé) À l’aide d’un dictionnaire, vous pouvez vérifier si tel ou tel échange de lettres (ou combinaison de plusieurs échanges) donne de meilleurs résultats, en faisant apparaître des mots significatifs dans le texte décrypté.
(Niveau avancé) À l’aide d’un dictionnaire, vous pouvez tenter de trouver l’éventuelle clé à l’origine de l’alphabet désordonné, et tester si tel ou tel échange de lettres améliore les résultats de cette recherche de clé.
Étape 3 : chiffre de Vigenère
Le chiffre de Vigenère est une variante subtile du chiffre de César. On commence par choisir une clé, puis la première lettre de la clé détermine le décalage à appliquer à la première lettre du message, la deuxième lettre de la clé détermine le décalage à appliquer à la deuxième lettre du message, etc. Évidemment, quand on arrive au bout de la clé, on recommence au début de celle-ci, et ainsi de suite jusqu’à ce que le message soit entièrement chiffré.
Avec la clé VIGENERE, le texte « Pourquoi est-ce qu’un corbeau ressemble à un bureau ? » doit devenir KWAVD YFMZA ZGRUL YIKUV OIRYM MYWRQ SPZIA ROYII VC.
En effet, la première lettre de la clé (V) est la 22e de l’alphabet, et indique donc un décalage de 21 rangs pour la première lettre du message. I est la 9e lettre de l’alphabet, d’où 8 rangs de décalage pour la deuxième lettre. G est la 7e, donc 6 rangs. Etc.
Pour déchiffrer, on procède bien évidemment en sens inverse. Avec cela, vous avez toutes les informations en main pour écrire les fonctions de chiffrement et déchiffrement pour Vigenère. Vous pouvez bien sûr réutiliser la fonction du chiffre de César déjà codée, puisque le chiffre de Vigenère se sert explicitement de ce dernier.
Comment l’attaquer ?
La différence avec le chiffre de César est subtile, et pourtant, elle fait une grande différence : la méthode de l’analyse de fréquences ne fonctionne plus ! Ou plus exactement, plus toute seule. En effet, avant de pouvoir procéder à une analyse fréquentielle, il faut déterminer la longueur de la clé utilisée. Pour cela, deux méthodes existent.
La première consiste à chercher des suites de trois lettres ou plus (plus c’est long, plus c’est bon) qui apparaissent plusieurs fois dans le cryptogramme. Il y a de très fortes chances que ces lettres correspondent aux mêmes lettres du texte en clair, chiffrées par les mêmes lettres de la clé. Par conséquent, la distance (en lettres) entre la première lettre de la première occurrence et la première lettre de la seconde occurrence est très vraisemblablement un multiple de la longueur de la clé.
En relevant toutes les occurrences de suites de lettres qui apparaissent plusieurs fois, et en calculant la distance entre ces occurrences d’une même suite de lettres, on peut alors rechercher le diviseur commun à toutes ces distances : il s’agit de la longueur de la clé, avec une très forte probabilité.
La seconde méthode est plus mathématique. Elle utilise ce que l’on appelle l’indice de coïncidence des lettres du cryptogramme. Pour calculer l’indice de coïncidence, il faut compter le nombre de A que renferme le cryptogramme (qu’on appelle $n_1$), le nombre de B ($n_2$), le nombre de C ($n_3$), etc. jusqu’à Z ($n_{26}$), et on appelle $n$ le nombre total de lettres que compte le cryptogramme. L’indice de coïncidence $IC$ est alors obtenu par la formule suivante.
Dans un texte parfaitement aléatoire, cet indice de coïncidence est aux alentours de $0,038$. Pour un texte en français, en revanche, il est censé être aux alentours de $0,074$. En pratique, cependant, même avec un texte de plus de 1500 caractères, on peut encore avoir des indices assez nettement différents, comme $0,08$.
Pour obtenir la longueur de la clé par cette méthode, vous allez commencer par calculer l’indice de coïncidence de l’ensemble du cryptogramme (on va l’appeler $IC_1$). Puis vous allez diviser le cryptogramme en deux sous-textes, le premier contenant la 1re, la 3e, la 5e, etc. lettre, et le second contenant la 2e, la 4e, la 6e, etc. lettre ; vous calculez alors l’indice de coïncidence de chacun de ces sous-textes, et vous en faites la moyenne ($IC_2$). Vous répétez le procédé avec trois sous-textes, contenant chacun une lettre toutes les trois lettres, puis avec quatre sous-textes, etc.
Lorsque vous atteignez un indice de coïncidence moyen très proche de celui du français ($0,074$), vous avez trouvé la longueur de votre clé ! Du moins, ça, c’est la théorie. Comme je l’ai dit, dans la pratique, l’indice de coïncidence peut être assez éloigné de $0,074$, même avec la bonne longueur de clé. En outre, les longueurs de clé ayant un diviseur commun avec la longueur réelle (par exemple, 6 pour une longueur réelle de 8) peuvent faire de bons scores, et les diviseurs de la longueur réelle des scores encore meilleurs (par exemple, 4 pour 8).
Comment être sûr de trouver la bonne, alors ? Sauf mauvaise surprise, la bonne longueur de clé aura un indice de coïncidence supérieur à l’indice théorique, tandis que les autres « bons scores » s’en approcheront plutôt par le bas.
Une fois que vous avez déterminé la longueur de la clé, vous divisez le cryptogramme en autant de sous-textes, comme on l’a fait précédemment pour calculer l’indice de coïncidence, et vous appliquez à chacun la même méthode de décryptage que pour le chiffre de César. Finalement, une fois qu’on a la bonne longueur de clé, c’est pas si difficile !
En guise d’exercice, essayez de retrouver quel message se cache derrière le cryptogramme suivant. Notez qu’au début du texte se trouve une date écrite en chiffres, qui a été supprimée, pour des raisons de commodité.
VVZCW RHSMK BJGOE UQQIL KJDLP FHGMV TCIHJ VHFMZ MVRYO AQQSG XERUO TOSMV FVGNS EGVCM XIRYD EWOCK ERIHF MDHCV KVPCF NQCOM XCZYQ OXFFV ILPFJ CHQFR BISUV QXSFE HLGHP UVOXI XJGCP NVSNH NVBIV SUSGV KTWIO SLQCU XJOMZ MSONY BVZYE EVWLU XCICG ALFYT HEBUJ TUSMF NJIHF FRFGV TTQYT SLPFV WVDIV RYIYU XCOJQ AUSCC WVFOE IWWIE JLWUD CRAJR ZESXP RGWHR BISWF SHHOU XJIHF PHFCF WVUFP RLSOJ XUSHP TUSUE VZSHO EOWNK XIONV RHSRG EZEOF LHQUI TTHYS EGSWV MFIPS AJSUL LJWSU RRIPV KRHIO POIMU TWTCS MDHCF GJEOF DHRCJ VLGMJ OQGCC XJHXF SWWHV TLULB NGDOS EZQUD EOICU NDCCO STICJ TZHMJ NWSLV LJSLF NFCLV TLLWI OVSMU NGOMT EQCHG TIQYR UHZFV LJCHU LHDUJ LVAUJ SSOLT XHIYM LHGMF GKPYM LHGYK BEHYS EVGUE MVGWF SWOFZ GKSHU IRBXV VVDOC LLQKL XECOT AYCHJ FLZNJ POWYC XJQCU AWWIE LECOT AXFCF GJRYT IUSFV LUCHO EURUE LCSNF XWSJI HMSHD AOCHR NIOCU PXOCE LZACF UAUIL MVFFF SYSLJ ZIOWJ EXLXV UVFHB RGRYM XEHUE OXFIL WVZUD OPHYJ LVRYE IHZYJ MPZYG EUAYV MVBYS GLEOV WVDYJ RHQUI WVBUM EWGOI MFINU AQHXR KKWZJ CHGXV FVHLF OXRYJ MPZYE OQHFR MIOXV CWWIE GVDYV TJOLU XIZUN OLBXI XKFUD EPOCJ VVJIM UPSYE XLHYU EGSGV LLFYN EQHAI HJGCF TGSJC NJHIV THIHV IRFNJ EGIWY TIAYE EFSNK XCOHH UHOOI TZHYD HDDJV TTSOY QXWHV ERQIO NDWMJ XEHJB SSCOI EVGUV TUSMV LGSLP NVEOL GVOHU HRZIX BVDLP VHBWR EVOPF CWFUU NTHCP NQSMV YVFUQ AVHLF ICCHH THAJJ TKHYO DUSIE MICOW EUOXR BCZYV RVRYJ KVBPP IVOOO MVLNF SGOHJ EVGHP THGKL BRQWP MSOAE XEHFF VRZOD XTSNU EGSLE BVFYQ AUHCV WVBIU RHHLR ORWFD OPDLV GURYT NRHYJ UZPFJ OJFUG AZEOF SHHXV LRRXJ TLCHJ GFIMB VRBMM HLZOF TUSOK BCSUD EXLKL BJWHU EUSMJ XEHUM ASCYJ BVRYT TUCOS TUCOS SHBFV NIRIO NDBNE HEDUT UQSVZ UCWIH RDDBZ XTCGQ LHHYD TZGXF SLAJC XJBIU EVEOZ EVILQ EUAYK MICHU DHHOU BVFJM UVOZF GUZYT SXXYK LHIYO OXGNI TZHIO SQCOJ LRJIO SOSMJ XIJCD EVEOV IVINS EQRLV NEUOJ DHRYT XXSHS EPSGV KVROJ TDRYD HUSMU EVDLF IFFNJ OQGIE OFIXS AEWYE GVDUT CKSLT AVFXB NVQYC BMFYD ETIYE HLGHB VRBMG TJJIV LXMGV MKFYV NHVCJ MFWLF CRAJC XKSXF LDBWZ XEBYM IWHYI TKILF PUCPV GTOFF NRIMR OFBMW OXZOJ BDDFF MHBNV VIWLF LKWMK HZFYE EOOJF XJWYE EVHLF NSOXP UUGYE GFIMF NWSHR GKOOY POIMX KRBXT NRAMV GTVIJ SLGMR GKZYT POIMZ GKSLF SVOHK LFIFF SSZOJ VRFUD THFCJ MZEOF SGIHV IVFCP DHWFE RJSLB DRBWH NVGNJ OQBCU XXOOD EOAZR BUWNO IGSJV BICFO IGSZF EHIYU DHFID TEGHJ DHHUE MUOOU RHGKL BDSLJ THFUZ XEHFI OQBYL KUSNS EQCGD XJDIV RWCOJ VVIRM ARBNI HLJYS AGSMI XEGYJ GQSGV GKGXB NVZYC BMFYU OXXIL KJDLF CLSOO WVRCF ZYWYJ XKCYV VUSMU XJHLP UEOXF NIGCM NHLCJ MVAUM HHILV NJSGF NWRYK KRROD TLCHW KRBWB IVSKL XUSFB PUSGZ XISYE IWWIE JLWYT TYWYZ ECWYO OXGFR OFBMD OQGNR FDSHU CRBML EKSJP UUIHV IRFNJ EGSHF MISNS AYOCC EFIPS AJSXV YRILJ EORIE MCOJM UVULR GUSJB RWWYV LKRUJ LOSOI LVFLP NHSHF NJOYU EPCCE LLHCM EFSFZ OISLF PRBXR BKWFB UQPYJ HZBCM NRIMC TJSGC LHWFE HLGUT EPPFV JLWFF TDWNK XDDME EIOCI XJCLU IUZUG HVGCF DHGNI HLPUE OXFMU XJBYD RRDIC XJGWJ EQHCW BHIYT QXSMF GKHLP PVCOM XEHHP SUSPL XJBIT CRZFV VKWIO SHHHF LUWMT EUHUK BFBMQ OXFFR IICXV IUSUL ZIOHE JRILC XKIXF DHGNI HLPUE OXFMR IICZJ THROU XMSFP PSSGV GKRYT EWIXV LICGB NHGJC NJWYV RVSXZ MZCHT OQHJR KLRUV TUSMJ HEHYO PUSJR KRHCP NFSLK TZBYT PDFNZ XJRYM HLGNF BISFJ TWSLR BISIO THHYK KRWNF EVOZF GUQYT OQHFV LISMV LWONJ WVQYT DLJYI LKFUW AXLKL XECOT AYCHJ OFIFV RHGOD XIOJS EVHIL MCSMU RRIVR WFILT NRBNG TJSWS IWDIL KHIYM EXFML OISME EYWYE GVBNE EVGOA XKGXF TKSMV LUSXP CWCLR MFIXF DLGWL LJWIO SDQUU XDWKV EVWFJ HEHYD RLHJF NIZYQ UEZCT IFILV NJFUE WGIVM IFCOC XJTYN MHGXZ GKSFM IJSHT XVHXF CXFZF KDOCF NWZUD TACLJ THSNF NISAO ALHFV VLZNF DHZUG HVGCF MDZAI XCOXJ FISLV GTSXF SWSGG LVHXF SPILJ VVDOC LLQHV WFWNQ AVOPF BIQIN POSNV FVBNE IVDUI NUIGP IQGHF NJBYM EFFIP HEGJB SHBNF NKQUT NRIME HLGWP MSOLV KZCHT VRZIE MZSLT AXBUU OVFMB IUSXL MICVB RFZOJ HEJYS RDDFL LCCCO QXSWV LDCNT DHGCX GVBNV NHAUE BVFYE EFFCI XHICD OQGCJ MVOXF RRINV KCSMQ RRTUE XJSNB RHGYI OVFFB PRSMZ XRIRT EXZMZ GZHCF SDEOF BLBAS AQRNI HLPUE OXFAZ KRINE EECLE XCVLF PRBXZ MLBDP UUDUI ERRYD LDFUK BFBMV IYOHK XHICT EUHXV WVPOU AXBYU XJSMD HDBMF GJXYG EUOCJ LZXUW ALGUJ LVNXF TDZYE MLBYD HDBMF GESNU EDGMV STZUJ RHDIL KHIYN OQDYK BKTCM SOOWF FGFCU CHGNC TGSHT EHEOZ GFIMB SRIPV GKUOJ DHRUE LCOLF DDQNZ HERYD EWFUM TZZHP UVZUL KZCHT VRIFL TJGYA COOCI XKOMT ECGCD ICSJP UUEOZ EWINB LDDII MVSXF TRINC XDCHE EBOPF GJBIV SUSOJ LZBIV SDJCF GJZCO THBNZ HERYE EGWYI VVJIM UPSUE HKFYW IHIRD TZHLF CDACC EVQBB BDBYR NECOT NHDIL OFBMM EGSXZ XIOOK OXFXY NZEOB SDAYD HZFYW EQSLV X
Il s’agissait de l’avant-propos de l’ouvrage Les Troubadours, leurs vies, leurs œuvres, leur influence de Joseph Anglade et la clé utilisée était TROUBADOUR.
Pistes d’amélioration
Il est possible d’améliorer légèrement le choix du décalage à opérer pour décrypter un (sous-)texte utilisant le chiffre de César. Plutôt que de se fonder uniquement sur la fréquence maximale et d’en déduire qu’il s’agit d’un E, vous pouvez calculer la somme des écarts entre la fréquence qu’aurait chaque lettre dans le texte décrypté pour un décalage donné, et la fréquence attendue en français : le décalage ayant le plus faible écart cumulé sera certainement le décalage voulu.
(Niveau avancé) À l’aide d’un dictionnaire, vous pouvez vérifier si la clé obtenue après l’analyse fréquentielle de tous les sous-textes est un mot ayant du sens : si c’est le cas, il s’agit très certainement de la bonne clé.
(Niveau expert) Que faire si la clé fait la longueur du texte, ou a minima une longueur telle qu’il n’est pas possible de faire une analyse fréquentielle sur les sous-textes ? Cette question restera ouverte, à vous de proposer d’éventuelles solutions. Il est bien entendu que ce point est du pur bonus, et que le défi sera considéré comme réussi à 100 % même si vous n’y répondez pas.
En guise de conclusion
Améliorer encore un peu plus ?
Et si votre programme était capable de décider par lui-même lequel de ces trois systèmes de chiffrement a été utilisé ? Le chiffre de Vigenère est facile à isoler : l’indice de coïncidence du texte complet sera très mauvais. Pour ce qui est de distinguer efficacement une substitution simple d’un chiffre de César, je vous laisse trouver la solution par vous-mêmes…
Voilà, c’est tout pour ce défi. Comme vous le voyez, il y a plein de petites étapes, que vous pouvez réaliser séparément : par exemple, rien ne vous oblige à coder les fonctions de chiffrement / déchiffrement pour coder les fonctions de décryptage, et vice-versa.
J’ai donné quelques exemples pour tester vos fonctions de décryptage. Je vous invite chaleureusement à proposer vos propres cryptogrammes sur lesquels les autres pourront plancher. Et maintenant, amusez-vous bien !
Candidat | Langage | Étendue |
---|---|---|
Emeric | Perl 6 | Chiffrement et déchiffrement César |
Folaefolc | Python | Étape 0, décryptage César |
Garfield | Python | Étape 0 |
Ge0 | Python 2 | Décryptage Vigenère |
LudoBike | C++ | Décryptage César |
Matouche | Python 3 | Décryptage César |
SpaceFox | Java | Décryptage Vigenère |
Taurre | C | Étape 0, chiffrement César |
yoch | Python | Décryptage substitution simple |
-
Petit point vocabulaire : on parle de déchiffrer un message quand on sait comment procéder, et qu’on connaît la clé, mais de décrypter quand le message ne nous est pas destiné et qu’on essaye de le lire quand même. ↩