Les flots de caractères

De $1

Le code de César

Durant la guerre des Gaules, César eut l’idée de communiquer des messages secrets à ses alliés. Sa manière de coder les messages fait sourire aujourd’hui mais avec les Gaulois, il eut du succès… Voici sa technique :

Le message à coder est en majuscules, par exemple « LE CIEL TOMBE ! », il peut comporter des espaces et des ponctuations. On ne code que les lettres (minuscules et majuscules), les autres caractères restent inchangés. César commence par choisir un nombre de l’intervalle [1,25], par exemple 3. Ce nombre sera le décalage. Il change chaque lettre du message par la lettre située 3 crans plus loin dans l’alphabet. Par exemple, A devient D, et E devient H. Il obtient alors le message codé « OH FLHO WRPEH ! ».

La classe Cesar

Implanter en Java une classe Cesar qui encode l'algorithme de César. 

  • Champs entier : clé
  • Constructeur pour initialiser la clé
  • Méthode char code(char c); qui encode un caractère avec la clé
  • Méthode char decode(char c); qui décode un caractère avec la clé
  • Méthode String code(String s); qui encode un message complet avec la clé
  • Méthode String decode(String s); qui décode un message complet avec la clé

Codage et décodage d'un fichier texte

On veut maintenant coder et décoder un fichier texte en utilisant le codage de César.

Implanter en Java une classe Codeur qui s'utilise de la façon suivante :

java CodeurCesar code source.txt destination.txt 3

La méthode main de cette classe attend quatre arguments sur la ligne de commande:

  • Le premier est soit code, soit decode. Il permet de choisir si on souhaite coder ou décoder le fichier.
  • Le deuxième est le nom du fichier source (à coder ou à décoder selon le cas).
  • Le troisième est le nom du fichier destination, résultat du codage ou du décodage.
  • Le dernier est la clé de codage.

Si les arguments utilisés ne correspondent pas aux attentes ou ne sont pas au bon format, on affichera un message d'erreur pour l'utilisateur.

Analyse fréquentielle

Pour casser le code de César, une attaque possible consiste à faire une analyse de fréquence d'apparition des lettres. On compte la fréquence d'apparition de chaque lettre dans le texte crypté et on compare à la fréquence dans un texte de référence pour une langue donnée. 

  1. Proposer une classe AnalyseFrequentielle qui prend un fichier texte et produit un fichier CSV qui contient pour chaque lettre son nombre d'apparition et son taux d'apparition. On ne fera pas la distinction entre les minuscules et les majuscules. Dans le fichier CSV, chaque ligne correspondra à une des 26 lettres de l'alphabet. Chaque information sera séparée par un point-virgule. A;12;0.06, si le A est apparu 12 fois, c'est-à-dire dans 6% des cas.
  2. Proposer une classe BarChart qui dessine dans une applet un diagramme à partir de l'information lue dans un fichier CSV. En abscisse on représentera les lettres de l'alphabet. En ordonnée, on représentera le pourcentage d'apparition de la lettre en question. Pour que l'applet connaisse le fichier à lire, on utilisera un paramètre "source" (voir la méthode Applet.getParameter);

Exemple d'utilisation

Pour l'entrée suivante (reference.txt):

Durant la guerre des Gaules, Cesar eut l’idee de communiquer des messages secrets a ses allies.
Sa maniere de coder les messages fait sourire aujourd’hui mais avec les Gaulois, il eut du succes…
Voici sa technique :
Le message a coder est en majuscules, par exemple « LE CIEL TOMBE ! », il peut comporter des espaces et des ponctuations.
On ne code que les lettres (minuscules et majuscules), les autres caracteres restent inchanges.
Cesar commence par choisir un nombre de l’intervalle [1,25], par exemple 3.
Ce nombre sera le decalage.
Il change chaque lettre du message par la lettre situee 3 crans plus loin dans l’alphabet.
Par exemple, A devient D, et E devient H.
Il obtient alors le message code « OH FLHO WRPEH ! ».

la commande

java CodeurCesar code reference.txt reference.code.txt 3

produit le fichier suivant (reference.code.txt):

GXUDQW OD JXHUUH GHV JDXOHV, FHVDU HXW O’LGHH GH FRPPXQLTXHU GHV PHVVDJHV VHFUHWV D VHV DOOLHV. 
VD PDQLHUH GH FRGHU OHV PHVVDJHV IDLW VRXULUH DXMRXUG’KXL PDLV DYHF OHV JDXORLV, LO HXW GX VXFFHV… 
YRLFL VD WHFKQLTXH :
OH PHVVDJH D FRGHU HVW HQ PDMXVFXOHV, SDU HAHPSOH « OH FLHO WRPEH ! », LO SHXW FRPSRUWHU GHV HVSDFHV HW GHV SRQFWXDWLRQV. 
RQ QH FRGH TXH OHV OHWWUHV (PLQXVFXOHV HW PDMXVFXOHV), OHV DXWUHV FDUDFWHUHV UHVWHQW LQFKDQJHV. 
FHVDU FRPPHQFH SDU FKRLVLU XQ QRPEUH GH O’LQWHUYDOOH [1,25], SDU HAHPSOH 3. 
FH QRPEUH VHUD OH GHFDODJH. 
LO FKDQJH FKDTXH OHWWUH GX PHVVDJH SDU OD OHWWUH VLWXHH 3 FUDQV SOXV ORLQ GDQV O’DOSKDEHW. 
SDU HAHPSOH, D GHYLHQW G, HW H GHYLHQW K. 
LO REWLHQW DORUV OH PHVVDJH FRGH « RK IOKR ZUSHK ! ».

 La commande : 

java AnalyseFrequentielle reference.txt

produit le fichier suivant (reference.csv):

A;47;0.08407871198568873
B;5;0.008944543828264758
C;31;0.055456171735241505
D;21;0.03756708407871199
E;109;0.19499105545617174
F;2;0.0035778175313059034
G;11;0.01967799642218247
H;11;0.01967799642218247
I;28;0.05008944543828265
J;3;0.005366726296958855
K;0;0.0
L;39;0.06976744186046512
M;21;0.03756708407871199
N;25;0.044722719141323794
O;24;0.04293381037567084
P;15;0.026833631484794274
Q;4;0.007155635062611807
R;35;0.0626118067978533
S;57;0.10196779964221825
T;32;0.057245080500894455
U;30;0.05366726296958855
V;5;0.008944543828264758
W;1;0.0017889087656529517
X;3;0.005366726296958855
Y;0;0.0
Z;0;0.0

 La commande 

appletviewer BarChart.html

donne le résultat suivant

BarChart.PNG

alors que l'analyse fréquentielle sur le fichier codé avec César fait apparaître un pique sur le H laissant penser que la clé utilisée est 3:

BarChartCode.PNG