Dossier Cryptographie : Partie 1
Comme son nom l'indique, cet article aura pour
thème la cryptographie. J'ai mis partie 1 car il y aura peut-être
une suite dans lotfree#4 (ya des chances ;-).
Certains passeront directement à l'article suivant rien qu'à la
vue du mot cryptographie, pourtant c'est un domaine très vaste et qui
est utilisé de façon automatique aujourd'hui. C'est bien simple,
on crypte tout : vos cookies, vos transactions et même votre quatrième
chaine de tv.
La cryptographie tient plus du domaine des mathématiques que de l'informatique
pourtant sans l'informatique la cryptographie serait rien : imaginez décoder
une page entière sans utiliser un prog qui fait le travail à votre
place, ça peut prendre des heures.
La cryptographie peut vous être utile si vous avez peur que quelqu'un
intercepte vos données, ou lise vos mails. (au cas où l'admin
de votre bahut ne vous tient pas dans son cur ;-)
Aujourd'hui je vais vous faire découvrir (ou pas) la méthode de
Vigenere (le carre de Vigenere) mais on va aussi voir ses dérivés
(plus évolués). Mais vous allez voir c'est très facile.
Vigenere est une des méthodes de
cryptographie utilisant une clé que seul le destinataire et l'envoyeur
du message doivent connaitre. Ils n'utilisent pas tous ce système qui
semble pourtant naturel (si vous avez lu l'article qui suit vous savez déjà
que la base64 n'a pas de clé).
Bon on a donc une clé et un message a crypter. On agit lettre par lettre
(avec la première lettre de la clé et la première lettre
de la phrase à crypter on obtient la première lettre de la phrase
cryptée et ainsi de suite). L'algorithme utilisé est une addition
basée sur l'alphabet. Chaque lettre a une valeur, c'est à dire
que A vaut 0, B vaut 1, C vaut 2 ... Z vaut 25.
Ainsi A+A=0+0=0=A. Comme A vaut 0 tout lettre crypté
avec A vaudra elle même. Un autre exemple : S+B = 18 + 1 = 19=T.
Dernier exemple : Y + K = 24+10=34. On est sorti del'aphabet (on s'arrête
à 25) alors on revient au début.
On fait 34 divisé par 26 ça y va 1 fois il reste 8 soit la lettre
I. (on a fait un tour de boucle : 25 est Z, donc 26 est A, en gros 26 vaut 0).
On utilise donc le reste de la division entière (division euclidienne)
aussi appelé modulo (ici on fait un modulo 26).
K (key) A B C D E F G H I J K L M N O P Q R S T U V W X Y Z (plaintext) ------- --------------------------------------------------- P A A B C D E F G H I J K L M N O P Q R S T U V W X Y Z B B C D E F G H I J K L M N O P Q R S T U V W X Y Z A C C D E F G H I J K L M N O P Q R S T U V W X Y Z A B D D E F G H I J K L M N O P Q R S T U V W X Y Z A B C E E F G H I J K L M N O P Q R S T U V W X Y Z A B C D F F G H I J K L M N O P Q R S T U V W X Y Z A B C D E G G H I J K L M N O P Q R S T U V W X Y Z A B C D E F H H I J K L M N O P Q R S T U V W X Y Z A B C D E F G I I J K L M N O P Q R S T U V W X Y Z A B C D E F G H J J K L M N O P Q R S T U V W X Y Z A B C D E F G H I K K L M N O P Q R S T U V W X Y Z A B C D E F G H I J L L M N O P Q R S T U V W X Y Z A B C D E F G H I J K M M N O P Q R S T U V W X Y Z A B C D E F G H I J K L ciphertext N N O P Q R S T U V W X Y Z A B C D E F G H I J K L M C O O P Q R S T U V W X Y Z A B C D E F G H I J K L M N P P Q R S T U V W X Y Z A B C D E F G H I J K L M N O Q Q R S T U V W X Y Z A B C D E F G H I J K L M N O P R R S T U V W X Y Z A B C D E F G H I J K L M N O P Q S S T U V W X Y Z A B C D E F G H I J K L M N O P Q R T T U V W X Y Z A B C D E F G H I J K L M N O P Q R S U U V W X Y Z A B C D E F G H I J K L M N O P Q R S T V V W X Y Z A B C D E F G H I J K L M N O P Q R S T U W W X Y Z A B C D E F G H I J K L M N O P Q R S T U V X X Y Z A B C D E F G H I J K L M N O P Q R S T U V W Y Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Z Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
Souvent la cle est un mot, dans tous les cas elle est souvent
plus petite que la phrase à crypter. Alors pour crypter la phrase Vigenere
a eu l'idée de répéter la clé plusieurs fois.
Si la clé est lotfree et la phrase à crypter est "la cryptographie
c'est cool", on aura :
Clé : L O T F R E E L O T F R E E L O T F R E E L O Phrase : L A C R Y P T O G R A P H I E C E S T C O O L Résultat: W O V W P T X Z U K F G L M P Q X X K G S Z Z
Et pour déchiffrer c'est pas plus difficile : on reprend
l'exemple du Y et du K. On regarde dans la ligne (ou la colonne) de la lettre
K et on cherche la lettre I dans cette ligne. On remonte... On est dans la colonne
des Y, c'est bon. Peut importe que vous prenez les lignes ou les colonnes.
Il y a plus simple pour crypter/decrypter avec cette méthode, c'est en
utilisant les blocs :
Clé : L O T F R E E Phrase : L A C R Y P T Résultat : W O V W P T X O G R A P H I Z U K F G L M E C E S T C O P Q X X K G S O L Z Z
Maintenant, la méthode Variant : seul le carré change, il faut par contre respecter les colonnes et les lignes :
K (key) A B C D E F G H I J K L M N O P Q R S T U V W X Y Z (plaintext)
------- --------------------------------------------------- P
A A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Z B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
Y C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
X D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
W E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
V F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
U G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
T H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
S I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
R J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
Q K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
P L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
O M N O P Q R S T U V W X Y Z A B C D E F G H I J K L ciphertext
N N O P Q R S T U V W X Y Z A B C D E F G H I J K L M C
M O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
L P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
K Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
J R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
I S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
H T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
G U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
F V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
E W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
D X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
C Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
B Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
Donc ici si la clé est K et que l'on veut crypter Y on obtient O. Pour décrypter on a K comme clé et O comme résultat. On cherche O sur la ligne de K, on remonte, on tombe sur Y.
Je vous présente aussi la méthode Beaufort :
K (key) A B C D E F G H I J K L M N O P Q R S T U V W X Y Z (plaintext)
------- --------------------------------------------------- P
Z Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
Y Y X W V U T S R Q P O N M L K J I H G F E D C B A Z
X X W V U T S R Q P O N M L K J I H G F E D C B A Z Y
W W V U T S R Q P O N M L K J I H G F E D C B A Z Y X
V V U T S R Q P O N M L K J I H G F E D C B A Z Y X W
U U T S R Q P O N M L K J I H G F E D C B A Z Y X W V
T T S R Q P O N M L K J I H G F E D C B A Z Y X W V U
S S R Q P O N M L K J I H G F E D C B A Z Y X W V U T
R R Q P O N M L K J I H G F E D C B A Z Y X W V U T S
Q Q P O N M L K J I H G F E D C B A Z Y X W V U T S R
P P O N M L K J I H G F E D C B A Z Y X W V U T S R Q
O O N M L K J I H G F E D C B A Z Y X W V U T S R Q P
N N M L K J I H G F E D C B A Z Y X W V U T S R Q P 0 ciphertext
M M L K J I H G F E D C B A Z Y X W V U T S R Q P 0 N C
L L K J I H G F E D C B A Z Y X W V U T S R Q P 0 N M
K K J I H G F E D C B A Z Y X W V U T S R Q P 0 N M L
J J I H G F E D C B A Z Y X W V U T S R Q P 0 N M L K
I I H G F E D C B A Z Y X W V U T S R Q P 0 N M L K J
H H G F E D C B A Z Y X W V U T S R Q P 0 N M L K J I
G G F E D C B A Z Y X W V U T S R Q P 0 N M L K J I H
F F E D C B A Z Y X W V U T S R Q P 0 N M L K J I H G
E E D C B A Z Y X W V U T S R Q P 0 N M L K J I H G F
D D C B A Z Y X W V U T S R Q P 0 N M L K J I H G F E
C C B A Z Y X W V U T S R Q P 0 N M L K J I H G F E D
B B A Z Y X W V U T S R Q P 0 N M L K J I H G F E D C
A A Z Y X W V U T S R Q P 0 N M L K J I H G F E D C B
Voilà, pas de commentaires.
Il y a aussi la façon de découper la phrase qui entre en jeu, par exemple la méthode slidefair consiste a découper par paire de lettres. Exemple :
Key = DIGRAPH
Phrase : the Slidefair can be used with Vigenere, Variant or Beaufort.
K = | D I G R A P H ------------------------------- P = | th es li de fa ir ca C = | EW KM CR NU AF CX TJ | nb eu se dw it hv ig | YQ MM YY FU TI GW ZP | en er ev ar ia nt or | KH JM PK BS AI EC KV | be au fo rt | CF MI IL CI
C: EW KM CR NU AF CX TJ YQ MM YY FU TI GW ZP KH JM PK BS AI EC KV CF MI IL CI
La méthode Interrupted key utilise un découpage par mots. Bref il y a pas mal de possibilitées : toutes les x lettres, tous les x mots, les x syllabes, ou en alternant 1 lettre / 2 lettres...
La méthode dérivée que je trouve la mieux est la Autokey, que je vous ai gardé pour la fin. Elle consiste à utiliser la phrase à crypter comme clé. Mais il y a toujours une vrai clé. On a vu qu'avec Vigenere on répétait la clé jusqu'à ce que le cryptage soit terminé. Ici la clé est la concaténation (l'accrochage) d'elle même avec la phrase à crypter. Voici un exemple :
Phrase : The autokey can be used with Vigenere, Variant or Beaufort.
Clé : PRIMER
Clé : P R I M E R T H E A U T O K E Y C A N B E U S E D W I T H V I G E N E R E V A R I A N T O R B E Phrase : t h e a u t o k e y c a n b e u s e d w i t h v i g e n e r e v a r i a n t o r b e a u f o r t Résultat : I Y M M Y K H R I Y W T B L I S U E Q X M N Z Z L C M G L M M B E E M R R O O I J E N N T F S X
Pour l'encryption il n'y a pas de problèmes, en revanche pour décrypter on découvre la clé en même temps que la phrase. Le problème c'est que si on se trompe une fois après tout le reste est faux. Mais cette méthode est plus intéressante.
Histoire de vous gater je vous ai codé un petit prog en Pascal (parce qu'en C++ la gestion des chaines de caractères c pas super facile) qui utilise la méthode autokey. Il crypte et décrypte ce que vous entrez au clavier. Si vous savez programmer vous pouvez l'améliorer pour la lecture de fichier... Voici la source :
program crypto;
var key,phrase,res : string;
choix,cpt : integer;
procedure touppercase(var mot:string); var i:integer; begin for i:=1 to length(mot) do if (mot[i]>='a') and (mot[i]<='z') then ord(mot[i]):=ord(mot[i])-32; end;
function inint(var c:char):boolean; begin if (c>='A') and (c<='Z') then inint:=true else inint:=false; end;
begin {debut du main} choix:=0; res:=''; writeln('Choisissez le mode de fonctionnement :'); while ((choix<1) or (choix>2)) do begin writeln('1->Cryptage'); writeln('2->Decryptage'); write('?'); readln(choix); end; writeln('Entrez la cle : '); readln(key); writeln('Entrez la phrase : '); readln(phrase); touppercase(key); touppercase(phrase);
if choix=1 then begin key:=key+phrase; for cpt:=1 to length(phrase) do begin if ( inint(key[cpt]) and inint(phrase[cpt]) ) then begin res := res + chr( (((ord(key[cpt]) mod 65) + (ord(phrase[cpt]) mod 65)) mod 26) + 65) end else res:=res+phrase[cpt]; end; writeln('--Resultat du cryptage--'); writeln(res); end else begin for cpt:=1 to length(phrase) do begin if ( inint(key[cpt]) and inint(phrase[cpt]) ) then begin choix:=(ord(phrase[cpt]) mod 65) - (ord(key[cpt]) mod 65); if choix<0 then choix:=choix+26; res := res + chr(choix+65); end else res:=res+phrase[cpt]; key:=key+res[cpt]; end; writeln('--Resultat du decryptage--'); writeln(res); end; write('Appuyez sur entree pour quitter'); readln; end.
Le prog est joint avec le mag, c'est crypto.exe, pas de valeurs a passer comme argument, ya un menu etc... J'espère que cet article vous aura plus.