Skip to content
Snippets Groups Projects
Commit bf9e2c65 authored by Florian Burgener's avatar Florian Burgener
Browse files

Update rapport

parent e2e781d2
No related branches found
No related tags found
No related merge requests found
rapport/images/rsa_fonctionnement.png

69.1 KiB

# Travail Pratique RSA
# Travail Pratique : RSA
Cours : ISC_121 - 2021-2022
Groupe 13 : Gawen ACKERMANN, Florian BURGENER, Quentin FASLER, Dario GENGA
## Introduction
La cryptographie existe depuis l'antiquité et est utilisée pour transmettre des messages de manière sécurisé. Cette technique a largement été utilisé en période de guerres, où la confidentialité des informations étaient primordiales afin de gagner les divers conflits entre états et/ou groupe de personnes.
La cryptographie existe depuis l'antiquité et est utilisée pour transmettre des messages de manière sécurisé. L'utilisation de la cryptographies a largement augmenté avec la première et seconde guerre mondiale où la confidentialité des transmissions était essentielle. De nos jours nous l'utilisons quotidiennement sans forcement le savoir.
Apparu en 1977, le RSA porte le nom des ses auteurs :
* Ronald **R**ivest
* Adi **S**hamir
* Leonard **A**dleman
et sert à chiffrer des données de manière asymétrique, RSA utilise une clé publique ainsi qu'une clé privée. Afin de déchiffrer le message que nous avons intercepté, nous allons utiliser diverses outils mathématiques qui utilisé ensemble permettent de trouver de trouver le message en clair. Dans la suite de ce rapport, nous allons approfondir ces outils mathématiques en expliquant leur principe ainsi que leurs applications dans le déchiffrement du message.
et sert à chiffrer des données de manière asymétrique, RSA utilise une clé publique ainsi qu'une clé privée.
Afin de déchiffrer le message que nous avons intercepté, nous allons utiliser diverses outils mathématiques qui utilisé ensemble permettent de lire le message en clair. Dans la suite de ce rapport, nous allons approfondir ces outils mathématiques en expliquant leur principe ainsi que leurs applications dans le déchiffrement du message.
Dans ce rapport, nous allons vous expliqué comment nous avons réussi à déchiffrer ce message :
......@@ -22,7 +24,7 @@ _**De toutes façons, les réunions de la Table Ronde c'est deux fois par mois.
Dans cette partie du rapport, nous allons tout d'abord détailler les outils mathématiques nécessaires pour comprendre la méthode que nous avons utilisé pour casser le chiffrement, puis nous décrirons comment nous avons cassé le chiffrement.
Pour rappel, ci-dessous, se trouvent les données que nous avons interceptées. Nous avons pu déterminer que ces données correspondent à un chiffrement *RSA*. Les variables _n_ et _e_ correspondent à la clé publique (nous y reviendrons sur cette notion plus tard dans ce rapport) et la variable _encrypted_data_ correspond aux données chiffrées qui une fois déchiffrée et regroupés reconstitue le message que nous cherchons.
Pour rappel, ci-dessous, se trouvent les données que nous avons interceptées. Ces données ont été chiffré avec le chiffrement *RSA*. Les variables _n_ et _e_ correspondent à la clé publique (nous reviendrons plus tard sur cette notion dans la suite du rapport) et la variable _encrypted_data_ correspond aux données chiffrées qui une fois déchiffrée et regroupés reconstitue le message que nous cherchons.
| Variable | Valeur |
| -------------- | ------------------------------------------------------------ |
......@@ -32,7 +34,7 @@ Pour rappel, ci-dessous, se trouvent les données que nous avons interceptées.
### Outils mathématiques
Nous avons dû utiliser divers outils mathématiques afin de pouvoir déchiffrer le message intercepté, ces outils sont : le théorème de Bachet-Bézout, le théorème de Bézout, l'inverse modulaire, l'exponentiation modulaire et le principe de chiffrement du RSA.
Nous avons dû utiliser divers outils mathématiques afin de pouvoir déchiffrer le message intercepté, ces outils sont : le théorème de Bachet-Bézout, le théorème de Bézout, l'inverse modulaire, l'exponentiation modulaire et le principe du chiffrement RSA.
#### Brève explication du RSA
......@@ -68,41 +70,38 @@ $1 = PGCD(a, n) = au + ny$ (théorème de Bachet-Bézout)
_u_ est l'inverse modulaire de _a_ dans les modulo _n_
#### --- Exponentiation modulaire
Afin de calculer la puissance modulaire, nous avons besoin d'une `base` ($14$), d'un `exposant` ($108$) et d'un `indice modulaire` ($22$) qui sont tous des entiers naturels.
La premier étape c'est de décomposer l'`exposant` en puissance de 2.
#### Exponentiation modulaire
$64+32+8+4=108$
L'exponentiation modulaire nous servira pour effectuer les calculs de déchiffrement. Nous allons expliquer l'exponentiation modulaire au travers d'un exemple car cela est plus efficace pour comprendre l'algorithme. Nous voulons effectuer le calcul suivant :
La deuxième étape consiste à construire la table des puissances. Pour cela on met en puissance la `base` par chaque puissance de 2 jusqu'à la dernière calculée précédemment (dans notre exemple $1$ jusqu'à $64$).
$14^{108} \pmod{22}$
```
14^1 = 14
14^2 = 14² = 196 => 20
14^4 = 20² = 400 => 4
14^8 = 4² = 16 => 16
14^16 = 16² = 256 => 14
14^32 = 14² = 196 => 20
14^64 = 20² = 400 => 4
```
Comme vous vous en doutez effectuer un tel calcul sur ordinateur est très lent, l'algorithme d'exponentiation modulaire règle ce problème. Afin de calculer le résultat, nous avons besoin de décomposer notre calcul en trois éléments : la base ($14$ pour notre exemple), l'exposant ($108$) et le modulo ($22$).
La troisme étape on reprend la décomposition de l'étape 1 et on calcul cette dernière à partir du tableau de l'étape 2.
La **premre étape** est de décomposer l'exposant en puissance de 2.
$2^6 + 2^5 + 2^3 + 2^2 = 64 + 32 + 8 + 4 = 108$
$14^{108} = 14^{64} * 14^{32} * 14^8 * 14^4$
$14^{64} * 14^{32} * 14^8 * 14^4 = 14^{108}$
$14^{108} mod\, 22 ≡ (4 * 20 * 16 * 4) mod\, 22 ≡ 5120 mod\, 22$
La **deuxième étape** consiste à construire la table des puissances qui décompose notre calcul. On commence avec le nombre de notre base : $14$, puis on l'élève au carré. $14^2 = 196$ et ensuite on applique notre modolu $196 \equiv 20 \pmod{22}$ et on répète l'opération en reprenant à chaque fois le résultat d'avant. On trouve cette table :
Le résultat de notre exemple est donc $5120 mod\,22 = 16$
```
14 = 14
14^2 = 14² = 196 => 20
14^4 = 20² = 400 => 4
14^8 = 4² = 16 => 16
14^16 = 16² = 256 => 14
14^32 = 14² = 196 => 20
14^64 = 20² = 400 => 4
```
La **troisième étape** consiste maintenait à évaluer le résultat de notre calcul du tout début.
Dans un premier temps, on va vérifier si l'`indice modulaire` est égal à 1 et si c'est le cas on retourne 0 car il n'est pas possible de calculer la puissance modulaire dans ce cas de figure.
On initialise le résultat à 1 et on effectue une division entière de la `base` par l'`indice modulaire` que l'on va stocker directement dans la `base`.
$14^{64} * 14^{32} * 14^8 * 14^4 = 14^{108}$
Ensuite, on itère tant que l'`exposant` est supérieur à 0. À chaque itération on vérifie si l'`exposant` modulo 2 est égal à 1.
$14^{108} \equiv (4 * 20 * 16 * 4) \equiv 5120 \equiv 16 \pmod{22}$
#### Chiffrement/déchiffrement avec le RSA
......@@ -124,9 +123,9 @@ Dans cette section nous allons séparé notre raisonnement en 4 étapes. Dans la
_n_ étant un nombre semi-premier, deux nombres premiers le composent, ces nombres sont _p_ et _q_.
Pour trouver _p_ et _q_, il faut soit trouver _p_ soit _q_ car s'il on trouve _p_ on peut alors trouver q de la manière suivante : $q = \frac{n}{p}$ et inversement.
Pour trouver _p_ et _q_, il faut soit trouver _p_ soit _q_ car s'il on trouve _p_ on peut alors trouver q de la manière suivante : $q = \frac{n}{p}$ et inversement.
Donc nous voulons trouver seulement _p_, pour ce faire nous essayons de diviser _n_ par tout les nombre entre 2 et $\sqrt{n}$ et nous allons forcement trouver _p_ car il est obligé d'exister. Nous nous permettons d'utiliser la force-brute car on travaille sur un RSA-32 (32 bits), _p_ et _q_ font 16 bits chacun, la valeur maximale d'un nombre 16 bits est $2^{16} - 1 = 65535$ donc si 65535 est nombre premier on fera au maximum 65535 tours de boucle sachant que 65535 n'est pas un nombre premier notre programme fait moins de tout manière mois de 65535 itérations pour trouver _p_.
Donc nous voulons trouver seulement _p_, pour ce faire nous essayons de diviser _n_ par tout les nombre entre 2 et $\sqrt{n}$ et nous allons forcement trouver _p_ car il est obligé d'exister. Nous nous permettons d'utiliser la force-brute car on travaille sur un RSA-32 (32 bits), _p_ et _q_ font 16 bits chacun, la valeur maximale d'un nombre 16 bits est $2^{16} - 1 = 65535$ donc si 65535 est nombre premier on fera au maximum 65535 tours de boucle sachant que 65535 n'est pas un nombre premier notre programme fait de tout manière moins de 65535 itérations pour trouver _p_.
Dans notre cas nous avons trouvé $p = 38039$ et $q = \frac{1653973759}{38039} = 43481$
......@@ -138,9 +137,9 @@ Dans notre cas nous avons trouvé $d = 679327809$
#### Étape 3 : déchiffrer le message
Pour déchiffrer le message on applique la formule de déchiffrement qui est pour rappel : $y^d \pmod{n}$ où _y_ sont les données chiffrées, _d_ la clé privée et
Pour déchiffrer le message on applique la formule de déchiffrement (qui pour rappel est : $µ^d \pmod{n}$ où $µ$ sont les données chiffrées, _d_ la clé privée et _n_ le produit de $p$ et $q$) sur chacun des nombres que nous avons interceptés qui sont les suivants :
_n_ le produit de _p_ et _q_ sur chacun des nombres que nous avons interceptés qui sont les suivants : 1511395078, 260436590, 1630654276, 1190458520, 790492067, 515550941, 297140366, 755589582, 647075331, 1191707844, 901889430, 660956124, 1500654109, 984322720, 1275630738, 1244853107, 1445928913, 1312523810, 265093060, 933013993, 1375592761, 195866064, 534502441, 928270408, 166404031, 621272622, 1304987439, 905393335, 55120151, 772595721, 506609577, 1172751778, 162439707, 233959833, 1468937795, 1358701120, 901889430, 495995733, 1524090698, 1043509086, 934992314, 1545639379, 1061595897, 1348452679, 1135067876, 905393335, 621272622, 55120151, 233959833, 1220119699, 708711266, 517797467, 195866064, 1579814353, 412378626, 498875436, 445485200, 7656659.
1511395078, 260436590, 1630654276, 1190458520, 790492067, 515550941, 297140366, 755589582, 647075331, 1191707844, 901889430, 660956124, 1500654109, 984322720, 1275630738, 1244853107, 1445928913, 1312523810, 265093060, 933013993, 1375592761, 195866064, 534502441, 928270408, 166404031, 621272622, 1304987439, 905393335, 55120151, 772595721, 506609577, 1172751778, 162439707, 233959833, 1468937795, 1358701120, 901889430, 495995733, 1524090698, 1043509086, 934992314, 1545639379, 1061595897, 1348452679, 1135067876, 905393335, 621272622, 55120151, 233959833, 1220119699, 708711266, 517797467, 195866064, 1579814353, 412378626, 498875436, 445485200, 7656659.
Par exemple pour déchiffrer le premier nombre _**1511395078**_ des données chiffrées, on applique la formule de déchiffrement :
......@@ -154,47 +153,42 @@ Voici données déchiffrées : 2123076, 7696244, 544433524, 24934, 7317443, 5397
Il faut donc maintenant décoder ces données en UTF-8 pour reconstituer le message textuel.
Par exemple, le nombre _**2123076**_ correspond aux lettres "De", le nombre 7696244 correspond " tou", etc. Une fois qu'on concatène tous les bouts de chaîne de caractère on obtient *le précieux message qu'on souhaite voler depuis le début*.
Par exemple, le nombre _**2123076**_ correspond aux lettres "De", le nombre 7696244 correspond " tou", etc. Une fois qu'on concatène tous les bouts de chaîne de caractère on obtient *le précieux message qu'on souhaite déchiffrer depuis le début*.
## Résultat
Dans cette section, nous allons aborder les résultat obtenus.
### Sortie
En appliquant notre méthode de résolution aux données interceptées.
Voici le message déchiffré :
En appliquant notre méthode de résolution aux données interceptées, voici le message déchiffré que nous avons trouvé :
_**De toutes façons, les réunions de la Table Ronde c'est deux fois par mois. Donc, si le mec il dit après-demain à partir de dans deux jours, suivant s'il le dit à la fin du mois, ça reporte.**_
### Performances
Étant donné que la clé a été générée sur une faible quantité de bits, on peut appliquer la méthode de force-brute pour la résolution de _p_ et _q_.
Le nombre de tests à effectuer n'est pas conséquent car les chiffres à calculer ne sont pas grand étant donné que la clef est encodée sur 32 bits.
Étant donné que la clé a été générée sur une faible quantité de bits, on peut appliquer la méthode de force-brute pour la résolution de _p_ et _q_. Le nombre de tests à effectuer n'est pas conséquent car les chiffres à calculer ne sont pas grand étant donné que la clef a été créé sur 32 bits.
### Explication
La raison pour laquelle on arrive à déchiffrer le message aussi rapidement est due au fait que _n_ est codé sur une faible quantité de bits (32 pour être précis), ce qui nous permet de calculer _p_ et _q_ rapidement. Grâce à l'exponentiation rapide, on peut déchiffrer chaque parties du message rapidement du fait que l'on travail avec de petits nombres.
## Conclusion
Le but principale de ce projet était de déchiffré un message à l'aide des outils mathématiques vu en cours.
Le but principale de ce travail pratique était de déchiffrer un message chiffré avec RSA à l'aide des outils mathématiques que nous connaissons. Ces derniers sont :
Ces derniers sont :
* Bachet-Bézout
* Exponentiation modulaire
* Inverse modulaire
* le théorème de Bachet-Bézout ;
* le théorème de Bézout ;
* l'inverse modulaire ;
* l'exponentiation modulaire ;
* RSA.
Ces outils utilisent l'arithmétique modulaire, cette méthode de résolution nous permet de travailler avec des nombres bien plus petit que ceux sortant des calculs brut.
Pendant le réalisation du projet, on a découvert certaines valeurs très importantes à la résolution de ce dernier.
La première fut _q_ que l'on a trouvé en divisant $\frac{p}{n}$ à chaque nombre possible allant de $2 \, à \, \sqrt{n}$, la valeur obtenue est _*38039*_. Par conséquent nous avons trouvé que $q = \frac{1653973759}{38039} = 43481$
Ensuite, nous devions calculer la clef privée. Pour ce faire, nous avons fait l'inverse modulaire de $e^{-1} \pmod{(p-1)(q-1)}$ et nous avons trouvé que _d_ vallait _*679327809*_. Grâce à cette information cruciale, nous avons pu déchiffrer le message avec la fonction mathématique suivante $y^d \pmod{n}$. Nous avons appliquer cette formule sur chacun des chiffres présents dans le message.
Pendant le réalisation du projet, on a découvert certaines valeurs très importantes à la résolution de ce dernier. La première fut $p$ que l'on a trouvé en divisant $\frac{n}{p}$ à chaque nombre possible allant de $2 \, à \, \sqrt{n}$, la valeur obtenue est _*38039*_. Par conséquent nous avons trouvé que $q = \frac{1653973759}{38039} = 43481$
Par exemple, pour le premier chiffre du message : $1511395078^{679327809} \pmod{1653973759}$ et ainsi de suite sur chacun des chiffres jusqu'à la fin.
Ensuite, nous devions calculer la clé privée. Pour ce faire, nous avons fait l'inverse modulaire de $e^{-1} \pmod{(p-1)(q-1)}$ et nous avons trouvé que _d_ vaut _*679327809*_. Grâce à cette information cruciale, nous avons pu déchiffrer le message avec la fonction mathématique suivante $µ^d \pmod{n}$. Nous avons appliquer cette formule sur chacune des données chiffrée que nous avions interceptées.
Au niveau des améliorations possible :
Au niveau des améliorations possible, il y a dans ce contexte, au vu de la formalisation des données récupérées par mail, on pourrait créer un parseur qui récupère _n_, _e_ ainsi que le _message chiffré_, pour ne pas à avoir à les copier / coller à la main.
* il est clair que notre méthode de force-brute ne fonctionne que sur des RSA avec de petite clés (faible en bits), nous pourrions appliquer d'autre méthode pour casser le RSA qui serait bien plus efficace ;
Évidemment, on pourrait prendre le projet réalisé dans le sens inverse étant donné que nous connaissons déchiffrer un message encodé en RSA 32 bits. On pourrait mettre en place un message d'entré que l'on chiffre nous même.
* on pourrait prendre le projet et le réalisé dans le sens inverse étant donné que nous connaissons comment déchiffrer un message chiffré en RSA-32, nous savons donc aussi chiffrer un message.
Pour finir, après avoir mis en pratique les outils vu en cours. Nous avons pu décoder le message émis par mail. C'est en réalisant le projet que l'on aura compris plus en détails les rouages de cet algorithme, car même si la théorie et la pratique se ressemble. Sans exemples concret, c'est assez dur à comprendre comment fonctionne l'encodage et décodage du RSA.
\ No newline at end of file
Pour conclure, nous avons pu déchiffrer le message que nous avons intercepté en appliquant nos connaissances sur le fonctionnement du chiffrement RSA et des outils mathématiques qui l'entourent.
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment