Skip to content
Snippets Groups Projects
Commit ef3a396c authored by dario.genga's avatar dario.genga
Browse files

Edit readme

parent 5b581abb
Branches
No related tags found
No related merge requests found
# TP numéro 2 : RSA
# Travail Pratique RSA
Cours : IT 121 – 2021-2022
Groupe : Florian BURGENER, Gawen ACKERMANN, Quentin FASLER, Dario GENGA
Groupe 13 : Florian BURGENER, Gawen ACKERMANN, Quentin FASLER, Dario GENGA
## Introduction
- Présentation du travail
- Résumé court du travail réalisé
- Résumé de chaque sections
Pour ce travail pratique en math, il nous a été demandé de créer un programme permettant de décoder un message encodé avec la méthode du RSA. Afin de décoder ce message, nous avons utilisé les méthodes mathématiques suivantes pour y arriver :
* Bachet-Bézout
* Inverse modulaire
* Puissance modulaire
## Méthodologie
### Rappel théorique
Voici ci-dessous, l'ensemble des variables utilisées dans notre code.
......@@ -25,19 +32,94 @@ Valeurs de départ :
| e | 5249 |
| messages | 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 |
## Méthodologie
_Sans pour autant fournir votre code ni une documentation de ce dernier (le boss n’est pas
programmeur !), décrivez votre approche dans les grandes lignes. Privilégiez le « Pourquoi cela
fonctionne » plutôt que le « comment l’avons-nous codé ». Mentionnez également les éventuelles
astuces d’implémentation non triviales ou les bugs rencontrés, qui assureront aux prochains agents
de ne pas reproduire les mêmes erreurs !_
### Calcul des coefficients de Bézout
Pour récupérer les coefficients de Bézout on utilise deux entiers naturels nommé `a` et `b`. En premier lieu on va stocker `a` et `b` dans un `tableau de reste` (`r`), ensuite on va stocker 0 et 1 dans un `tableau de x`, nommé `x`, de même avec 1 et 0 pour un `tableau de y`, nommé `y`, ainsi que 0 et 0 pour le `tableau des quotients` (`q`).
On va ensuite itérer tant que le `reste actuel` est plus grand que 0. Dans chaque itération on va ajouter au `tableau des restes` le `reste de la division entière` de l'avant dernier et du dernier élément de l'index courant.
$`r[i - 2] mod\, r[i - 1]`$
Si le reste à l'indice actuel est plus grand que 0, alors on ajoute au tableau des `x` et `y` les calculs suivants :
$`x[i - 2] - q[i] * x[i - 1]`$
$`y[i - 2] - q[i] * y[i - 1]`$
Pour terminer, on retourne les deux derniers points stockés en `x` et `y`.
### Calcul de l'inverse modulaire
Pour calculer l'inverse modulaire on utilise le chiffre à inverser modulairement, nommé `a`, et le chiffre modulaire, nommé `n`.
Il faut en premier temps récupérer les coefficients de Bézout de `a` et `n`.
Chaque nombre possède au maximum un seul inverse modulaire, mais il se peut qu'il n'en ait pas.
Une fois récupérés on vérifie que le produit de `a` et du premier coefficient de Bézout modulo `n` est égal à 1.
$`a * coefficients[0] mod\, n`$
Si c'est le cas, cela signifie qu'on a trouvé l'inverse modulaire que l'on va ensuite retourner.
$`coefficients[0] mod\, n`$
### Calcul de la puissance 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.
$`64+32+8+4=108`$
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^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
```
La troisième étape on reprend la décomposition de l'étape 1 et on calcul cette dernière à partir du tableau de l'étape 2.
$`14^{108} = 14^{64} * 14^{32} * 14^8 * 14^4`$
$`14^{108} mod\, 22 ≡ (4 * 20 * 16 * 4) mod\, 22 ≡ 5120 mod\, 22`$
Le résultat de notre exemple est donc $`5120 mod\,22 = 16`$
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`.
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.
### 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.
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 chaque `x` du message, pour chacun des `x`, 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.
## Résultat
- Présentation de votre réalisation.
- Présentation des résultats obtenus (performaences, précisions, ...).
- Figures/tables/graphiques (avec commentaires, mise en évidence des points importants) (il faut qu'on puisse comprendre la raison de la présence de l'image).
### Sortie
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.
### Explication
La raison pour laquelle on arrive à décoder un message aussi rapidement est due à l'utilisation des mathématiques modulaires. À l'aide du modulo, on travaille avec des petits chiffres ce qui réduit la complexité des calculs que doit faire la machine.
## Conclusion
\ No newline at end of file
## Conclusion
- Rappel de votre réalisation.
- Résumé des résultats importants.
- Ouverture sur la suite :
- Quelles améliorations sont possibles ?
- Comment poursuivre le travail ?
- Comment l'intégrer dans un cadre plus large ?
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment