Aller au contenu

TP - Cryptographie⚓︎

Exercice 1 : Utilisation des biblitohèques cryptographiques du module sympy

Documentation : https://docs.sympy.org/latest/modules/crypto.html

  1. Utiliser la fonction encipher_shift pour chiffre le message "ALORS CES NOTES DE SPECIALITES ?".

  2. Utiliser la fonction decipher_shift pour déchiffrer le message précédent.

  3. 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\)

\(a\) et \(b\) sont deux nombres entiers. Attention, a doit être premier avec 26.

  1. Codez votre fonction affine(msg, a, b).

  2. Comparez vos résultats avec ceux obtenus par la fonction encipher_affine() de sympy.

  3. Décodez la phrase UCGXLODCMOXPMFMSRJCFQOGTCRSUSXC, sachant qu'elle contient le mot TRAVAIL et que \(a\) et \(b\) sont inférieurs à 20.

Exercice 3 : Cryptographie RSA (presque à la main)

  1. Créer une fonction nombre_premier(nmin, nmax) qui retourne un nombre au hasard entre nmin et nmax. On pourra utiliser isprime du module sympy.
  2. créer la fonction creation_cle_publique(p, q):
    • utilisant assert pour vérifier les conditions sur p et q
    • calculant n
    • calculant (p-1)(q-1)
    • choisissant un nombre e 'au hasard' premier avec (p-1)(q-1)
    • retournant le tuple (e, n)
  3. créer la fonction creation_cle_prive(p, q, e):
    • calculant d inverse de e modulo (p-1)(q-1) (utiliser pow(d, -1, (p-1)*(q-1)))
    • retournant le tuple (d, n)
  4. 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)
  5. créer la fonction dechiffrer_RSA(message, cle). Bien réfléchir.
  6. créer une classe Personne ayant pour attribut une clé publique, une clé privée. pet q seront choisi au hasard entre 300 et 3000.
  7. créer une méthode get_cle_publique()retournant la clé pulique de la personne.
  8. 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.
  9. créer la méthode recevoir_message(message, origine) retournant le message déchiffré.
  10. 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)
    
  11. Mesurer le temps de chiffrement du message. Vous pourrez utiliser time() du module time.

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.