TP - Cryptographie⚓︎
Exercice 1 : Utilisation des biblitohèques cryptographiques du module sympy
Documentation : https://docs.sympy.org/latest/modules/crypto.html
-
Utiliser la fonction
encipher_shiftpour chiffre le message "ALORS CES NOTES DE SPECIALITES ?". -
Utiliser la fonction
decipher_shiftpour déchiffrer le message précédent. -
Décoder la phrase
RYTVJKGCLJWRTZCVRMVTLEDFULCVHLZWRZKKFLKRMFKIVGCRTV, sachant qu'elle a été chiffrée par décalage (mais vous ne connaissez pas la clé).
Exercice 2 : Chiffrage affine (en bonus pour les plus motivés)
Principe du chiffrage affine :
- Chaque lettre est codée par son rang, en commençant à 0 (A->0, B->1, ..., Z->25)
- On applique à chaque rang la transformation affine \(f(x) = (ax+b)\, \%26\)
où \(a\) et \(b\) sont deux nombres entiers. Attention, a doit être premier avec 26.
-
Codez votre fonction
affine(msg, a, b). -
Comparez vos résultats avec ceux obtenus par la fonction
encipher_affine()desympy. -
Décodez la phrase
UCGXLODCMOXPMFMSRJCFQOGTCRSUSXC, sachant qu'elle contient le motTRAVAILet que \(a\) et \(b\) sont inférieurs à 20.
Exercice 3 : Cryptographie RSA (presque à la main)
- Créer une fonction
nombre_premier(nmin, nmax)qui retourne un nombre au hasard entre nmin et nmax. On pourra utiliserisprimedu modulesympy. - créer la fonction
creation_cle_publique(p, q):- utilisant assert pour vérifier les conditions sur
petq - calculant
n - calculant
(p-1)(q-1) - choisissant un nombre
e'au hasard' premier avec(p-1)(q-1) - retournant le tuple
(e, n)
- utilisant assert pour vérifier les conditions sur
- créer la fonction
creation_cle_prive(p, q, e):- calculant
dinverse de e modulo(p-1)(q-1)(utiliserpow(d, -1, (p-1)*(q-1))) - retournant le tuple
(d, n)
- calculant
- créer la fonction
chiffrer_RSA(message, cle)ou cle est un tuple et message un entier inférieur à n:- utilisant assert pour vérifier les conditions sur message
- retournant le message chiffré (
(message ** e) % n)
- créer la fonction
dechiffrer_RSA(message, cle). Bien réfléchir. - créer une classe
Personneayant pour attribut une clé publique, une clé privée.petqseront choisi au hasard entre 300 et 3000. - créer une méthode
get_cle_publique()retournant la clé pulique de la personne. - créer une méthode
envoyer_message(message, destinataire)retournant le message chiffré avec sa clé privée et la clé publique de la personne destinataire. - créer la méthode
recevoir_message(message, origine)retournant le message déchiffré. -
Tester avec le code suivant:
Alice = Personne() Bob = Personne() msg_chiffre = Alice.envoyer_message(124, Bob) msg_dechiffre = Bob.recevoir_message(msg_chiffre, Alice) print(msg_dechiffre) -
Mesurer le temps de chiffrement du message. Vous pourrez utiliser
time()du moduletime.
Exercice 4 : Déchiffrement
En vous servant du code précédent, déchiffrez le message 58152918114477529438769495136495430966050302170947748011925859233600631318929939319619808279389222131229963717435870597641010567365311762267359794338657867540621133550787677728203831932548041236152866441194127191404729294628415184239755221703677388875259927092794165578604353985011899152968982365630138088486380827379488939561996226754182 sachant que :
- \(e\) vaut 65537.
- \(p\) et \(q\) sont respectivement les 13èmes et 14èmes nombres de Mersenne.