RSA
Le plus connu des algorithmes asymétriques
Généralités
C’est l’algorithme à clé publique le plus répandu, et le plus populaire. Il a été inventé en 1977 par Ron Rivest, Adi Shamir et Leonard Adleman (le GCHQ anglais aurait eu en fait un peu d’avance).
Cet algorithme peut être utilisé pour :
— la confidentialité
— la signature électronique
— l’échange de clés symétriques.
Sa sécurité repose sur la difficulté de factoriser les grands nombres (bien que ça ne soit pas mathématiquement prouvé, ce n’est qu’une conjecture).
Une longueur de clé de 512 bits n’est aujourd’hui plus vraiment
suffisante, on lui préférera du 1024 ou du 2048 bits. A vrai dire, même le 1024 commence à vieillir… Mais des longueurs de clé telles que 2048 mettent probablement RSA à l’abri
pour encore bien des années. Ce qui pourrait complètement compromettre la sécurité de RSA serait une avancée mathématique qui aurait pour conséquence de faciliter la factorisation des grands nombres (mais il est possible qu’une telle avancée soit mathématiquement interdite). Ou bien la construction de “machines à factoriser” révolutionnaires.
Principe
Choisir deux grands nombres premiers (au moins 200 chiffres, chacun
d’une longueur d’à peu près la moitié de la taille de clé voulue, voir Miller-Rabin pour un test de primalité probabiliste) :
p et qCalculer : n = p*q Pour obtenir la clé publique de chiffrement : choisir e tel que :
Pour obtenir la clé privée de déchiffrement : choisir d tel que :e et (p-1)(q-1) soient premiers entre eux.
phi(n) = (p-1)(q-1) est la fonction d’Euler qui donne le nombre d’entiers premiers à n et inférieurs à n)
ed = 1mod[(p-1)(q-1)](ou encore d tel que (ed-1) soit divisible par (p-1)(q-1)) soit : d = e^(-1)mod[(p-1)(q-1)] (on utilise pour cela l’algorithme d’Euclide étendu) La clé publique est constituée de : e et n (c’est la longueur en bits de n qui donne la longueur de la clé RSA utilisée) La clé privée est : d et n Chiffrement et signature sont mathématiquement les mêmes opérations, ce n’est que par convention que l’on choisit que telle clé sera celle de chiffrement et telle autre celle de déchiffrement. Pour chiffrer un message m, on le découpe en blocs de taille plus petite que la clé et tels qu’ils aient une représentation unique modulo n (en binaire on pourra prendre la plus grande puissance de 2 inférieure à n) Les blocs Ci de texte chiffré se calculent à partir des blocs Mi du texte clair par (ils auront la même taille que la clé) :
Ci = (Mi^e)mod(n)Pour déchiffrer les blocs chiffrés Ci, il suffit de les exponentier par d :
Mi = (Ci^d)mod(n)
Utilisation dans la pratique
Utilisation de certificats :
Afin de s’assurer de l’appartenance d’une clé publique on utilisera souvent des certificats X.509v3, bien que PGP et GPG (autres formats, et non signés par une Autorité) en soient des contre-exemples de poids. Le certificat contient une clé publique, et la signature d’une autorité reconnue par les protagonistes. Cette clé pourra aussi bien être une clé de chiffrement, une clé de vérification ou bien une clé qui remplira les deux fonctions.
Chiffrement :
Dans la pratique (voir plus bas) on utilise souvent une combinaison de RSA et d’un algorithme symétrique. On chiffre tout d’abord les données à l’aide d’une clé symétrique aléatoire, puis on chiffre cette clef à l’aide de la clé publique du destinataire et on joint enfin cette clé symétrique chiffrée aux données chiffrées. Le destinataire déchiffrera cette clé symétrique à l’aide de sa clé asymétrique privée, puis déchiffrera les données à l’aide de la clé symétrique. S’il y a plusieurs destinataires, chacun aura sa copie de la clé symétrique chiffrées avec sa clé publique. Voir la page sur le chiffrement mixte.
Signature et intégrité :
Pour la signature et l’intégrité on passera tout d’abord les données à signer au travers d’une fonction de condensation (ou de hachage), puis on chiffrera à l’aide de la clé privée RSA le résultat (condensât ou “hashcode”). Ce dernier résultat sera ajouté aux données, ainsi par exemple que le certificat associé à la clé publique. Le destinataire déchiffrera ce résultat à l’aide de la clé publique, passera les données au travers de la même fonction de condensation, et comparera les deux résultats obtenus : s’ils sont égaux il aura l’assurance que les données n’ont pas été modifiées et que l’identité inscrite sur le certificat de l’expéditeur est bien la même que celle qui à signé. Voir la page sur la signature.
Vitesse :
La vitesse de RSA, qui est imposée par la vitesse des exponentiations modulaires, est au mieux environ 1000 plus faible qu’un DES réalisé en matériel (si le DES est en soft, RSA est environ 100 fois plus lent).
Doubler la taille de la clé :
• multiplie par 4 le temps des opérations utilisant la clé publique
• multiplie par 8 le temps des opérations utilisant la clé privée
• multiplie par 16 le temps de génération des clés (et dans les cartes à puces à microprocesseur, ça se sent…)
Si RSA est réalisé sur des cartes à puce, il sera encore plus lent (notamment la génération).
La faible vitesse de RSA le rend peu propice au chiffrement de grandes quantités de données, c’est pourquoi on adoptera souvent des cryptosystèmes mixtes constitués de la combinaison d’un algorithme symétrique et d’un algorithme asymétrique.
Pour augmenter la vitesse des processus, on peut choisir certaines valeurs particulières de e :
3, 17 ou 65537 par exemple. Cette dernière valeur est celle recommandée par la norme X509. Il n’y a aucune faiblesse connue à choisir ces données arbitraires de e (qui peuvent être partagées entre tout un groupe d’utilisateurs). Il faudra cependant veiller à ce que les p-1 et q-1 ne soient pas des multiples de la valeur choisie.
Trouver des nombres premiers est lent. La plupart des implémentations ont donc recours à des algorithmes probabilistes de test de primalité pour déterminer p et q, comme le test de primalité de Miller-Rabin. Les nombres p et q ont alors une probabilité d’être premiers. Il est possible de rendre cette probabilité aussi faible que l’on veut. Seul peu de nombres échouent
aux tests de primalité : ce sont les nombres de Carmichael, il y en a peu et on peut facilement les écarter.
Sécurité et attaques :
La sécurité d’une clé RSA et d’une clé DES symétrique de même taille n’est pas comparable.
Il peut aussi être vulnérable si la même paire de clé est utilisée à la fois pour chiffrer et pour signer : l’attaquant peut faire signer à la victime des données, ce qui mathématiquement est équivalent à un chiffrement et disposer ainsi d’un texte clair connu… ce qui peut permettre certaines attaques… en théorie.
Bien que le nombre de nombres premiers soit infini, le nombre disponible pour une longueur de clé fixé est limité. Mais pour une clé de 512 bits par exemple, il y en a à peu près 10^150 de longueur égale ou inférieure, ce qui rend une attaque par essai exhaustif des nombres premiers… longue, très longue.
Standards et protocoles :
RSA est une composante de nombreux protocoles ou spécifications :
SSL/TLS
IPSec
S/MIME
Certains PKCS
…
RSA fait partie de nombreux staldards comme :
ISO 9796
ITU-T X.509 (standard sécurité)
ETEBAC 5 (standard français du secteur bancaire et financier)
ANSI X9.31 rDSA
X9.44 draft (standard américain du secteur bancaire et financier)
AS2805.6.5.3 (standard de gestion des clés australien)
SWIFT (standard interbancaire international)