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