Les statistiques au secours des cryptanalystes

<< Graphics`Graphics`

Décryptement d'un message secret

Il y a une petite subtilité pour copier-coller depuis une page web sur Mathematica. Si cela se passe mal (si Mathematica affiche plein de messages d'erreur), il faut procéder ainsi:
1. Coller le texte dans une cellule vide.
2. Sélectionnez cette cellule, puis aller successivement dans Format>Style>Text puis Format>Style>Input.
3. Copier le contenu de la cellule puis le coller entre les guillemets de la cellule ci-dessous.

Voici le message secret à déchiffrer (cryptogramme 1):

secret = "XY AXJ BYRJMYJ, MQQMVUVXYJ GXR NCBWJR N'UYX LMBY N'PCLLX \
XJ BGR XAVBDBVXYJ, XY IMAX NU AMYNXGMFVX, RUV GX QGMJVX NU LUV NU QMGMBR \
VCEMG. GX VCB DBJ AXJJX QMVJBX NX LMBY KUB XAVBDMBJ. MGCVR GX VCB APMYWXM NX \
ACUGXUV, RXR QXYRXXR G'XIIVMEXVXYJ, GXR SCBYJUVXR NX RXR VXBYR RX NXGBXVXYJ \
XJ RXR WXYCUZ RX PXUVJXVXYJ G'UY G'MUJVX. GX VCB AVBM MDXA ICVAX QCUV IMBVX \
DXYBV GXR LMWBABXYR, GXR APMGNXXYR XJ GXR MRJVCGCWUXR. GX VCB QVBJ GM QMVCGX \
XJ NBJ MUZ RMWXR NX FMFEGCYX : JCUJ PCLLX KUB GBVM AXJJX XAVBJUVX XJ LX IXVM \
ACYYMBJVX RCY XZQGBAMJBCY VXDXJBVM GM QCUVQVX, LXJJVM GX ACGGBXV N'CV M RCY \
ACU XJ, ACLLX JVCBRBXLX NMYR GX VCEMULX, BG ACLLMYNXVM. MGCVR DBYVXYJ JCUR \
GXR RMWXR NU VCB, LMBR BGR YX QUVXYJ QMR GBVX G'XAVBJUVX XJ IMBVX ACYYMBJVX \
MU VCB G'XZQGBAMJBCY. GX VCB FMGJPMRMV IUJ NCYA JVXR XIIVMEX, GM ACUGXUV NX \
RCY DBRMWX APMYWXM XJ RXR WVMYNR IUVXYJ FCUGXDXVRXR. GM VXBYX, XY VMBRCY NXR \
QMVCGXR NU VCB XJ NX RXR WVMYNR, DBYJ NMYR GM RMGGX NU IXRJBY. GM VXBYX QVBJ \
GM QMVCGX XJ NBJ : KUX GX VCB DBDX XJXVYXGGXLXYJ ! KUX JXR QXYRXXR YX \
J'XIIVMEXYJ QMR XJ KUX JCY DBRMWX YX APMYWX QMR NX ACUGXUV. BG E M NMYR JCY \
VCEMULX UY PCLLX KUB QCRRXNX XY GUB G'XRQVBJ NXR NBXUZ RMBYJR. QXYNMYJ GXR \
SCUVR NX JCY QXVX, UYX GULBXVX, UY NBRAXVYXLXYJ XJ UYX RMWXRRX ACLLX GM \
RMWXRRX NXR NBXUZ, IUVXYJ JVCUDXR XY GUB, XJ GX VCB YMFUAPCNCYCRCV JCY QXVX \
G'XJMFGBJ ACLLX APXI NXR NXDBYR, NXR LMWBABXYR, NXR APMGNXXYR XJ NXR \
MRJVCGCWUXR. QMVAX KU'UY XRQVBJ RUQXVBXUV, UYX BYJXGGBWXYAX, UY NBRAXVYXLXYJ, \
G'XZQGBAMJBCY NXR RCYWXR, G'BYJXVQVXJMJBCY NXR XYBWLXR, GM RCGUJBCY NXR \
QVCFGXLXR, IUVXYJ JVCUDXR XY GUB, XY NMYBXG, M KUB GX VCB MDMBJ NCYYX GX YCL \
NX FXGJRPMRRMV, KUX NMYBXG RCBJ NCYA MQQXGX XJ BG IXVM ACYYMBJVX \
G'XZQGBAMJBCY.";

Analyse des fréquences des lettres

On va analyser les fréquences d'apparition des lettres pour les comparer à celles du texte français.

ascii = ToCharacterCode[secret];
long = 
        Length[Select[
            ascii,  (# < 91  &&  # > 
                    64)  &]];
lettres = 
        Table[FromCharacterCode[j], {j, 65, 
            90}];
fréquences = 
        Table[N[Count[ascii, j]/long], {j, 65, 
            90}];
TableForm[{lettres, fréquences}, 
      TableDirections -> {Row, Column}]
barres = 
        Thread[{fréquences, lettres}];
BarChart[barres, 
        PlotRange -> {0, 0.2}];
barresTriées = 
        Reverse[Sort[barres]];
BarChart[barresTriées, PlotRange -> {0, 0.2}, 
        BarStyle -> {RGBColor[1, 0, 0]}];

Remplacement des lettres

La comparaison des fréquences nous indique presque à coup sûr que le "e" est chiffré par le "X". L'analyse de fréquences est une aide au décryptement, mais elle demande interprétation: par exemple les fréquences des lettres O et U sont assez proches et c'est le contexte qui permettra de trancher.

Pour remplacer une lettre du message secret par une autre, complétez l'instruction suivante (par convention, le message chiffré est écrit en majuscules, le texte clair en minuscules):

\(StringJoin[
        Characters[
            secret] /. {"X" -> "e", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> "", "" -> ""}]\)