PCSI du lyc´ ee de l’Essouriau Math´ ematiques et Informatiques

publicité
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
Téléchargement