Académique Documents
Professionnel Documents
Culture Documents
Cryptographie
É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.
import random
n=random.randint(0,25) # n est un entier tiré au hasard entre 0 et 25 inclus
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’.
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
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
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
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
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
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 ) )
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
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
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 "