✍️ Question 1 : Chiffrez le mot 'NSI'
selon le chiffrement de César avec un décalage de 9.
🐍 Question 2 : Écrivez une fonction cesar
qui prend en paramètres une chaîne de caractères texte
et un entier c
, et qui renvoie le texte chiffrée par la méthode de César en utilisant le décalage c
.
On supposera pour simplifier que le texte de départ ne contient que des majuscules non accentuées et qu'on ne chiffre ni les espaces ni les signes de ponctuation.
Rappels :
ord
renvoie le code ASCII du caractère passé en argument :
>>> ord('N')
78
chr
renvoie le caractère dont le code ASCII est passé en argument
>>> chr(78)
N
n%26
donne le reste dans la division euclidienne de n
par 26Voici une fonction possible :
ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def position_alphabet(lettre):
return ord(lettre) - ord('A')
def cesar(message, decalage):
resultat = ''
for ... in message:
if 'A' <= caractere <= 'Z':
indice = (...) % 26
resultat = resultat + ALPHABET[indice]
else:
resultat = ...
return resultat
🐍 Question 3 (attaque par force brute) : Vous voulez attaquer par force brute le message chiffré par la méthode de César. Écrivez une fonction force_brute_cesar
qui prend en paramètre une chaîne de caractères texte_chiffre
qui a été chiffrée par la méthode de César, et qui décrypte cette chaîne par force brute.
On suppose toujours qu'il n'y a que des majuscules non accentuées et que les espaces et symboles de ponctuation ne sont pas chiffrés.
On considère la chaîne de caractères :
masque = "CETTEPHRASEESTVRAIMENTTRESTRESLONGUEMAISCESTFAITEXPRES"
🐍 Question 1 : Écrivez une fonction chiffre_xor(message: str, masque: str) -> str
qui chiffre message
en faisant un XOR avec masque
.
On supposera ici que la longueur du message est inférieure ou égale à celle du masque, comme c'est le cas pour la méthode dite du masque jetable ou (chiffrement de Vernam) qui prévoit (entre autres) que la clé ne doit pas être étendue pour rester sûre.
Exemples :
>>> chiffre_xor("hello", masque)
'+ 88*'
>>> chiffre_xor("nsi", masque)
'-6='
Aides :
^
et s'applique entre deux entiers (Python se charge de faire les conversions en binaire et d'exécuter le XOR bit à bit comme vu dans le cours.)
>>> 34 ^ 23 # 34 XOR 23
53
>>> bin(34), bin(23)
('0b100010', '0b10111') # et 100010 XOR 010111 = 110101
>>> 0b110101 # vérification
53
ord
permet de renvoyer le code ASCII d'un caractère. La fonction chr
fait l'opération inverse.
>>> ord('A')
65
>>> chr(65)
'A'
🐍 Question 2 : Vérifiez que la fonction chiffre_xor
permet aussi de déchiffrer le message chiffré.
La fiabilité du système RSA est lié à la difficulté, en connaissant un entier $n$ très grand, de trouver deux nombres premiers $p$ et $q$ tels que $n=pq$.
L'objectif de cet exercice est de le vérifier expérimentalement.
Pour vérifier qu'un nombre est premier vous pourrez utiliser la fonction isprime()
du modyle sympy
(à installer si nécessaire avec pip install sympy
). Cette fonction prend un entier en paramètre et renvoie True
si cet entier est premier et False
dans le cas contraire :
>>> from sympy import isprime
>>> isprime(17)
True
>>> isprime(27)
False
De plus, la bibliothèque pycrypto
(à installer si nécessaire avec pip install pycrypto
) permet de générer des nombres premiers de n'importe quelle taille :
from Crypto.Util import number
from Crypto.Random import get_random_bytes
# Taille des nombres (en bits)
n_length = 20
# Génération de deux nombres premiers p et q de cette taille
p = number.getPrime(n_length, randfunc=get_random_bytes)
q = number.getPrime(n_length, randfunc=get_random_bytes)
factorise
qui prend en paramètre un entier n
et renvoie deux nombres premiers p
et q
tels que n = p*q
.n
jusqu'à en trouver une dont le reste est 0. Il faudra ensuite vérifier si le diviseur peut convenir...Voici une fonction possibe :
def factorise(n):
for p in range(2, ...):
if n ... p == 0:
q = ...
if isprime(...) and ...:
return ..., ...
factorise
et vérifiez qu'elle permet de retrouver p
et q
à partir de n
.n_length
et mesurez les temps d'exécution de la fonction factorise
au fur et à mesure que n_length
augmente.n_length
, prenez par exemple 21 puis 22, 23, ... et observez l'augmentation correspondante du temps de calcul. n_length = 100
.www.wikipedia.fr
puis cliquez dans l'onglet Réseau sur la première requête envoyée et allez dans l'onglet Sécurité (tout à droite). Retrouver les informations suivantes :
Fonctionnement du protocole HTTPS
Références :
Germain Becker, Lycée Emmanuel Mounier, Angers.
Voir en ligne : info-mounier.fr/terminale_nsi/archi_se_reseaux/securisation-communications-exercices