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 :
p
q
n = 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.pem
bob_pub.pem
Question 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 !