Vous êtes sur la page 1sur 3

TP Chiffrement Asymétrique (Kid-RSA)

Principe
Kid RSA est un système de chiffrement asymétrique, sorte de RSA simplifié, créé par Neal
Koblitz dans un but d'enseignement : https://sites.math.washington.edu/~koblitz/crlogia.html .

Calcul des clés :


➔ On prend deux nombres entiers a et b et on calcule M =a×b−1 .

➔ On choisit ensuite deux autres nombres entiers a1 et b1 . On calcule alors :

◦ e=a 1×M +a

◦ d =b 1×M +b

e×d – 1
◦ n=
M

➔ La clé publique est le couple (e , n) et la clé privée est le couple (d , n) .

Cet algorithme permet de chiffrer des suites de nombres entiers inférieurs à n . On remplace
donc chaque lettre du message par un nombre avant de chiffrer (par exemple par sa valeur de
point unicode, en numérotant l'alphabet, ...).

Chiffrement / déchiffrement :
➔ Pour chiffrer avec la clé publique on multiplie le nombre à chiffrer par e puis on
calcule le reste de la division euclidienne par n .

➔ Pour déchiffrer avec la clé privée on multiplie le nombre à déchiffrer par d puis on
calcule le reste de la division euclidienne par n .

Mise en pratique « à la main ».


1. Calculez les clés si l'on choisit a=3 , b=7 , a 1=4 et b1=6 .

2. Je souhaite chiffrer le message "NSI".


Quels sont les codes ASCII associés à ces lettres ?

3. Chiffrez ces trois valeurs avec la clé publique (83, 527).

4. Déchiffrez le résultat précédent avec la clé privée (127, 527).


Retrouve-t-on bien le résultat précédent ?
Programmation
1. Implémentez une fonction creationClefsKidRSA(a, b, a1, b1) qui prend en entrée les 4
entiers a , b , a 1 et b1 et qui renvoie la clé publique et la clé privée.

2. Implémentez une fonction chiffrementKidRSA(message,clefPublique) qui chiffre un


message message qui est une chaîne de caractères avec la clef publique clefPublique,
en remplaçant chaque caractère par son code ASCII en décimal (fonction ord en
Python).

3. Implémentez une fonction dechiffrementKidRSA(messageChiffre, clefPrivee) qui


déchiffre le message messageChiffre (liste d'entiers) avec la clef privée clefPrivee.
Cette fonction renvoie une chaîne de caractères (fonction chr en Python pour obtenir la
lettre associée à un code ASCII).
Casser (ou décrypter) le chiffrement KidRSA
Un message a été chiffré avec KidRSA à l'aide de la clef publique suivante
(e,n) = (8067, 161816)

Voici le message chiffré obtenu :


[46974, 110558, 135235, 142826, 86357, 96328, 104395]

On souhaite "casser" le message chiffré et retrouver le message en clair.


Pour cela, on a besoin de connaître la clef secrète (d,n). Comme on connait déjà n
(n = 161816), il faut trouver une méthode pour calculer d .

En étudiant la relation entre les nombres qui constituent les deux clefs, publique et privée e,d
e×d – 1
et n : n= peut s'écrire aussi n×M =e×d −1 .
M

On en déduit que e×d −1 est divisible par n .

Pour trouver l'entier d qui fait partie de la clef secrète, comme on connait déjà n et e , il
suffit d'étudier parmi toutes les valeurs de d comprises entre 1 et n−1 , laquelle vérifie la
condition " e×d −1 est divisible par n ".

On appelle ce type d'attaque par force brute car on doit étudier (dans le pire des cas) tous les
entiers d inférieurs à n . Ce qui peut être long si n est grand.

1. Ecrire le corps de la fonction bruteForceKidRSA(e,n) qui permet de calculer et de


retourner le premier entier d inférieur à n qui vérifie la relation " e × d −1 est
divisible par n ."

2. En déduire la valeur de d recherchée.

3. Déchiffrer le message donné plus haut.

Vous aimerez peut-être aussi