Informatique DS 2 : Ave Cesar (Zud Bdrzq)

Transcription

Informatique DS 2 : Ave Cesar (Zud Bdrzq)
PCSI 833
Lycée Masséna
Informatique DS 2 : Ave Cesar (Zud Bdrzq)
Calculatrices et documents interdits
Durée: 1h30
Préambule Ce sujet se compose d’exercices et d’un problème. Il y a en tout 10 questions, un barême indicatif est
de deux points par question. Dans le problème, veillez à réutiliser les fonctions précédentes lorsque c’est utile !
Le modulo. On rappelle que si a et b sont deux entiers, avec b strictement positif, a%b donne le reste de la division
euclidienne de a par b, c’est à dire l’unique entier r ∈ [[0, b − 1]] tel qu’il existe un entier q, tel que a = bq + r. On fera
un usage intensif du modulo dans le problème, en particulier avec b=26. C’est également utile pour la question 3.
1
Quelques exercices proches du cours
Question 1. Produit des éléments d’une liste. Écrire une fonction prod(L) prenant en entrée une liste et renvoyant
le produit de ses éléments. On convient que si la liste est vide, il faut renvoyer 1.
>>> prod([1,3,2,4])
24
>>> prod([])
1
Question 2. Liste renversée. Écrire une fonction renverse(L) prenant en entrée une liste, et renvoyant une nouvelle liste, dont les éléments sont les mêmes, mais en sens inverse.
>>> renverse([1,2,3,4,5])
[5, 4, 3, 2, 1]
Question 3. Écrire une fonction sdc(N,b) prenant en entrée un entier naturel N ≥ 0 et un entier b ≥ 2, et renvoyant
la somme des chiffres de N écrit dans la base b.
>>> sdc(6,2) #6 s'écrit 110 dans la base 2
2
>>> sdc(56,3) #56 s'écrit 2002 dans la base 3
4
2
Problème : Cryptanalyse du chiffrement de César
La cryptanalyse est la science du décodage des messages codés. Le principe est simple, le texte d’origine est
transformé (on parle de chiffrement) à l’aide d’une clé, qui est secrète. Quiconque possède la clé de chiffrement est
capable de déchiffrer le message. Le travail du cryptanalyste consiste à casser le chiffrement, c’est à dire découvrir la
clé de chiffrement pour retrouver le message d’origine.
On cherche à chiffrer un texte composé de caractères en minuscules (soit 26 lettres différentes) représentés par des
entiers compris entre 0 et 25, avec l’identification naturelle : 0 ↔ a, 1 ↔ b, ..., 25 ↔ z.
Ainsi, le texte lyceemassena est représenté comme la troisième ligne du tableau ci-dessous (la première ligne
représente les indices des lettres).
0
1 2
l
y c
11 24 2
3
e
4
4
e
4
5 6
m a
12 0
7
s
18
8 9
s e
18 4
10 11
n a
13 0
En Python, on utilisera simplement la liste [11, 24, 2, 4, 4, 12, 0, 18, 18, 4, 13, 0] pour représenter le
texte lyceemassena. Mis à part pour la question 5 qui porte sur un exemple, un texte à chiffrer ou à déchiffrer sera
toujours une telle liste de nombres.
Svartz
Page 1/2
2015/2016
PCSI 833
Lycée Masséna
Question 4. Une variante de la première question du DM . Écrire une fonction verifie(L) prenant en entrée une
liste L et retournant un booléen (True ou False), indiquant si L contient bien uniquement des entiers entre 0 et 25
(inclus). Pour ce faire, on pourra se contenter de vérifier que les éléments en question sont bien entre 0 et 25, on n’aura
pas besoin de vérifier que ce sont des entiers.
On suppose que le texte ne contient pas d’autres caractères que des lettres minuscules (ni espaces, ni ponctuation...).
Les listes qu’on manipulera seront constituées d’entiers entre 0 et 25, on suppose ne pas avoir besoin de le vérifier
lorsqu’on écrira une fonction prenant en entrée une telle liste. Le tableau qui suit pourra vous servir en question 5.
0
a
2.1
1
b
2
c
3
d
4
e
5
f
6
g
7
h
8
i
9
j
10 11 12
k
l m
13 14 15
n o p
16 17 18 19
q
r
s
t
20 21 22
u v w
23 24 25
x y
z
Chiffrement de César
Le chiffrement est un des plus rudimentaires. Il a été utilisé par Jules César pour certaines de ses correspondances.
Le principe est de décaler les lettres de l’alphabet d’une ou plusieurs positions, la clé de chiffrement étant la valeur
du décalage. Par exemple, en décalant les lettres d’une position, le caractère a se transforme en b, le b en c,..., le z en
a. Inversement, décaler les lettres de 25 transforme le a en z, etc... Avec un décalage de 25 le texte avecesar devient
donc zudbdrzq. Remarquez qu’un décalage de 26 ou d’un de ces multiples laisse le texte inchangé.
Question 5. Que donne le chiffrement du texte informatique en utilisant un décalage de 5 ?
Question 6. Écrire la fonction chiffrement_cesar(L,d) qui prend en arguments une liste L et un entier d, et qui
renvoie une nouvelle liste de même taille que L contenant les chiffres de L décalés de d positions. On utilisera le modulo.
>>> chiffrement_cesar([0, 21, 4, 2, 4, 18, 0, 17], 25) #correspond à avecesar, qu'on décale de 25.
[25, 20, 3, 1, 3, 17, 25, 16]
Question 7. Écrire de même la fonction dechiffrement_cesar(L,d) prenant les mêmes arguments mais qui réalise
le décalage dans l’autre sens.
>>> dechiffrement_cesar([25, 20, 3, 1, 3, 17, 25, 16], 25) #déchiffrement de zudbdrzq
[0, 21, 4, 2, 4, 18, 0, 17]
2.2
Cryptanalyse du chiffrement de César
Pour réaliser la cryptanalyse, il faut découvrir la valeur du décalage, qu’on va essayer de deviner automatiquement.
L’approche la plus couramment employée est de regarder la fréquence d’apparition de chaque lettre dans le texte
chiffré. En effet, la lettre la plus fréquente dans un texte suffisamment long en français est la lettre e.
Question 8. Écrire la fonction frequences(L) qui prend en argument une liste représentant un texte composé
uniquement de minuscules, et qui retourne une liste de taille 26 dont la case d’indice i (avec 0 ≤ i < 26) contient le
nombre d’apparitions du nombre i dans L.
>>> frequences([1, 14, 18, 20, 20, 2, 16, 8, 8, 20, 3, 16])
[0, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 0, 0, 0, 0]
Question 9. Écrire une fonction indice_max(T) prenant en entrée une liste d’entiers (quelconques) T et retournant
l’indice du maximum de la liste. On suppose celui-ci unique.
>>> indice_max([0,7,8,10,1]) #10, d'indice 3, et le maximum.
3
Question 10. Écrire la fonction dechiffrement_auto(L) qui prend en argument une liste L représentant un texte
chiffré, et qui renvoie la liste correspondant au texte d’origine (en calculant la clé pour que la lettre e soit la plus
fréquente dans le texte déchiffré, en supposant qu’il n’y a qu’une possibilité).
>>> dechiffrement_auto([1, 14, 18, 20, 20, 2, 16, 8, 8, 20, 3, 16])
[11, 24, 2, 4, 4, 12, 0, 18, 18, 4, 13, 0]
Dans l’exemple précédent, on retrouve bien la liste correspondant au texte lyceemassena, ce qui n’est pas étonnant :
la lettre e est celle qui apparaît le plus. Le texte initial avait été décalé de 16.
Svartz
Page 2/2
2015/2016

Documents pareils