PCSI du lycée de l’Essouriau Université Paris-Sud Centre d’Orsay Mathématiques et Informatiques TP 09 2011–2012 TP 09 — Cryptographie L’objectif de ce TP est de donner une idée des diverses manipulation que l’on peut effectuer sur un message pour le crypter. On utilisera les fonctions Char et Ord du package StringTools. Exercice 1 : (Algorithme de César) L’algorithme de César est le plus ancien (et le plus simple !) algorithme de cryptage d’un texte. Il consiste à changer chaque lettre du message selon un procédé constant de décalage dans l’ordre alphabétique. Par exemple, si le texte initial est ”Bonjour”, il devient si le décalage est de +1 ”Cpokpvs”. Question 1 – Chargez le package StringTools et testez les commandes Char et Ord. On remarquera que Maple connaı̂t 256 caractères, numérotés de 0 à 255. Créez un message court (∼ 10 caractères) et un message long (plusieurs phrases), vous pourrez pour cela faire un copier-coller depuis internet. Question 2 – En utilisant les commandes Explode et Implode, programmez une fonction Cesar qui prend en argument un message et une clé (nombre compris entre 0 et 255) et qui crypte le message selon l’algorithme de César. Vous ferez attention à la périodicité dans le cryptage, c’est-à-dire que les numéros des caractères sont à comprendre modulo 256. Question 3 – Vérifiez que vous pouvez bien décrypter le message crypté avec l’algorithme de César lorsque vous connaissez la clé. Question 4 – Lorsque vous ne connaissez pas la clé, proposez une méthode pour décrypter tout de même le message. Testez cet algorithme sur le message court et sur le message long. Lorsque le message est long, les fonctions Implode et Explode ne peuvent plus être utilisées. Vous pourrez en créer vous-même des versions plus élaborées. Exercice 2 : (Cryptage linéaire) Le cryptage linéaire repose sur le même principe que l’algorithme de César, mais au lieu d’ajouter une constante au nombre codant le caractère, on effectue une transformation affine, x 7→ ax + b, où a et b sont des nombres entiers. Cette opération est bien entendu à prendre modulo 256. Question 1 – Programmez l’algorithme de cryptage linéaire en vous inspirant de l’algorithme de César. Vous fabriquerez une fonction code_affine(message, a, b) où a et b sont les paramètres du codage linéaire. Question 2 – Pour décrypter le message, il faut savoir diviser par a modulo 256. Proposez une procédure invm(a,b) qui retourne (lorsqu’il existe) l’inverse de a modulo b. Vous pourrez utiliser l’algorithme d’Euclide ou bien faire une recherche exhaustive. Comparez le résultat de invm(a,b) avec celui de 1/a mod b. Question 3 – Proposez une fonction decode_affine(message, a, b) qui décode un message encodé grâce au codage linéaire de paramètres a et b. Question 4 – Modifiez les fonctions précédentes afin qu’elles acceptent des messages longs. 1