diff --git a/readme.md b/readme.md index 2d3a626067126d7545c10d35c812fd1bea9b2493..3002571bc72edfd5e8c8410727f8e242e44628f2 100644 --- a/readme.md +++ b/readme.md @@ -1,14 +1,21 @@ -# 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 ?