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.
_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.
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.