Vous êtes sur la page 1sur 8

2022-2023 TP n° 4 (2 heures) Informatique

Cryptographie

I Révision des techniques de base


Dans la suite, t désigne un tableau de nombres entiers, de type list.
Q1 Écrire une fonction mini(t) qui renvoie le plus petit élément de t.
Q2 Écrire une fonction maxi_nb_chiffres(t) qui renvoie le plus grand nombre de chiffres
d’un élément de t. Si t est vide, la fonction renvoie 0.
Par exemple, maxi_nb_chiffres([10,400,7,3,89876,9]) renvoie 5 car 89876 est com-
posé de 5 chiffres (on rappelle que str(n) est la chaîne de caractères donnant l’écriture
décimale de n).
Q3 Écrire une fonction consecutifs(t) qui renvoie True s’il existe deux éléments de t qui
sont des entiers consécutifs.
Par exemple consecutifs([1,4,7,3,8]) doit renvoyer True car 4 et 3 sont consécutifs
et consecutifs([1,7,3,12,9]) doit renvoyer False.
Q4 Un entier naturel n non nul admet une écriture décimale à p chiffres si

10p−1 ≤n< 10p


plus petit à p chiffres plus petit à p+1 chiffres

Écrire une fonction nb_chiffres(n) qui renvoie le nombre de chiffres de l’entier n non nul
sans utiliser les chaînes de caractères.

II Cryptographie
La cryptographie est indispensable pour échanger des informations confidentielles. Autrefois
réservée aux utilisations militaires, la cryptographie s’étend maintenant aux échanges bancaires,
aux informations médicales, aux transferts de données industrielles,...Ce TP propose de réaliser
des programmes en Python, de cryptage et de décryptage de texte suivant diverses méthodes en
analysant les faiblesses des codes les plus simples.

II.1 Cryptage par le code de (Jules) César


Le code de César est peut-être l’une des toutes premières méthodes de chiffrement qui ait
existé.
La méthode est simple : il suffit de décaler toutes les lettres de l’alphabet du même nombre de
lettres. Par exemple, en choisissant un décalage de 3, le a devient le d, le b devient le e, ....,le w
devient z Pour la fin de l’alphabet, il suffit de revenir au début : le x devient a, le y devient b
et le z devient c. Tous les caractères distincts des minuscules de l’alphabet restent identiques
à eux mêmes dans ce codage. Ainsi un message comme ”zoé aime l’informatique” devient par
décalage d’une lettre ”apé bjnf m’jogpsnbujrvf". (les caractères espace, apostrophe et e accentué
sont inchangés).
Dans la suite, on définira dans les fonctions qui le nécessitent la chaîne de caractères ’abcdef-
ghijklmnopqrstuvwxyz’ qu’on appellera alphabet.
Q5 Écrire une fonction position(x,s) d’argument un caractère x qui renvoie la première
position de x dans la chaîne de caractères s parcourue de gauche à droite. Cette fonction
renverra −1 si x n’est pas élément de s.
Par exemple, position('a',alphabet) doit renvoyer 0, position('d',alphabet) doit

Lycée Michelet - CPGE 1re année 1


2022-2023 TP n° 4 (2 heures) Informatique

renvoyer 3, position('é',alphabet) doit renvoyer -1 et position('a',"alphabet") doit


renvoyer 0.
Q6 On veut écrire une fonction decalage(x,n) qui renvoie le caractère obtenu du caractère x,
que l’on supposera être dans alphabet, en le décalant de n dans la chaîne alphabet. On
voudrait par exemple que decalage('d',3) renvoie ’g’, decalage('z',3) renvoie ’c’. On
voudrait aussi prendre en compte des décalages négatifs (correspondant à un décalage vers
la gauche) de sorte que, par exemple, decalage('g',-3) renvoie ’d’ et decalage('c',-3)
renvoie ’z’.
Si i est la position du caractère x à décaler de n, la valeur i + n n’appartient pas nécessai-
rement à l’intervalle J0, 25K des positions possibles des caractères dans la chaîne alphabet.
Quelle opération arithmétique permet de ramener cette valeur i + n dans l’intervalle J0, 25K ?
Écrire une fonction decalage(x,n).
Q7 Écrire une fonction codage(texte,n) d’arguments un entier n et une chaîne de caractères
texte qui renvoie la chaîne obtenue de texte par codage de César avec un décalage de n
lettres (seuls les caractères minuscules de l’alphabet latin subissent une modification).
Tester la fonction codage sur un texte de votre choix.

II.2 Décryptage du code de César


Q8 Expliquer pourquoi il suffit de connaître le codage d’un unique caractère pour décoder un
texte codé avec le code de César.
Q9 Écrire une fonction nombre_occurences(texte,x) qui renvoie le nombre de caractères x
dans la chaîne de caractères texte.
Q10 Écrire une fonction plus_frequent(texte) qui renvoie le caractère de l’alphabet le plus
fréquent dans texte (ou l’un des plus fréquents en cas d’ex-aequos). La lettre la plus
fréquente de la langue française est le ’e’. Quelle devrait être le caractère le plus fréquent
dans le texte codé ?
Q11 Écrire une fonction decryptage(code) qui, en supposant que code est le résultat du codage
de César, renvoie la chaîne de caractères décodée. Cette fonction ne pourra s’appliquer
avec un résultat correct que lorsque, dans le message à coder, le caractère ’e’ est le plus
fréquent, ce qui est le cas dès que le message est suffisamment long (et n’a pas été écrit avec
l’intention d’échapper à cette règle comme le roman "La disparition" de Georges Perec).
Q12 Copier-coller un texte assez long pour définir une chaîne de caractères dans votre éditeur
Python. Effectuer un codage de ce texte avec la fonction codage avec un décalage tiré au
hasard. Utiliser la fonction decryptage pour retrouver le texte initial. Pour le tirage au
hasard :

import random
n=random.randint(0,25) # n est un entier tiré au hasard entre 0 et 25 inclus

II.3 Cryptage par substitution mono-alphabétique


Le codage par substitution mono-alphabétique consiste à remplacer chaque lettre par une
lettre différente. Par exemple, en utilisant la table de substitution suivante :

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
w x e h y z t k c p j i u a d g l q m n r s f v b o

le message ’il fait beau’ sera codé par ’ci zwcn xywr’.

Lycée Michelet - CPGE 1re année 2


2022-2023 TP n° 4 (2 heures) Informatique

Pour effectuer un tel codage, on a besoin de la chaîne de caractères ’wxehyztkcpjiuadglqmnrsfvbo’


qui indique comment se fait la substitution. On convient de ne coder que les lettres minuscules
du message de l’alphabet latin non accentués. Les autres lettres ou caractères seront conservés.
Q13 Écrire une fonction codage_substitution(texte,substitution) qui renvoie le résultat
du codage par substitution de la chaîne de caractères texte à partir d’une substitution
alphabétique de la chaîne de caractères alphabet.
Q14 La personne qui a reçu le texte codé connaît la substitution alphabétique qui a permis de
coder le texte. Aidons la à retrouver le texte original.
Écrire une fonction decryptage_substitution(code,substitution) qui renvoie le texte
original si code est le résultat du codage par substitution fait avec la substitution alphabé-
tique de la chaîne de caractères alphabet.

II.4 Le chiffre de Vigenère


Pour pallier la faiblesse du code de César, Le diplomate français du XVIe siècle Blaise de
Vigenère eu l’idée d’utiliser un chiffre de César, mais avec un décalage qui change de lettre en
lettre grâce à une clé (un mot de longueur arbitraire). Pour coder un message, on décale chaque
lettre du message par le même décalage qui fait passer la lettre ’a’ à la lettre correspondante de
la clé écrite sous le message (et répétée autant de fois que nécessaire).

Exemple 1. La table suivante illustre le codage "lechiffrementestutile" à l’aide de la clé "azerty"

Message l e c h i f f r e m e n t e s t u t i l e
Clé a z e r t y a z e r t y a z e r t y a z e
+25
Décalage 0 +4 -9 -7 -2 0 -1 +4 -9 -7 -2 0 -1 +4 -9 -7 -2 0 -1 +4
(-1)
Code l d g y b d f q i d x l t d w k n r i k i

Q15 Programmer ce chiffrement.

Lycée Michelet - CPGE 1re année 3


2022-2023 TP n° 4 (2 heures) Informatique

Lycée Michelet - CPGE 1re année 4


2022-2023 TP n° 4 (2 heures) Informatique

Corrigé
Q1
2 def mini ( t ) :
3 assert t != [] , " tableau vide "
4 minimum = t [0]
5 for i in range (1 , len ( t ) ) :
6 if t [ i ] < minimum :
7 minimum = t [ i ]
8 return minimum
9

10 t = [3 ,4 ,23 ,2 ,6]; assert mini ( t ) == 2

Q2
13 def maxi_nb_chiffres ( t ) :
14 nb = 0
15 for i in range ( len ( t ) ) :
16 s = str ( t [ i ])
17 if len ( s ) > nb :
18 nb = len ( s )
19 return nb
20
21 t = []; assert maxi_nb_chiffres ( t ) == 0
22 t = [1 ,4 ,7 ,3 ,9]; assert maxi_nb_chiffres ( t ) == 1
23 t = [10 ,400 ,7 ,3 ,89876 ,9]; assert maxi_nb_chiffres ( t ) == 5

Q3
26 def consecutifs ( t ) :
27 for i in range ( len ( t ) ) :
28 for j in range ( len ( t ) ) : # boucle imbriqu é e
29 if t [ j ] == t [ i ]+1:
30 return True
31 return False
32
33 t = []; assert consecutifs ( t ) == False
34 t = [1 ,4 ,7 ,3 ,18 ,20]; assert consecutifs ( t ) == True
35 t = [1 ,7 ,3 ,12 ,9]; assert consecutifs ( t ) == False

Q4
38 def nb_chiffres ( n ) :
39 p = 1
40 P = 10
41 while P <= n :
42 p = p + 1
43 P = P * 10
44 return p
45
46 n = 0; assert nb_chiffres ( n ) == 1
47 n = 1; assert nb_chiffres ( n ) == 1
48 n = 9; assert nb_chiffres ( n ) == 1
49 n = 10; assert nb_chiffres ( n ) == 2
50 n = 99; assert nb_chiffres ( n ) == 2
51 n = 100; assert nb_chiffres ( n ) == 3
52 n = 2345; assert nb_chiffres ( n ) == 4

Lycée Michelet - CPGE 1re année 5


2022-2023 TP n° 4 (2 heures) Informatique

Q5
55 alphabet = " 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 "
56

57 def position (x , s ) :
58 for i in range ( len ( s ) ) :
59 if x == s [ i ]:
60 return i
61 return -1
62

63 x = 'a '; assert position (x , alphabet ) == 0


64 x = 'd '; assert position (x , alphabet ) == 3
65 x = 'é '; assert position (x , alphabet ) == -1

Q6
68 def decalage (x , n ) :
69 return alphabet [( position (x , alphabet ) + n ) %26]
70
71 x , n = 'd ' ,3; assert decalage (x , n ) == 'g '
72 x , n = 'z ' ,3; assert decalage (x , n ) == 'c '
73 x , n = 'g ' , -3; assert decalage (x , n ) == 'd '
74 x , n = 'c ' , -3; assert decalage (x , n ) == 'z '

Q7
77 def codage ( texte , n ) :
78 s = ''
79 for i in range ( len ( texte ) ) : # on parcourt tout le texte en clair ,
lettre par lettre
80 if position ( texte [ i ] , alphabet ) == -1:
81 s += texte [ i ] # on laisse tels quels les caract è res sp é ciaux
82 else :
83 s += decalage ( texte [ i ] , n ) # on d é cale les minuscules de n
84 return s
85
86 texte , n = " zo é aime l ' informatique " ,1
87 print ( " On consid è re le texte suivant : " , texte )
88 assert codage ( texte , n ) == " ap é bjnf m ' jogpsnbujrvf "

Q8 Si on sait par exemple que ’a’ est codé en ’f’, alors on sait que le décalage est +5. Pour
décoder, il suffira de décaler chaque lettre du texte codé de -5.
Q9
93 def n ombre_ occur ences ( texte , x ) :
94 nb = 0
95 for i in range ( len ( texte ) ) :
96 if x == texte [ i ]:
97 nb += 1
98 return nb
99

100 texte , x = " zo é aime l ' informatique " , 'i '


101 assert no mbre_o ccuren ces ( texte , x ) == 3
102
103 texte , x = " zo é aime l ' informatique " , 'a '
104 assert no mbre_o ccuren ces ( texte , x ) == 2
105
106 texte , x = " zo é aime l ' informatique " , 'z '
107 assert no mbre_o ccuren ces ( texte , x ) == 1
108
109 texte , x = " zo é aime l ' informatique " , 'k '
110 assert no mbre_o ccuren ces ( texte , x ) == 0

Lycée Michelet - CPGE 1re année 6


2022-2023 TP n° 4 (2 heures) Informatique

Q10
113 def plus_frequent ( texte ) :
114 caractere_max , max = 'a ' , no mbre_o ccuren ces ( texte , 'a ')
115 for i in range (1 , len ( alphabet ) ) : # on parcourt toutes les lettres de
' alphabet ' ( sauf la lettre 'a ' qui sert à l ' initialisation )
116 nb = no mbre_o ccuren ces ( texte , alphabet [ i ]) # on d é termine combien
de fois une lettre donn é e appara î t dans le texte
117 if nb > max : # si elle appara î t plus souvent que le maximum
courant , la lettre devient le ' caractere_max '
118 caractere_max = alphabet [ i ]
119 max = nb
120 return caractere_max
121
122 texte = " zo é aime l ' informatique "
123 assert plus_frequent ( texte ) == 'i '

La lettre la plus fréquente de la langue française est le e. Le caractère le plus fréquent dans
le texte codé devrait être le caractère obtenu en décalant le ’e’. Bien sûr, cela ne s’applique
qu’avec un texte assez long, ce qui n’est pas le cas avec le texte "zoé aime l’informatique".
Q11
126 def decryptage ( code ) :
127 caractere_max = plus_frequent ( code ) # on assimile le caract è re le
plus fr é quent à 'e '
128 n = position ( caractere_max , alphabet ) - position ( 'e ' , alphabet )
129
130 s = ''
131 for i in range ( len ( code ) ) : # on parcourt tout le texte cod é , lettre
par lettre
132 if position ( code [ i ] , alphabet ) == -1:
133 s += code [ i ] # on laisse tels quels les caract è res sp é ciaux
134 else :
135 s += decalage ( code [ i ] , - n ) # on d é cale les minuscules de -n
136 return s

Q12
139 from random import randint
140
141 texte , n = " J ' ai trop saign é sur les Gibson . J ' ai trop rod é dans les
Tobacco road . Il n 'y a plus que les caisses qui me r é sonnent . Et
quand je me casse je voyage toujours en fraude . Des champs de coton
dans ma m é moire . Trois notes de blues , c ' est un peu d ' amour noir .
Quand je suis trop court , quand je suis trop tard . C ' est un recours
pour une autre histoire . Quand la musique est bonne . Quand la musique
donne . Quand la musique sonne , sonne , sonne . Quand elle ne triche
pas . Quand elle guide mes pas . J ' ai plus d ' amour , j ' ai pas le temps .
J ' ai plus d ' humour , je ne sais plus d 'o ù vient le vent . J ' ai plus qu '
un clou , une é tincelle . Des trucs en plomb qui me brisent les ailes .
Un peu de swing , un peu du King . Pas mal de feeling et de d é cibels . C
' est pas l ' usine , c ' est pas la mine . Mais ç a suffit pour se faire la
belle . Quand la musique est bonne . Quand la musique donne . Quand la
musique sonne , sonne , sonne Quand elle ne triche pas . Quand la
musique est bonne . Quand la musique donne . Quand la musique sonne ,
sonne , sonne . Quand elle guide mes pas . " , randint (1 ,26)
142
143 code = codage ( texte , n )
144 print ( " \ nLe texte cod é avec un d é calage de " ,n , " caract è res est : " , code )
145 print ( " \ nLe texte d é cod é est : " , decryptage ( code ) )

Lycée Michelet - CPGE 1re année 7


2022-2023 TP n° 4 (2 heures) Informatique

Q13
148 alphabet = " 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 "
149 substitution = " w x e h y z t k c p j i u a d g l q m n r s f v b o "
150

151 def c o da g e _s u b st i t ut i o n ( texte , substitution ) :


152 s = ''
153 for i in range ( len ( texte ) ) :
154 idx = position ( texte [ i ] , alphabet )
155 if idx == -1:
156 s += texte [ i ] # on laisse tels quels les caract è res sp é ciaux
157 else : # la lettre d ' indice i dans ' alphabet ' devient la lettre d
' indice i dans ' substitution '.
158 s += substitution [ idx ]
159 return s

Q14
162 def d e c r y p t a g e _ s u b s t i t u t i o n ( code , substitution ) :
163 s = ''
164 for i in range ( len ( code ) ) :
165 idx = position ( code [ i ] , substitution )
166 if idx == -1:
167 s += code [ i ] # on laisse tels quels les caract è res sp é ciaux
168 else : # on r é cup è re l ' indice correspondant à la lettre du texte
dans le tableau ' substitution '; cet indice est associ é à la lettre
non chiffr é e dans ' alphabet '
169 s += alphabet [ idx ]
170 return s
171

172 texte = " il fait beau , n 'est - il pas ? "


173 code = c od a g e_ s u bs t i tu t i on ( texte , substitution )
174 print ( " \ nLe texte cod é par substitution mono - alphab é tique est : " , code )
175 print ( " \ nLe texte d é cod é est : " , d e c r y p t a g e _ s u b s t i t u t i o n ( code ,
substitution ) )

Q15
178 alphabet = " 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 "
179
180 def d ecalag e_Vig enere (x ,i , cle ) :
181 '''d é cale la lettre x , positionn é e en i dans le texte en clair , par
la m é thode de Vigen è re '''
182 l = len ( cle )
183 j = i % l # j permet de d é terminer la lettre de la cl é que l ' on va
utiliser pour le d é calage ( il s ' agit de son indice dans le mot cl é )
lors d ' une superposition r é p é titive de la cl é sur le texte initial
184 n = position ( cle [ j ] , alphabet ) # est la position de la lettre de la
cl é dans l ' alphabet
185 return decalage (x , n )
186
187 def codage_Vigenere ( texte , cle ) :
188 s = ''
189 for i in range ( len ( texte ) ) :
190 if position ( texte [ i ] , alphabet ) == -1:
191 s += texte [ i ] # on laisse tels quels les caract è res sp é ciaux
192 else :
193 s += decal age_Vi gener e ( texte [ i ] ,i , cle )
194 return s
195
196 texte = " l e c h i f f r e m e n t e s t u t i l e "
197 cle = " azerty "
198 assert codage_Vigenere ( texte , cle ) == " l d g y b d f q i d x l t d w k n r i k i "

Lycée Michelet - CPGE 1re année 8

Vous aimerez peut-être aussi