La cryptographie asymétrique avec RSA

Chiffrer ses données avec RSA

a marqué ce sujet comme résolu.

Bonjour à tous,

J'ai commencé (il y a 2 mois) la rédaction d'un tutoriel dont l'intitulé est La cryptographie asymétrique avec RSA.

J'aimerai obtenir un maximum de retour sur celui-ci, sur le fond ainsi que sur la forme, afin de proposer en validation un texte de qualité.

Si vous êtes interessé, cliquez ci-dessous

Merci d'avance pour votre aide

+0 -0

Bonjour,

Il semblerait que le tutoriel ici présenté soit incomplet puisque vous annoncez dans diverses introductions des parties que l'on ne peut encore lire. Aussi, excusez-moi si ce que je vais dire est prévu mais pas encore rédigé.

Lorsque vous présentez le fonctionnement de RSA en pratique, vous appliquez le chiffrement sur chaque caractère. Ce faisant, le résultat final est un simple algorithme de substitution sur les N caractères Unicode utilisables. Pire encore, la table de substitution peut être générée automatiquement puisque la clé publique est accessible à tous. En somme, un message chiffré comme vous le faites ne résisterait pas plus de quelques minutes…

PS : utiliser la bibliothèque GMP est une très bonne idée. À noter cependant qu'elle est indispensable au fonctionnement du noyau Linux depuis déjà un certain temps, aussi il n'est nul besoin de l'installer sur un GNU/Linux un tant soit peu récent.

+0 -0

En fait, ce message a été généré automatiquement suite à la mise en bêta d'une version du tutoriel. À la base, il a été importé d'Openclassrooms et je me suis occupé de le nettoyer un peu, notamment les aspects mathématiques. Malheureusement, je n'ai pas les connaissances en cryptographie nécessaires pour expliquer correctement l'aspect pratique de RSA.

+0 -0

Je viens de relire le tuto en détail et il va falloir le réécrire en grande partie : tout est mélangé entre théorie mathématique, explication de l'algorithme RSA, utilisations pratiques dans la vraie vie et implémentation en C++ des différents algorithmes mentionnés.

Je pensais réorganiser le tuto en suivant ce plan. D'abord une partie historique, où l'on présente le concept de cryptographie asymétrique et les outils mathématiques utilisés par RSA. Puis une explication détaillée de l'algorithme RSA, avec des exemples simples et les démonstrations mathématiques adéquates. Ensuite on embraye sur l'utilisation de RSA dans la vraie vie : pourquoi les exemples simples utilisés sont faibles, comment on fait en vrai, comment RSA peut-il être attaqué. Enfin, la partie sur GMP et l'implémentation effective de l'algorithme : à mon sens, cette dernière partie n'est même pas indispensable, puisqu'elle nécessite une bonne connaissance du langage utilisé pour l'implémentation et pénalise ceux qui ne le connaîtraient pas.

Qu'en penses-tu ?

+0 -0

Ça me semble une excellente idée. ^^

Par contre, comptes-tu mélanger explications mathématiques (nombres premiers, congruences, Bézout…) et informatiques (détails de l'algorithme) ? Je me disais que ce tutoriel pourrait constituer une bonne introduction à l'arithmétique.

Tu as des remarques à partir d'ici aussi.

Comme dit précédemment, je peux t'aider pour les aspects mathématiques mais c'est tout.

Edit : je ne suis pas là en semaine, donc ne m'attends pas pour éditer le cours ! :P

+0 -0

Voilà, s'il n'est pas trop tard, tu pourras voir mon travail de la journée ; je continuerai demain.

Pour l'instant, j'ai créé une partie 3 dans laquelle j'ai mis tout ce que j'ai écrit : si celle-ci te convient, il suffira de supprimer les deux premières parties quand elle sera achevée. Les deux premiers chapitres sont terminés, j'ai seulement posé les bases du troisième chapitre où j'aborderai les utilisations de RSA dans la vie réelle.

Donne-moi ton avis.

+0 -0

J'ai pour l'instant lu la première partie : "Un peu d'histoire et beaucoup de mathématiques". J'aime beaucoup.

Quelques suggestions/remarques :

  • Un schéma représentant les deux amoureux et le cochon pourrait être sympathique : ça poserait visuellement le problème et permettrait d'illustrer le reste du cours.
  • Dans la division euclidienne, tu ne mentionnes pas la condition $0 \leq r < b$. Est-ce volontaire ?
  • Un nombre premier est différent de 1.
  • Tu ne mentionnes pas le caractère infini de l'ensemble des nombres premiers, ce qui est, me semble-t-il important : sinon, il existerait un nombre fini de clés.
  • Pour les congruences : $n$ non nul.
  • Trois propriétés des congruences utiles par la suite mais deux énoncées.
  • $a \equiv b[n] \Leftrightarrow n \ | \ a - b$
  • Démonstration de ces propriétés, pour clarifier le concept de congruence ?
  • pgcd(a, b) = $a \wedge b$
  • Pour le Petit théorème de Fermat, peut-être donner également $a^{p} \equiv a \ [p]$.
  • Expliquer pour on a l'équivalence (aisément avec Gauss) ?

Peut-être manque-t-il un peu de précisions mathématiques si l'on veut que le cours soit compris par des lycéens. Il faudrait plus d'exemples et pourquoi pas quelques démonstrations pour éviter l'effet "liste de résultats sortis de nul part". =)

Je n'ose pas trop modifier ton travail exceptionnel donc je te laisse considérer ces remarques. =)

Edit : "L'algorithme proprement dit"

  • Un message plus médiéval et plus comique ?
  • Expliciter la fonction : tout le monde ne connait pas cette notation.
  • Expliquer : "D'emblée, on comprend qu'il n'est possible de chiffrer que des nombres strictement inférieurs à $N$".
  • Clarifier la mise en page de la démonstration (en utilisant deux espaces pour aller à la ligne).

La partie "Qui es-tu, belle inconnue ?" est très intéressante mais aussi très lourde. Personnellement, je peine à suivre : il faudrait illustrer avec des exemples ou en utilisant des schémas. D'ailleurs, quand on jette un coup d'oeil à la partie, on aperçoit un énorme bloc de texte un peu rebutant. C'est dommage, parce que c'est presque le plus important du tutoriel !

+0 -0

Je réponds à tes remarques.

  • Concernant les illustrations, je n'en ai pas mis parce que je suis une bille en illus : quand je fais des schémas, c'est presque toujours très très moche. Mais j'ai bien conscience qu'il en faudrait.
  • Pour les 4 points suivants, j'ai fait les modifs.
  • J'avais mis trois propriétés avant de me rendre compte qu'une d'entre elles ne servait jamais, mais j'ai oublié de corriger le compte. Cela dit, ta proposition fait une troisième propriété tout à fait valable, je l'ajoute.
  • Concernant d'éventuelles démonstrations supplémentaires, je ne suis pas trop pour a priori. Dans le civil, je suis historien, pour moi les maths se sont arrêtées en Terminale, j'ai le niveau d'un bon lycéen. Et en gros, j'ai essayé d'expliciter toutes les démos et tous les calculs que je ne comprenais pas bien quand je les lisais ailleurs sur le Net. Je sais que tu aimerais en faire une première approche de l'arithmétique, mais je pense qu'il ne faut quand même pas trop s'écarter du fil rouge « RSA » : l'arithmétique mériterait son tuto à part entière. Ce que je te propose : on ne met pas de démo supplémentaire, mais quand on mettra en bêta, on demandera explicitement aux lecteurs s'ils trouvent que les parties mathématiques sont assez explicites, en particulier les lycéens. Qu'en dis-tu ?
  • Je connais cette notation pour le PGCD mais je la trouve peu lisible.
  • J'ai ajouté la troisième variante de Fermat. Par contre, c'est $a^p \equiv$ a $\ [p]$, non ?

ton travail exceptionnel

J'vais rougir. ^^

  • Plus médiéval, pourquoi pas. Faudrait alors abandonner la présentation en tableau et tout recalculer. « M'amie, onques ne vis plus gente pucele que vos ! » pour le message à chiffrer, et « Mes cuers est tuit vostre. » pour le déchiffrement ? Ça veut dire changer aussi le message d'insultes qu'envoie Ebroïn. Quelque chose dans le ton de « Ja ne vueil te reveoir, grosse vache ! » ?
  • Explicité.
  • La suite du paragraphe servait à expliquer la phrase. J'ai essayé d'être encore plus explicite.
  • Pour la mise en page de la démo, j'ai vu que tu l'avais déjà changé. À titre personnel, je trouve ça très laid. Mais si tu trouves que c'est plus clair, pourquoi pas.

Pour la troisième partie, il est vrai qu'elle est assez brutale. Il faudrait des images, cf. début du message. Des exemples numériques sur de petits nombres seraient sans doute souhaitable, mais pas ce soir.

+0 -0

En effet, peut-être que les démonstrations ne sont pas nécessaires. Je vais regarder si je ne peux pas rajouter des liens pour clarifier les aspects mathématiques.

Pour Fermat, honte à moi. C'était une faute de frappe (c'est ce qu'on dit).

Pour le côté médiéval, je pensais plus à un truc du genre chanson de Roland (que ça reste quand même compréhensible.

Pour la démonstration, on n'aura qu'à demander aux membres. D'ailleurs, à ce propos, il faudra le faire avant de supprimer l'ancienne version. ^^

Pour les schémas, il faudrait en faire une liste. Je pourrais essayer de les produire, sinon on pourra toujours demander à un membre dévoué. ^^

+0 -0

Ta chanson de Roland, c'est une traduction, c'est pas drôle ! :P Pis compte pas sur moi pour te traduire un quelconque troubadour : c'est chiant à mourir leurs séances de drague. ^^ Bon… « Quand pourrai-je te revoir, douce amie ? » et « Retrouve-moi en la Tour Magne à la minuit. », et on laisse les insultes en l'état ?

Si on laisse l'ancienne version en parallèle de la nouvelle, ça risque d'être incompréhensible, non ? Il vaudrait mieux faire une copie de l'ancienne pour l'avoir sous la main, et la supprimer : en cas de besoin, ça ne sera pas trop difficile de la remettre en ligne, juste quelques copier-coller.

Les schémas… Voyons ça…

  • les têtes de nos trois larrons, pour qu'on puisse les reconnaître par la suite, avec Ebroïn entre les deux autres qui espionne les communications
  • à la fin de « La taille, ça compte » : une image qui passe par une boite RSA et en ressort façon Canal+ sans décodeur
  • un schéma du système de signature par clé privée et comment le correspondant vérifie sa validité (pour « Qui es-tu belle inconnue »)
  • un schéma pour PGP : le message protégé par un cadenas, la clé de ce cadenas dans un coffre donné par Brunehaut, le tout envoyé avec la signature
  • un schéma pour SSL vs. WoT : d'un côté, une pyramide avec des flèches « certifie » du haut vers le bas et un agent de la NSA qui menace l'AC tout en haut, de l'autre, un réseau de flèches « certifie » à double sens et l'agent de la NSA qui se trouve con
  • pour les trois dernières sections, c'est très mathématique et je n'ai pas vraiment d'idée pour rendre ça plus « glamour »

Je précise : cette liste n'est qu'une suggestion.

+0 -0

« Douce Brunehaut, souffrez de recevoir mon ardent amour. »

« Mon preux Aldabéron, retrouve-moi en la Tour Magne à la minuit. »

« Je ne veux plus jamais te revoir, grosse vache ! » convient très bien. ^^

Pour les schémas, je vais voir ce que je peux faire.

Au fait, une fois qu'on a chiffré et qu'on a notre tableau de caractères, on fait comment pour transmettre le message ? Vu ce que tu dis après, je suppose qu'on envoie les caractères associés aux nouveaux codes, mais pourquoi ne pas directement envoyer les nombres ?

Sinon, j'ai relu « La taille ça compte » et les deux paragraphes en dessous de « Pas du tout, il faut juste ne pas l'utiliser comme un amateur. » gagneraient à être explicités. De même, je pense qu'il serait judicieux de fournir un exemple de substitution au niveau de « Or une clé publique, comme son nom l'indique, est publique. ». Seulement, il faut trouver un message qui ne fasse pas boguer le navigateur. ^^

Pour, « Qui es-tu, belle inconnue ? », il pourrait être intéressant de préciser que les fonctions de chiffrement et déchiffrement son réciproques modulo N, pour clarifier cette histoire de chiffrer avec la clé de déchiffrement. En outre, mais ce serait à faire avant, il faudrait indiquer qu'une clé publique est associée à une unique clé privée, sinon le système ne garantit pas l'identité de l'expéditeur. En outre, les notions de « condensat » et de « fonction idoine » sont un peu floues : ce sont des termes techniques ou pas ?

« Parce que Snowden n'était pas le premier » :

  • « Un système cryptographique symétrique, quel qu'il soit, peut être extrêmement solide, presque autant qu'un système symétrique. »
+0 -0

Ok pour ces phrases. Je les chiffre et les intègre au tuto dès que j'ai un moment.

En fait, l'algorithme RSA en lui-même se fout éperdument de savoir comment tu transmets le message chiffré : cette question touche à « l'utilisation dans la vraie vie ». Au final, je ne l'aborde que dans la quatrième partie, quand je parle du base64. J'ai rajouté une bricole pour faire patienter le lecteur.

Les paragraphes sur le chiffrement par bloc sont aussi détaillés que possible. En revanche, je ne comprends pas bien ce que tu entends par « un exemple de substitution ». Un exemple de comment Ebroïn s'y prend pour comprendre l'essentiel d'un message mal chiffré ?

J'ai précisé la réciprocité des fonctions de chiffrement et déchiffrement. Pour l'unicité de la clé privée associée à une clé publique, je vais mettre ça dans la section concernant le déchiffrement, puisque c'est là qu'on parle de $D$ pour la première fois.

Un condensat, c'est le résultat d'une fonction de hachage, et une fonction de hachage, c'est une fonction qui a vocation à générer un condensat à partir d'un message. ^^ La liste à puce définit ce qui est attendu d'une fonction de hachage, ce qui fait son utilité, et une fonction de hachage est une fonction qui remplit ces attentes. Il n'y a pas vraiment de définition plus simple. :)

Je pensais l'avoir corrigée, celle-là… Bon, si tu vois des horreurs dans les 4 sections suivantes, il faudra pas trop m'en vouloir : je les ai écrites entre minuit et 3h du mat. ^^

Bon, je vais m'occuper des messages d'exemple et essayer d'en trouver pour le troisième chapitre.

+0 -0

J'ai modifié la partie « La taille ça compte », en ajoutant un exemple. Ton explication sur « Pas du tout, il faut juste ne pas l'utiliser comme un amateur » est très bien. Par contre, question que je me pose et donc qu'un lecteur pourrait se poser est : si je mets les codes Unicode bout à bout et que je chiffre le tout, quand je vais déchiffrer, j'aurais un truc du genre : 156483156498594900441384789. Le premier caractère est-il un 1, un 15, un 156, un 1564 ?

Tu devrais rajouter les explications que tu m'as données sur le condensat dans le tuto. Sous forme d'un bloc "Information" par exemple, histoire de clarifier le vocabulaire.

Très bonne idée d'avoir ajouté un exemple pour la signature. Par contre, je ne comprends pas le passage de « Il commence par le découper en tronçon de quatre caractères, pour rester en dessous de la limite de 32 bits » à « ce qui nous donne 1148155235, 1696620909 et 1768235041 ». Ce n'est qu'une suggestion, mais peut-être pourrait-il être intéressant de résumer la méthode sous forme d'une liste à la fin de la partie. Avec un gros paragraphe, on comprend en détails et suit le raisonnement, mais on n'a pas vraiment de vision globale des étapes.

À la lecture de l'exemple de le partie « Parce que Snowden n'était pas le premier », je me suis rendu compte que la notion de condensat n'était pas clair du tout. Pourquoi on utilise AES et Adler-32 ? Le second sert juste à la signature ? Il pourrait être judicieux de préciser les étapes : chiffrement "symétrique" du message, chiffrement "asymétrique" de la clé, signature…

Je m'attaquerai à la suite demain. =)

+0 -0

J'ai vu ton exemple et je vois ce que tu voulais faire. Je pensais, plutôt que de ré-utiliser un message déjà connu, proposer un tableau avec les correspondances lettre->code chiffré pour les minuscules (soit 26 colonnes), fournir un message chiffré et demander au lecteur de constater par lui-même que juste avec ces 26 codes il peut déjà presque tout comprendre.

De deux choses l'une. Soit tu écris le message déchiffré en notation hexadécimale, auquel cas chaque caractère correspond à deux chiffres : dans 53616c7574, le premier caractère est 53 (= S), le second est 61 (= a), le troisième est 6c (= l), etc. Soit tu écris le message déchiffré en notation décimale, auquel cas, chaque caractère correspond à $x \cdot 256^i$ : dans 358116783476, le dernier caractère est 116, le quatrième est 117, le troisième est 108, le deuxième est 97, le premier est 83, parce que $358116783476 = 83 \cdot 256^4 + 97 \cdot 256^3 + 108 \cdot 256^2 + 117 \cdot 256^1 + 116 \cdot 256^0$. Je reconnais volontiers que c'est très enquiquinant. J'utilise la base 10 parce qu'elle est plus familière pour les lecteurs, mais dès lors qu'on travaille avec un PC (par exemple, pour la notation des caractères), il est beaucoup plus confortable de travailler en base 16 voire 256.

Pour le condensat, je verrai demain comment je peux caser ça.

On ne peut pas chiffrer de nombre supérieur à $N$. Par conséquent, si je choisis un $N$ à peine supérieur à $2^{32}$, comme c'est le cas dans cette section-là, je ne peux chiffrer que 32 bits d'information à la fois, puisque qu'un entier non-signé codé sur 32 bits sera compris entre 0 et $2^{32} - 1$. Par conséquent, si mon message prend plus de 32 bits de place, je dois le découper en tronçons de 32 bits et chiffrer chaque tronçon l'un après l'autre. C'est exactement ce qu'on faisait au début en chiffrant chaque caractère un à un : on découpait le message en tronçons de 8 bits (même si avec $N = 5141$, en fait, on pourrait chiffrer 16 bits).

J'ai peur qu'un résumé en fin de partie soit vraiment redondant. On donne une première fois l'explication sous forme de petite histoire généraliste avec Adalbéron et compagnie. Puis on donne l'explication une seconde fois à travers un exemple comcret, avec de vrais nombres. Si on ajoutait un résumé, cela reviendrait à donner trois fois la même explication dans chaque section. ;)

En effet, le second sert juste à la signature. Mais il est irremplaçable. Ebroïn peut tout à fait envoyer à Brunehaut un message d'insultes chiffré par AES et la clé AES chiffrée par RSA : il manquera toujours un moyen d'être certain de l'identité de l'expéditeur d'un message donné. En fait, la signature par clé privée peut être utilisée même dans un contexte où les messages sont publics. Pense à tous les sites où tu peux poster un commentaire sans être identifié (blogs, PEBKAC, etc.) : n'importe qui peut prendre n'importe quel pseudo. Par exemple, Brunehaut ouvre un blog, donne l'adresse à tout le monde, Ebroïn laisse un commentaire (public !!) avec le pseudo « Adalbichou » où il dit que le texte est à chier et que les couleurs du site sont dégueulasses. Adalbéron peut prouver que ce n'était pas lui en signant ses vrais commentaires (publics, toujours) avec sa clé privée. Faudra que je fasse un paragraphe là-dessus dans la section idoine.

Il pourrait être judicieux de préciser les étapes : chiffrement "symétrique" du message, chiffrement "asymétrique" de la clé, signature…

Les étapes sont pourtant indiquées assez clairement !

  1. Il chiffre son message à l'aide de l'algorithme symétrique AES et de la clé « 4891e674ff312b9519df3245b7d1c3ff ». Pour la petite histoire, il s'agit du condensat MD5 de « Brunehaut, je te kiffe ! ». Le résultat (découpé en tronçons de 32 bits et en notation hexadécimale, pour plus de clarté) est le suivant : « 7bd19a87 3c0f39a5 d7656446 d1d5007a 21757f1d 3a36fd25 97c527cf 5f03f75d ».
  2. Il réalise un condensat par Adler-32 de son message (4d23075c), qu'il signe à l'aide de sa fonction de déchiffrement : « c8c43b7e » (en hexadécimal, encore).
  3. Il découpe la clé qu'il a utilisé pour AES en tronçons de 32 bits et les chiffre à l'aide de la clé publique de Brunehaut : « 1bc83cd40 1bcb41456 1c1936f3f fa66823f » (en hexadécimal, toujours).

Et s'il y a un doute, la procédure de déchiffrement de Brunehaut est encore plus claire puisqu'il n'y a pas les calculs.

Cela dit, il pourrait sans doute être bien que je fasse un résumé des principales fonctions dont doit disposer une implémentation de RSA, mais dans la quatrième partie, alors.

+0 -0

En effet, donner l'exercice au lecteur est une bonne idée. =)

Adler-32 permet juste de réduire le message afin de générer une chaîne propice à la signature ?

+0 -0

Voilà, exercice donné.

Pas seulement. Il y a trois choses :

  1. Un message de n'importe quelle longueur est réduit à quelque chose de court : le but est de chiffrer moins de choses que si on chiffrait le message entier, parce que la fonction RSA est très gourmande.
  2. La fonction de hachage est à sens unique : le condensat est signé avec la clé privée de l'expéditeur, ce qui signifie que n'importe qui peut déchiffrer la signature à l'aide de la clé publique de l'expéditeur et donc retrouver le condensat ; il est donc impératif qu'il soit strictement impossible à partir du condensat de remonter au message d'origine.
  3. Les fonctions de hachage ont cela de particulier que deux messages très similaires donneront deux condensats très différents : cela permet de s'assurer que le message n'a pas été altéré pendant sa transmission. Dans la plupart des cas, une altération constatée veut juste dire que le réseau a merdé et que le fichier a été corrompu. Mais ça peut aussi vouloir dire que quelqu'un a intercepté le message, a réussi à casser le chiffrement, et à renvoyé un message modifié. D'où l'utilité de vérifier l'intégrité du message. Que par exemple, tu donnes bien l'ordre à ta banque de virer 100€ à une entreprise et pas 10000€.

Bref. Vu toutes les explications complémentaires que je dois te donner, il apparaît manifestement que ma section sur la signature numérique n'est pas claire. Je vais la réécrire, sans doute cet après-midi.

+0 -0

J'ai réécrit toute la deuxième moitié de « La taille, ça compte » et une bonne partie de « Qui es-tu, belle inconnue ? » pour être plus clair sur la question de la signature numérique et du chiffrement par blocs. Avec cette nouvelle version, en principe, la section « Parce que Snowden… » devient beaucoup plus claire. Dis-moi s'il y a encore des choses que tu ne comprends pas.

+0 -0
Ce sujet est verrouillé.