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

Update README

parent 2c78f0b5
Branches
No related tags found
No related merge requests found
......@@ -116,6 +116,7 @@ def main():
for x in decrypted_data:
decoded_data += x.to_bytes((x.bit_length() + 7) // 8, "little").decode("utf-8")
print(decoded_data)
print(decoded_data)
......
......@@ -110,15 +110,59 @@ Ensuite, on itère tant que l'`exposant` est supérieur à 0. À chaque itérati
#### Chiffrement/déchiffrement RSA
RSA est un chiffrement asymétrique, il existe donc toujours deux clés, la première clé est la clé dites publique (utilisé pour le chiffrement) et la deuxième la clé est la clé dites privée (utilisé pour déchiffrement).
RSA est un chiffrement asymétrique, il existe donc toujours deux clés, la première clé est la clé dites publique (utilisé pour le chiffrement) et la deuxième la clé est la clé dites privée (utilisé pour déchiffrement). L'image ci-dessous décrit le chiffrement asymétrique. Le "Cipher Text" correspond aux données "encrypted_data" que nous avons interceptées.
![Schéma montrant le fonctionnement du RSA](rapport/../images/asymmetric_encryption.png "Fonctionnement du RSA")
La clé publique se compose de deux variables, la variable _e_ et _n_ ce sont une partie des données que nous avons interceptées en plus du message chiffrée. La clé privée se compose elle aussi de deux variables, la variable d (*ce que nous cherchons à découvrir*) et n.
La clé publique se compose de deux variables, la variable _e_ et _n_ qui sont une partie des données que nous avons interceptées avec le message chiffré. La clé privée se compose elle aussi de deux variables, la variable d (*ce que nous cherchons à découvrir*) et n. La variable _n_ est le produit de deux nombres premiers _p_ et _q_, c'est avec ces deux variables composant _n_ (_n_ est un nombre semi-premier) que nous pouvons calculer _d_.
$n = pq$
$d = e^{-1} \pmod{(p-1)(q-1)}$
Pour chiffrer les données _x_ avec RSA, il faut utiliser la formule suivante : $x^e \pmod{n}$
Pour déchiffrer les données _y_ avec RSA, il faut utiliser la formule suivante : $y^d \pmod{n}$
### Méthode de résolution
Nous avons commencé par calculer les valeurs de `p` et `q` afin de calculer l'exposant `d` à l'aide de l'inverse modulaire de `e` et de l'`indicatrice d'Euler`. Ensuite on va parcourir pour chacun des blocs, nommé `x`, du message on calcule la puissance modulaire de $x^d\, mod\, n$ que l'on convertit en bytes afin de le décoder en UTF-8 pour l'ajouter à la version décodée. Une fois tous les `x` parcourus, on affiche la version du message décodée.
Dans cette section nous allons séparé notre raisonnement en 4 étapes.
#### Étape 1 : trouver les variables _p_ et _q_ en fonction de _n_
_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.
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_.
Dans notre cas nous avons trouvé $p = 38039$ et donc que $q = \frac{1653973759}{38039} = 43481$
#### Étape 2 : calculer la clé privée (variable _d_)
Une fois les variables _p_ et _q_ trouvées, on peut facilement calculer la variable _d_ (clé privée) avec la formule suivante : $d = e^{-1} \pmod{(p-1)(q-1)}$
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
_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.
Par exemple pour déchiffrer le premier nombre _*1511395078*_ des données chiffrées, on applique la formule de déchiffrement :
$1511395078^{679327809} \pmod{1653973759} = 2123076$
Force est de constater que sans l'algorithme d'exponentiation rapide, il est impossible d'effectuer ce calcul rapidement sur ordinateur moderne. On applique le déchiffrement sur toutes les données et obtient une liste de nombres qu'il va falloir encore décoder.
#### Étape 4 (étape final) : décoder les données déchiffrées
Voici données déchiffrées : 2123076, 7696244, 544433524, 24934, 7317443, 539784046, 544433516, 11125618, 6909557, 544435823, 2123108, 1411408236, 7103073, 5382245, 6581871, 660807781, 544502629, 7693668, 6692984, 544434543, 544366960, 6909805, 1142959731, 744713839, 543781664, 2123116, 543384941, 2124905, 544500068, 7499873, 762554563, 1634559332, 2125417, 2138307, 7496048, 544369012, 2123108, 7233892, 6561907, 544765285, 7696234, 539784050, 6911347, 7233910, 661856372, 2124905, 2123116, 544500068, 2138307, 2122092, 544106854, 2127204, 6909805, 2108531, 543270851, 7366002, 7631471, 11877
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*.
## Résultat
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment