Exercices
Exercice 1
Utilisation des bibliothèques cryptographiques du module sympy
.
Documentation : https://docs.sympy.org/latest/modules/crypto.html
Décoder la phrase RYTVJKGCLJWRTZCVRMVTLEDFULCVHLZWRZKKFLKRMFKIVGCRTV
, sachant qu'elle a été chiffrée par décalage (shift en anglais...)
Correction
1 2 3 4 5 6 7 |
|
Exercice 2
Chiffrage affine
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.
Rappel sur les nombres premiers entre eux
Deux nombres sont dits premiers entre eux si leur PGCD vaut 1.
Exemples :
- 8 et 15 sont premiers entre eux (ils n'ont aucun diviseur commun autre que 1)
- 8 et 12 ne sont pas premiers entre eux (leur PGCD vaut 4).
Q1. Codez votre fonction affine(msg, a, b)
Correction
1 2 3 4 5 6 7 8 9 10 11 |
|
Q2. Comparez vos résultats avec ceux obtenus par la fonction encipher_affine()
de sympy
.
Q3. Décodez la phrase UCGXLODCMOXPMFMSRJCFQOGTCRSUSXC
, sachant qu'elle contient le mot TRAVAIL
et que \(a\) et \(b\) sont inférieurs à 20.
Aide
L'instruction gcd
du module math
permet de calculer le PGCD de deux nombres.
Correction
1 2 3 4 5 6 7 8 9 |
|
Exercice 3
Cryptographie RSA presque à la main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
- Pour générer un grand nombre premier, on utilise la fonction
Crypto.Util.number.getPrime(bits, randfunc=get_random_bytes)
. - Pour inverser un nombre \(x\) modulo \(n\), on utilise la fonction
libnum.invmod(x, n)
. - Pour calculer
a
à la puissanceb
modulon
, on utilisepow(a, b, n)
.
Correction
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Exercice 4
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.
Exercice 5
module RSA dans les règles de l'art
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii
keyPair = RSA.generate(1024)
pubKey = keyPair.publickey()
pubKeyPEM = pubKey.exportKey()
privKeyPEM = keyPair.exportKey()
msg = b'vive la crypto en NSI !'
encryptor = PKCS1_OAEP.new(pubKey)
encrypted = encryptor.encrypt(msg)
print("Encrypted:", binascii.hexlify(encrypted))
decryptor = PKCS1_OAEP.new(keyPair)
decrypted = decryptor.decrypt(encrypted)
print('Decrypted:', decrypted)