2. TP - Travail sur les chaînes et Cryptographie



2.1. Introduction

On cherche à crypter (on dit également chiffrer) un message en utilisant le code César qui consiste en un décalage de l'alphabet de $n$ lettres. Par exemple, un code $cesar$ avec un décalage de $+3$, implique que :

 Indice   1   2   3   4   5   ...   23   24   25   26 
 Alphabet   A   B   C   D   E   ...   W   X   Y   Z 
 César + 3   D   E   F   G   H   ...   Z   A   B   C 
Codage avec décalage de 3 caractères

2.2. Chiffrement César

Exercice 2.1

Ecrire un programme crypto.py et une fonction cesar(chn, n) -> str qui à partir du'une chaine $chn$ et du décalage $n$ retourne la chaine codée suivant le code César avec décalage de $n$ caractères.

On prendra soin de garder les espaces et la ponctuation.

On rappelle qu'il existe en Python une fonction ord(car) qui donne le code Unicode (ASCII/UTF-8) d'un caractère passé en paramètre. Elle fait partie des fonctions natives.

Exercice 2.2

Affichez pour les 26 possibilités de codage (décalage de 0 à 25) le chiffrement de la phrase "Bonjour jeunes programmeurs". On fera en sorte de transformer la chaîne initiale en majuscules. Vous devez obtenir le résultat suivant :

0 BONJOUR JEUNES PROGRAMMEURS
1 CPOKPVS KFVOFT QSPHSBNNFVST
2 DQPLQWT LGWPGU RTQITCOOGWTU
3 ERQMRXU MHXQHV SURJUDPPHXUV
4 FSRNSYV NIYRIW TVSKVEQQIYVW
5 GTSOTZW OJZSJX UWTLWFRRJZWX
6 HUTPUAX PKATKY VXUMXGSSKAXY
7 IVUQVBY QLBULZ WYVNYHTTLBYZ
8 JWVRWCZ RMCVMA XZWOZIUUMCZA
9 KXWSXDA SNDWNB YAXPAJVVNDAB
10 LYXTYEB TOEXOC ZBYQBKWWOEBC
11 MZYUZFC UPFYPD ACZRCLXXPFCD
12 NAZVAGD VQGZQE BDASDMYYQGDE
13 OBAWBHE WRHARF CEBTENZZRHEF
14 PCBXCIF XSIBSG DFCUFOAASIFG
15 QDCYDJG YTJCTH EGDVGPBBTJGH
16 REDZEKH ZUKDUI FHEWHQCCUKHI
17 SFEAFLI AVLEVJ GIFXIRDDVLIJ
18 TGFBGMJ BWMFWK HJGYJSEEWMJK
19 UHGCHNK CXNGXL IKHZKTFFXNKL
20 VIHDIOL DYOHYM JLIALUGGYOLM
21 WJIEJPM EZPIZN KMJBMVHHZPMN
22 XKJFKQN FAQJAO LNKCNWIIAQNO
23 YLKGLRO GBRKBP MOLDOXJJBROP
24 ZMLHMSP HCSLCQ NPMEPYKKCSPQ
25 ANMINTQ IDTMDR OQNFQZLLDTQR

Exercice 2.3

Trouvez quel est le décalage lié au message suivant : "KXWWN JWWNN !" en utilisant la fonction cesar(chn, n) créée précédemment.

2.3. Chiffrement Vigenère (Blaise, 1523-1596)

Dans le cas de Vigenère on part d'une matrice de 26 par 26 lettres comme par exemple la classique matrice :

  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 
 A ABCDEFGHIJKLMNOPQRSTUVWXYZ
 B BCDEFGHIJKLMNOPQRSTUVWXYZA
 C CDEFGHIJKLMNOPQRSTUVWXYZAB
 D DEFGHIJKLMNOPQRSTUVWXYZABC
 E EFGHIJKLMNOPQRSTUVWXYZABCD
 F FGHIJKLMNOPQRSTUVWXYZABCDE
 G GHIJKLMNOPQRSTUVWXYZABCDEF
 H HIJKLMNOPQRSTUVWXYZABCDEFG
 I IJKLMNOPQRSTUVWXYZABCDEFGH
 J JKLMNOPQRSTUVWXYZABCDEFGHI
 K KLMNOPQRSTUVWXYZABCDEFGHIJ
 L LMNOPQRSTUVWXYZABCDEFGHIJK
 M MNOPQRSTUVWXYZABCDEFGHIJKL
 N NOPQRSTUVWXYZABCDEFGHIJKLM
 O OPQRSTUVWXYZABCDEFGHIJKLMN
 P PQRSTUVWXYZABCDEFGHIJKLMNO
 Q QRSTUVWXYZABCDEFGHIJKLMNOP
 R RSTUVWXYZABCDEFGHIJKLMNOPQ
 S STUVWXYZABCDEFGHIJKLMNOPQR
 T TUVWXYZABCDEFGHIJKLMNOPQRS
 U UVWXYZABCDEFGHIJKLMNOPQRST
 V VWXYZABCDEFGHIJKLMNOPQRSTU
 W WXYZABCDEFGHIJKLMNOPQRSTUV
 X XYZABCDEFGHIJKLMNOPQRSTUVW
 Y YZABCDEFGHIJKLMNOPQRSTUVWX
 Z ZABCDEFGHIJKLMNOPQRSTUVWXY

Cette matrice correspond pour A à un chiffrement César avec décalage de 0, pour B à un chiffrement César avec décalage de 1, ..., pour Z à un chiffrement César avec décalage de 25.

Pour chiffrer un message on utilise une clé de codage qui correspond à un mot, comme par exemple CODAGE.

Dès lors, pour coder une phrase, comme par exemple "LES FRANCAIS", on utilise le code César correspondant au parcours cyclique du mot clé CODAGE :

 Lettre  Clé  Vigenère 
LCN
EOS
SDV
  
FAF
RGX
AEE
NCP
COQ
ADD
IAI
SGY

Au final, on obtient le chiffrement "NSV FXEPQDIY" et pour rendre le chiffrement plus difficile à décoder on peut supprimer les espaces.

Exercice 2.4

Ajouter une fonction vigenere(chn, cle) -> str qui à partir d'une chaine $chn$ et de la clé $cle$ retourne la chaine codée suivant le chiffrement Vigenère avec la matrice donnée.

On gardera les espaces et la ponctuation.

Exercice 2.5

A partir du message "les francais" et de la clé "CODAGE" essayez d'obtenir le message chiffré "NSV FXEPQDIY" en faisant appel à la fonction vigenere(chn, cle). On transformera le message en majuscule au préalable.

Exercice 2.6

A partir du message chiffré "KZ RMEKH HGI HCVL YPS CXXKHR YMNZR TTRSYXI DCHVPG R'BK", trouvez quelle clé a été utilisée pour chiffrer le message parmi les clés suivantes : "PYRAMYDE", "GNOU", "LINUX", "CONTE", "CRYPTO", "ZIDANE".

Il faudra probablement écrire une fonction devigenere(chn, cle) -> str qui fait l'inverse de vigenere(chn, cle)

2.4. Chiffrement Vigenère fichier

Exercice 2.7

Pour ceux qui ont encore du temps, chiffrer le fichier fichier_a_encoder.txt en utilisant la clé "VILLAGE" et afficher le résultat du chiffrement.