Garçon devant un ordinateur.jpg
Hollie Little Pink Laptop.jpg
À propos • Aide • Le Livre d'or
Les lecteurs de Vikidia demandent des articles en plus. Voyez la liste d'articles à créer, et venez nous aider à les rédiger !

Utilisateur:Thilp/Brouillons/Chirurgie esthétique

Aller à la navigation Aller à la recherche

Rivest Shamir Adleman (dont le sigle, plus utilisé, est RSA) est un algorithme cryptographique à clé publique : il permet de chiffrer des données (messages, fichiers, etc.) en utilisant le principe de la clef publique, et est très utilisé dans le domaine du commerce électronique (pour les cartes bancaires, en particulier) et des communications militaires.

Historique[modifier | modifier le wikicode]

RSA est un sigle qui rassemble les initiales de ses trois créateurs : les mathématiciens Ronald Rivest, Adi Shamir et Leonard Adleman. Ils ont décrit RSA en 1977, qui a été breveté par le MIT en 1983. Le brevet a expiré en 2000 : cela signifie qu'aujourd'hui, tout le monde peut l'utiliser en toute liberté.

Le principe de la cryptographie asymétrique (c'est-à-dire à clef publique), inventé en 1976 par W. Diffie et M. Hellman, existait donc avant RSA ; mais aucun algorithme n'était encore conçu pour l'utiliser. La légende raconte que Ronald Rivest a imaginé les bases d'un tel algorithme (RSA, donc) lors d'une soirée arrosée chez ses étudiants !

Applications[modifier | modifier le wikicode]

Le commerce électronique (puces électroniques, transactions par Internet) et la sécurité militaire sont les principaux domaines d'utilisation du système RSA. Malheureusement, les mafias ou le terrorisme pourraient également se servir d'un tel moyen de communication ...

De nombreux systèmes de cryptographie s'inspirent de RSA pour renforcer encore la sécurité des messages : en particulier, le système PGP et ses variantes. Tous ces systèmes sont basés sur l'utilisation d'une fonction asymétrique, utilisée dans RSA.

Principe de base de la cryptographie à clef publique[modifier | modifier le wikicode]

  • Cette section ne donne que les informations de base. Vikidia possède un article dédié (et donc plus riche) à ce sujet : Clef publique.

Prenons deux personnes quelconques : Artémis et Bigorneau.

Artémis veut envoyer des messages à Bigorneau, mais elle ne veut pas que quiconque d'autre puisse les lire. Elle utilise donc un système de codage simple, à clef secrète. Seuls elle (pour chiffrer) et Bigorneau (pour déchiffrer) connaissent la clef choisie par Artémis.

Mais Artémis change de ville et se fait plein d'amis. Si elle garde le système de la clef secrète, elle doit créer énormément de nouvelles clefs, autant qu'elle a d'amis (car elle ne réutilise pas la même clef plusieurs fois, bien sûr). Que faire si elle a des millions d'amis ? Elle ne peut quand même pas créer des millions de clefs secrètes : c'est ingérable !

Elle a alors recours au système de la clef publique. Elle se fabrique une clef publique, et la clef privée qui va avec. La clef publique ne servira qu'à chiffrer les messages, et la clef privée seulement à les déchiffrer. Puisqu'il faut la clef privée pour déchiffrer, Artémis peut donner sa clef publique à tout le monde, à ses millions d'amis, qui pourront seulement chiffrer des messages avec. Ils ne pourront rien déchiffrer en connaissant seulement la clef publique, et donc les messages des autres seront en sécurité ! Artémis sera la seule à pouvoir lire les messages qu'on lui envoie.

L'élément fondamental de la cryptographie : la clef[modifier | modifier le wikicode]

Principe[modifier | modifier le wikicode]

Dans tous les systèmes de codage, on utilise ce que l'on appelle une clef. C'est cette clef qui transforme le message, et qui, dans le cas d'une cryptographie symétrique, la plus courante, peut le décoder.

Par exemple : mon message est : « Vikidia ». Je veux le coder.
Disons que chaque lettre du mot est remplacée par son numéro dans l'alphabet (A = 1, B = 2, C = 3, ... , Z = 26). On obtient donc, à la place de « Vikidia », 22 ; 9 ; 11 ; 9 ; 4 ; 9 ; 1. Si ma clef est une fonction du type (c'est-à-dire que la lettre codée est le numéro de la lettre d'origine, plus trois), alors mon message codé sera 22+3 ; 9+3 ; 11+3 ; 9+3 ; 4+3 ; 9+3 ; 1+3, soit : 25 ; 12 ; 14 ; 12 ; 7 ; 12 ; 4, soit : YLNLGLD ! Ainsi, par ma clef privée , VIKIDIA devient YLNLGLD. On parle de clef privée car il faut la garder secrète (privée) si mon message veut le rester ! Il faut seulement la donner au destinataire du message, pour que lui seul puisse le lire.

Ce destinataire du message codé pourra donc le déchiffrer en inversant la clef, c'est-à-dire en appliquant la fonction .

Message clair : V I K I D I A
Équivalent en nombres : 22 9 11 9 4 9 1
Clef de chiffrement :
Résultat de l'opération : 25 12 14 12 7 12 4
Message chiffré : Y L N L G L D
Récapitulatif : chiffrage simple de « Vikidia »

Détail d'une paire de clefs publique/privée[modifier | modifier le wikicode]

En cryptographie, on appelle trousseau de clefs le couple clef publique/clef privée.

Pour créer son trousseau de clefs pour RSA, il faut effectuer plusieurs opérations. Une mauvaise conception peut détruire la sécurité du système, il faut donc faire très attention ! Les étapes nécessaires sont :

  1. Choix de deux nombres premiers, nommés en général et .
    On calcule . Plus ces deux nombres seront grands, plus la clé sera sûre, parce que les ordinateurs ont du mal à retrouver et (à partir de ) lorsque ceux-ci sont très grands. C'est là toute la sécurité du RSA ! On appelle factorisation d'un produit de nombres entiers l'action de retrouver et en partant de . sera le module de chiffrement (le modulo).
  2. Calcul de l'indicatrice d'Euler, c'est-à-dire le nombre .
    Concrètement, c'est le nombre d'entiers naturels premiers avec (c'est-à-dire les tels que ).
    , et donc et , doivent absolument rester secrets ! Dans le cas contraire, si une personne mal intentionnée les connait, celle-ci peut trouver la clef privée très facilement.
  3. Choix d'un nombre tel que soit premier avec .
    C'est-à-dire que (autrement dit, le plus grand diviseur commun à et à doit être 1).
  4. Choix d'un nombre tel que .
    En français, cela veut dire que doit valoir (ou l'un de ses multiples) plus un, le tout divisé par (voir l'article Modulo).

Exemple de création[modifier | modifier le wikicode]

  • choisissons = 593 et = 613. vaut donc .
  • .
  • .
  • .
  • On a donc :
    • = 363509
    • = 5
    • = 72461

Notre trousseau de clefs va donc se présenter sous cette forme :

  • Clé publique (distribuable à tout le monde) : , soit
  • Clé privée (à garder secrète !) : , soit

Fonctionnement d'un trousseau RSA[modifier | modifier le wikicode]

Cryptage[modifier | modifier le wikicode]

  • Tout d'abord, (re)précisons bien une chose :
    on se sert de la clef publique de quelqu'un pour lui envoyer des messages cryptés ;
    attention à ne pas confondre, ce n'est pas lui qui utilise sa clef publique pour nous écrire !


L'intérêt du RSA, c'est d'utiliser une fonction asymétrique : on ne peut l'inverser qu'à certaines conditions, c'est-à-dire, ici ... seulement si l'on en est le créateur !

Nous avons vu comment inverser une clef secrète : par exemple, dans le chiffre de César, au lieu d'effectuer la transformation « trois lettres après », on faisait « trois lettres avant ». Alors, comment une clef peut-elle être impossible à inverser ?

Il faut se servir du principe du modulo.

Article détaillé : Modulo

Voici une clef publique : .

  • le module de chiffrement de la clef ;
  • est en est l'exposant.

Voici comment ils sont utilisés :

  • pour commencer, donnons-nous un message à chiffrer : . Il contient des informations sur les services secrets d'un pays.
  • On effectue l'opération .
    Cela signifie qu'on prend notre message (sous forme d'un nombre), qu'on l'élève à la puissance , et qu'enfin on applique au résultat un modulo  ; on a alors le message chiffré .
Exemple[modifier | modifier le wikicode]

Nous allons chiffrer notre message = « VIKIDIA » avec la clef publique (2501 ; 7) :

  1. On remplace les lettres par leur numéro dans l'alphabet (comme tout à l'heure) :
    V = 22, I = 9, K = 11, ...
    « VIKIDIA » est donc « pré-chiffré » en « 22-09-11-09-04-09-01 ».
  2. On regroupe par deux les nombres obtenus :
    « 22-09-11-09-04-09-01 » devient ainsi « 2209-1109-0409-0127 »
    Il faut obtenir dans tous les cas des nombres de même longueur (ici, quatre chiffres). On peut remarquer que, comme le mot Vikidia contient un nombre impair de lettres, le « A » (pré-chiffré par « 01 ») ne peut pas être associé à une autre lettre. Pour qu'il ne reste pas tout seul (et donc faire un nombre à quatre chiffres comme il le faut), on rajoute après lui un nombre choisi, qui n'est pas une place dans l'alphabet ; par exemple, 27 : cela fait donc « 0127 ».
    Remarque très importante : pour des raisons mathématiques, le module de chiffrement choisi doit être plus grand que le plus grand nombre qu'on veut chiffrer ! Ici, on a évidemment choisi un bon module : 2501 est plus grand que 2209.1
  3. On applique l'exposant à chacun des nombres à quatre chiffres formés :
    Il s'agit simplement de monter chaque nombre à la puissance demandée. Ici, l'exposant de chiffrement vaut 7, j'élève donc chaque nombre à la puissance 7 :
    et, de même,
    .
    Pour le moment, à mi-chiffrement, notre « VIKIDIA » vaut donc « 256666986187667409334369-2063102584170216968669-1914534320537457769-532875860165503 »
  4. Enfin, on applique le module de chiffrement :
    Rappelons qu'ici, il vaut 2501. Dans l'article modulo, on explique comment marche cette opération. Là, on indique juste le résultat : .
    Pour le reste du message, cela fait :

Par la clef publique (2501 ; 7), « VIKIDIA » est chiffré en 1538-538-368-2484.

Ce qui empêche d'inverser une clef publique, c'est le module de chiffrement, parce qu'une fois que j'ai , comment puis-je deviner combien de fois j'ai soustrait 2501 à  ? C'est impossible !

  • Mais si personne ne peut le décoder, le destinataire ne peut pas lire le message !

Si, parce que ce destinataire (celui qui a créé sa clef publique), a en même temps créé sa clef privée.

Décryptage[modifier | modifier le wikicode]

Il suffit de suivre les mêmes opérations que pour le cryptage, mais en sens inverse et avec la clef privée. Pour cela, il faut savoir que la clef privée associée à (33 ; 3) est... (33 ; 7) !

Cependant, à cause d'une propriété (la taille, trop faible) de cette clef publique, celle-ci n'est pas utilisable dans cet exemple. Nous allons donc considérer notre second trousseau qui, lui, est nettement suffisant : clépublique = (363509 ; 5) ; cléprivée = (363509 ; 72461). Par cette clé, VI est codé en 31015.

On récupère donc tous les Yi qu'on nous a envoyés grâce à notre clef publique. On procède comme si l'on cryptait chaque Yi, sauf que l'on se sert cette fois de la clef privée ; pour Y1, cela donne :

On retrouve bien notre 2209 qui, une fois décomposé, signifie VI !

Faiblesses, failles : casser RSA... oui, c'est possible ![modifier | modifier le wikicode]

Taille des clés dans le fonctionnement[modifier | modifier le wikicode]

Précédemment, nous avons délaissé la clé publique (33 ; 3) au profit d'une autre, (363509 ; 5). Pourquoi ?

La première chose à remarquer, c'est la différence entre les deux modules de chiffrement (les modulo) : 363509 est bien plus grand que 33 ! Cela a beaucoup d'importance. Pour mieux comprendre, nous allons tenter de décoder VI codé par (33 ; 3).

Y1 = 25 (c'est notre VI, mais crypté, voir l'opération ici)
Y1d = 257 = 6103515625
Y1d mod. 33 = 6103515625 mod. 33 = 31
Ce n'est pas le bon résultat ! On attendait 2209, c'est-à-dire VI.

Pourquoi cela ne fonctionne-t-il pas ? C'est que notre clef est trop petite ; en effet, on ne peut pas avoir 2209 en appliquant un modulo 33, parce que la définition du modulo est « soustraire 33 jusqu'à ce que le résultat soit plus petit que 33 (ou égal à 33) ». Or 2209 est plus grand que 33, on a donc continué à soustraire. Il nous faut alors choisir un module de chiffrement plus grand, ce que nous avons fait en prenant 363509. Bien sûr, n'importe quel module supérieur à 2626 (pour coder ZZ, les deux lettres de l'alphabet ayant le plus grand nombre associé) aurait fait l'affaire.

Taille des clefs dans la sécurité[modifier | modifier le wikicode]

(33 ; 3) fait une longueur de 7 bits, c'est minuscule. (363509 ; 5) fait une longueur de 20 bits, c'est déjà mieux, mais toujours ridicule face à la puissance des ordinateurs et des algorithmes de calcul. Aujourd'hui, il est recommandé d'utiliser des clés de 1024 bits, mais on préfèrera du 2048 bits pour plus de sûreté. Une clef de 2048 bits ressemble à cela :

> :

Ce n'est pas rien. Pourquoi a-t-on besoin de tels nombres ?

Nous avons vu qu'il faut pour créer son trousseau deux nombres entiers premiers, p et q. Ces nombres sont aussi utilisés pour déterminer l'indicatrice d'Euler , qui elle permet de créer sa clé privée. Il est donc indispensable de conserver p et q secrets !

Les machines à calculer parviennent très bien à calculer un produit (le résultat d'une multiplication) ; ainsi, on peut avoir p et q long chacun comme les nombres écrits plus haut, cela ne pose aucun problème2 et p × q est effectué en très peu de temps. En revanche, ces machines ont d'énormes difficultés à faire l'opération dite de « décomposition en facteurs premiers »3 dès lors que les nombres deviennent très grands. Ainsi, les plus puissants ordinateurs ne parviendront pas à décomposer le n de la clef de 2048 bits montrée précédemment, ou alors en travaillant pendant une durée équivalente à plusieurs milliards d'années (ce qui, d'un point de vue humain, est inacceptable).

Cependant, avec des clés plus petites, de l'ordre de 512 bits et moins, il est possible de retrouver p et q. Plus le module de chiffrement est petit, plus il est simple de le décomposer ! Avec un ordinateur pas très récent et un logiciel de calcul formel renommé, 33 est décomposé en moins d'une seconde : 11 × 3 (même une calculatrice le fait). 363509 en une seconde : 593 × 613. 487244884854344046304090844893 (100 bits) est décomposé en 20 secondes : 669536424408869 × 727734693873497. Mais pour décomposer un module de chiffrement de 120 bits4, il faut plus de 3 minutes 30 ! On observe que le temps nécessaire à la décomposition augmente beaucoup plus rapidement que la taille de la clé. Plus une clé est grande, moins il y a de risques de la voir « cassée », c'est-à-dire de découvrir la clé privée associée. Les communications importantes entre gouvernement (utilisant des systèmes semblables à RSA) utilisent des clés de 4096 bits, voir davantage. Cela garantit une excellente sécurité.

Et demain ?[modifier | modifier le wikicode]

Selon la loi de Moore, la puissance des ordinateurs double tous les 18 mois. Il faut donc s'attendre à voir les algorithmes de décomposition en facteurs premiers de plus en plus efficaces. De plus, il est possible que des algorithmes plus performants que ceux qu'on utilise actuellement voient le jour dans un futur proche... Et le développement de l'ordinateur quantique pourrait annoncer la fin des cryptosystèmes tels que RSA, car ils sont présentés comme extrêmement puissants. Cependant, il faut noter que leur record de décomposition est, en octobre 2001, la factorisation de 15 = 3 × 5 !

Sources[modifier | modifier le wikicode]

Références[modifier | modifier le wikicode]

  1. Sinon, si le module est plus petit que le nombre, lorsqu'au déchiffrement on retombe sur 2209, il faut encore appliquer le modulo (jusqu'à ce que le résultat soit plus petit que ). Du coup, on se retrouve avec un nombre plus petit que mais qui n'est pas 2209, et donc qu'on ne peut pas retraduire en le « VI » de « VIKIDIA » : le message est perdu !
  2. Si l'ordinateur est fait avec un bon microprocesseur et beaucoup de mémoire vive).
  3. C'est-à-dire de trouver p et q à partir de n, quand on a fait p × q.
  4. 1052390768280803703434522530823316727 = 987352900158569603 × 1065870944534410109
Portail de l'information —  Tout sur les écritures, les codes secrets, les médias...

Catégorie:Technique Catégorie:Informatique Catégorie:Article long à illustrer

wp:Rivest Shamir Adleman simple:RSA