Minh Tuan NGUYEN Crypto 2023
12311816
Q1.
- Nous allons développer les trois fonctions en Python correspondant à un système de
chiffrement RSA d'école.
1) La fonction G génère une paire de clés publique et privée. Elle sélectionne deux
nombres premiers aléatoires, calcule n et φ(n), puis sélectionnez e et calcule d.
from sympy import randprime, isprime
def G(bits=1024):
# Générer deux grands nombres premiers p et q
p = randprime(2**(bits-1), 2**bits)
q = randprime(2**(bits-1), 2**bits)
# Calculer n et phi(n)
n=p*q
phi_n = (p-1) * (q-1)
# Choisir e tel que 1 < e < phi(n) et gcd(e, phi(n)) = 1 (e est souvent pris comme
65537)
e = 65537
# Calculer d, l'inverse modulaire de e modulo phi(n)
d = pow(e, -1, phi_n)
# La clé publique est (n, e) et la clé privée est (n, d)
return (n, e), (n, d)
2) Fonction E(pk, m) - Chiffrement :
La fonction E prend une clé publique et un message à chiffrer. Elle retourne le texte
chiffré en utilisant la clé publique.
def E(pk, m):
n, e = pk
# Chiffrer le message m avec la clé publique (n, e)
c = pow(m, e, n)
return c
3) Fonction D(sk, c) - Déchiffrement :
La fonction D prend une clé privée et un texte chiffré. Elle retourne le texte clair en
utilisant la clé privée.
def D(sk, c):
n, d = sk
# Déchiffrer le texte c avec la clé privée (n, d)
m = pow(c, d, n)
Minh Tuan NGUYEN Crypto 2023
12311816
return m
Vérification de la consistance :
# Générer les clés publique et privée
public_key, private_key = G()
# Définir un message
message = 123456789
# Chiffrer le message
ciphertext = E(public_key, message)
# Déchiffrer le message
decrypted_message = D(private_key, ciphertext)
# Vérifier la consistance
print("Message original:", message)
print("Message chiffré:", ciphertext)
print("Message déchiffré:", decrypted_message)
Voici les résultats de l'exécution du programme :
Message original: This is encrypted
Message chiffré:
[21177581…980909576804298670846562002880088016409476799109682118311678895
509943802696]
Message déchiffré: This is encrypted
Minh Tuan NGUYEN Crypto 2023
12311816
Q2.
from sympy import gcdex
# Valeurs données
n = 493
c1 = 293 # Chiffré avec la clé (n, 3)
c2 = 421 # Chiffré avec la clé (n, 5)
# Trouver a et b tels que 3a + 5b = 1
a, b, _ = gcdex(3, 5)
# Calculer m
m = (pow(c1, a, n) * pow(c2, b, n)) % n
printf("Le message retrouvé est : {m}")
4. Pourquoi ne pas utiliser directement la fonction à sens unique RSA comme système
de chiffrement :
On ne l'utilise pas directement car elle est sujette à plusieurs attaques, notamment
celles qui exploitent sa malléabilité. De plus, sans un padding adéquat, elle est
vulnérable aux attaques de texte clair choisi et de texte chiffré choisi.
Minh Tuan NGUYEN Crypto 2023
12311816
5. Méthode pour utiliser RSA comme système de chiffrement :
Pour utiliser RSA comme système de chiffrement de manière sécurisée, on doit y ajouter
un padding sécurisé, tel que OAEP (Optimal Asymmetric Encryption Padding), qui
assure que le chiffrement sera différent même si le même message est chiffré plusieurs
fois. De plus, cela prévient les attaques qui exploitent la structure algébrique de RSA.
Q3.
Minh Tuan NGUYEN Crypto 2023
12311816
Minh Tuan NGUYEN Crypto 2023
12311816
Q4.
Minh Tuan NGUYEN Crypto 2023
12311816
Q5.
Minh Tuan NGUYEN Crypto 2023
12311816