![]()
Le chiffrement RSA a été créé en 1977 par Ronald Rivest, Adi Shamir et Leonard Adleman. Le nom de ce chiffrement provient des 3 initiales des inventeurs.
Ce chiffrement utilise le principe du chiffrement asymétrique. Il est donc composé de :
Pour gérer les clés, le chiffrement RSA utilise certaines notions mathématiques comme :
Dans ce TP, nous allons créer différentes fonctions permettant de générer des couples de clés.
Question 1 - Écrire la fonction est_nombre_premier. Cette fonction prend un entier en paramètre. Elle retourne True si ce nombre est premier, False sinon.
1 et lui-même.def est_nombre_premier(x):
'''
:param x: (int)
:return: (bool)
'''
Question 2 - Écrire la fonction nombres_premiers_entre_eux. Cette fonction prend deux entiers en paramètre. Elle retourne True si les nombres sont premiers entre eux, False sinon.
a et b sont premiers entre eux si PGCD(a,b) = 1.gcd(a,b) du module maths permet de calculer le PGCD.def nombres_premiers_entre_eux(a,b):
'''
:param a: (int)
:param b: (int)
:return: (bool)
'''
Question 3 - Écrire la fonction generer_nombre_premier. Cette fonction prend en paramètre deux entier a etb. Elle retourne une liste des nombres premiers dans l'interval [a;b].
est_nombre_premier.def generer_nombre_premier(a, b):
'''
:param a: (int)
:param b: (int)
:return: (list)
'''
Question 4 - Écrire la fonction generer_nombre_premier_avec. Cette fonction prend en paramètre un entierx. Elle retourne une liste des nombres premiers avec x.
nombres_premiers_entre_eux.def generer_nombre_premier_avec(x):
'''
:param ax: (int)
:return: (list)
'''
Question 5 - Ajouter dans votre fichier la fonction inverse_modulaire donnée ci-dessous.
def inverse_modulaire(a,m):
for x in range(1,m):
if((a%m)*(x%m) % m==1):
return x
raise Exception("L'inverse modulaire de ce nombre n'existe pas !"
Pour générer les clés privées et publiques, vous devrez utiliser les fonctions suivantes :
generer_nombre_premier(a,b)generer_nombres_premiers_avec(a)inverse_modulaire(a, b)Vous aurez également besoin de la fonction choice(liste) du module random qui permet de choisir un élément dans une liste de façon aléatoire.
>>> from random import choice
>>> l = [1,2,3,4,5,6]
>>> choice(l)
5
Voici le fonctionnement de la génération des clés pour le chiffrement RSA :
pqn = p * qØ = (p-1) * (q - 1)e premier avec Ø et inférieur à Ø. On peut choisir 3, 5, 7,17, 65537d l’inverse modulaire de e mod o(e, n)(d, n)Les nombres premiers choisis seront dans l’intervalle [100, 1000].
Question 6 - Écrire une fonction generer_clefs_rsa. Cette fonction retourne une liste composé de deux tuples.
def generer_clefs_rsa():
'''
:return: (tuple)
'''
Question 7 - Écrire une fonction chiffrer_rsa. Cette fonction prend en paramètre un entier x et un tuple cle_pub. Cette fonction retourne le chiffrement de l'entier x à l'aide de la clé publique passée en paramètre.
def chiffrer_rsa(x, cle_pub):
'''
:param x: (int)
:param cle_pub: (tuple)
'''
Question 7 - Écrire une fonction dechiffrer_rsa. Cette fonction prend en paramètre un entier x et un tuple cle_priv. Cette fonction retourne le déchiffrement de l'entier x à l'aide de la clé privée passée en paramètre.
def dechiffrer_rsa(x, cle_priv):
'''
:param x: (int)
:param cle_priv: (tuple)
'''
Dans cet exercice, nous allons découvrir comment générer et utiliser une paire de clés à l'aide de l'algorithme de chiffrement RSA.
Question 1 - Dans votre répertoire personnel, créer un dossier nommé rsa.
On rappelle que RSA est un chiffrement asymétrique et qu'il fonctionne avec deux clés :
Pour générer une paire de clefs, nous allons utiliser la commande openssl.
Question 1 - Utiliser la commande openssl selon l'exemple ci-dessous afin de générer la clé privée de Bob.
openssl genrsa -out bob_priv.pem 2048
Un nouveau fichier nommé bob_priv.pem vient d'être créé. Il correspond à la clef privée de Bob
Question 2 - Utiliser la commande cat pour observer le contenu du fichier bob_priv.pem.
Une clef privée commence par la ligne
-----BEGIN RSA PRIVATE KEY-----et se terminae par-----END RSA PRIVATE KEY-----
Maintenant, il faut générer la clef publique de Bob
Question 3 - Utiliser la commande openssl selon l'exemple ci-dessous afin de générer la clé publique de Bob.
openssl rsa -in bob_priv.pem -pubout -out bob_public.pem
Un nouveau fichier nommé bob_public.pem vient d'être créé. Il correspond à la clef publique de Bob
Question 4 - Utiliser la commande cat pour observer le contenu du fichier bob_priv.pem.
Une clef publique commence par la ligne
-----BEGIN PUBLIC KEY-----et se terminae par-----END PUBLIC KEY-----
À partir de cette étape, vous devez avoir un dossier avec deux fichiers :
bob_priv.pembob_pub.pemQuestion 5 - Créer un fichier message_clair avec quelques mots d'un message à chiffrer.
Pour chiffrer un message, on utilise également la commande openssl.
Question 6 - Utiliser la commande openssl selon l'exemple ci-dessous afin de chiffrer le fichier. Le message chiffré sera nommé message_chiffre
openssl rsautl -encrypt -inkey [cle_pub] -pubin -in [fchier_en_entrée] -out [fichier_en_sortie]
Question 7 - Utiliser la commande cat pour afficher le fichier chiffré et vérifier qu'il est bien illisible.
Le message obtenu est bien chiffré !
Pour déchiffrer un message, on utilise également la commande openssl.
Question 6 - Utiliser la commande openssl selon l'exemple ci-dessous afin de déchiffrer le fichier. Le message clair sera affiché sur le terminal.
openssl rsautl -decrypt -inkey [cle_priv] -in [fichier_en_entree]
On retrouve le message clair !