Chiffrement / déchiffrement RSA — RSA-OAEP, PSS et PKCS#1 v1.5
Chiffrement / déchiffrement RSA
Générez des paires de clés RSA dans le navigateur, chiffrez et déchiffrez avec RSA-OAEP, signez avec RSA-PSS ou PKCS#1 v1.5, et convertissez les clés entre les formats PEM SPKI, PKCS#8 et PKCS#1. Tout s’exécute localement avec le moteur WebCrypto — aucune clé ni aucun message ne quitte cette page.
À quoi sert RSA : aux petits messages et aux signatures, non aux données volumineuses. RSA chiffre au plus k−2·hashLen−2 octets par appel (190 octets pour une clé de 2048 bits avec SHA-256) et est environ 1000× plus lent qu’AES. Les systèmes réels utilisent le chiffrement hybride : RSA enveloppe une clé AES aléatoire, AES chiffre les données (voir l’outil AES). Cette page sert à l’apprentissage, aux tests et aux vérifications d’interopérabilité.
1. Générer une paire de clés(WebCrypto, local ; les quatre formats PEM sont produits ensemble)
Taille du module :
Clé publique — SPKI(-----BEGIN PUBLIC KEY-----, le format habituel de « clé publique RSA »)
Clé publique — PKCS#1(-----BEGIN RSA PUBLIC KEY-----, module et exposant seuls)
Clé privée — PKCS#8(-----BEGIN PRIVATE KEY-----, non chiffrée ; à traiter comme un mot de passe)
Clé privée — PKCS#1(-----BEGIN RSA PRIVATE KEY-----, le format classique d’OpenSSL)
Générer une clé dans le navigateur ne la chiffre pas. Pour la stocker, placez-la dans un véritable coffre à clés ou chiffrez-la hors ligne.
2. Ou importer une clé existante(collez l’un quelconque des quatre formats PEM)
3. Chiffrer / déchiffrer (RSA-OAEP)- le sens suit la clé courante : publique = chiffrer, privée = déchiffrer
Hachage :Étiquette :
Le chiffrement PKCS#1 v1.5 n’est volontairement pas implémenté : il n’offre aucune intégrité du chiffré et tombe sous les attaques par oracle de remplissage (Bleichenbacher). OAEP est le seul mode de chiffrement qu’une nouvelle conception devrait utiliser.
4. Signer (nécessite la clé privée)- PSS (randomisé, moderne) ou PKCS#1 v1.5 (déterministe, compatible avec l’existant)
Schéma :Hachage :
5. Vérifier (nécessite la clé publique)- collez le message et la signature
Schéma :Hachage :
Quelle quantité un appel RSA peut-il transporter ?Limite de message OAEP = octets de la clé − 2× octets du hachage − 2 :
Module
SHA-256
SHA-384
SHA-512
1024 bits
62 octets
30 octets
0 octet
2048 bits
190 octets
126 octets
62 octets
3072 bits
318 octets
254 octets
190 octets
4096 bits
446 octets
382 octets
318 octets
Les signatures n’ont aucune limite de message — le message est d’abord haché ; la signature elle-même fait toujours exactement la taille de la clé (256 octets pour 2048 bits).
Robustesse et durée de vie de la clé(NIST SP 800-57 partie 1 rév. 5) : le 1024 bits a été interdit pour de nouveaux usages après 2013 ; 2048 bits est le minimum aujourd’hui et reste acceptable jusqu’en 2030 ; 3072 bits et au-delà sont le choix confortable pour 2031 et après. Le 8192 bits fonctionne ici, mais sa génération peut prendre une minute ou plus dans le navigateur et n’apporte pas une sécurité dont quiconque a besoin aujourd’hui — préférez 3072/4096.
Interopérabilité OpenSSL — les PEM produits par cette page font l’aller-retour en ligne de commande : openssl pkeyutl -encrypt -pubin -inkey pub.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 openssl pkeyutl -decrypt -inkey priv.pem -pkeyopt rsa_padding_mode:oaep ... openssl dgst -sha256 -sign priv.pem -out msg.sig msg.txt (PKCS#1 v1.5) / openssl dgst -sha256 -verify pub.pem -signature msg.sig msg.txt PSS : ajoutez -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 aux deux appels dgst. Conversion de format de clé : openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem fait SPKI ↔ PKCS#1 sur disque ; cette page le fait dans le navigateur.
Autotest Exécute le moteur de la page sur des références indépendantes : génération de clés à trois tailles de module, allers-retours de chiffrement/déchiffrement OAEP, signature/vérification PSS et PKCS#1 v1.5 selon plusieurs fonctions de hachage, un vecteur de signature v1.5 déterministe octet pour octet (produit par une implémentation native indépendante), un chiffré OAEP fixe et une signature PSS produits par OpenSSL que cette page doit déchiffrer et vérifier (interopérabilité entre implémentations), des allers-retours de conversion de format PEM, et des tests négatifs (une signature altérée ou une mauvaise clé doivent échouer). Rien n’est envoyé nulle part.
Chiffrement et signatures RSA expliqués depuis zéro
En une phrase : RSA est de la cryptographie à clé publique — n’importe qui peut vous chiffrer un message avec la clé publique ou vérifier vos signatures, mais seule la clé privée peut déchiffrer ou signer — et sa sécurité repose sur le fait que factoriser un nombre de 2048 bits en deux nombres premiers dépasse les capacités de tout ordinateur existant.
Ce que RSA calcule réellement
Deux nombres premiers et une porte dérobée. Une clé RSA commence par deux grands nombres premiers aléatoires p et q ; leur produit n (le module, d’où le « clé de 2048 bits ») est publié dans la clé publique avec un exposant e (presque toujours 65537). La clé privée est le couple d, l’inverse modulaire de e, calculé à partir de p et q — avec en plus des raccourcis dérivés des nombres premiers qui accélèrent les opérations privées d’un facteur 4.
Chiffrer et signer, c’est la même exponentiation. Chiffrer un bloc de message m revient à calculer me mod n ; déchiffrer, c’est cd mod n. Signer un bloc préformaté avec l’exposant privé et le vérifier avec l’exposant public est la même opération dans l’autre sens. Tout le reste de cette page — OAEP, PSS, PKCS#1 — concerne la mise en forme de ce bloc, afin que l’exponentiation brute ne soit jamais exposée.
Pourquoi c’est lent. Une opération RSA sur une clé de 2048 bits coûte de l’ordre d’un million de fois plus de calcul que le chiffrement d’un bloc avec AES. C’est pourquoi TLS n’utilise RSA (ou ECC) que pour convenir d’une clé AES aléatoire, puis passe à AES. La même règle s’applique à tout ce que vous construisez : RSA pour la clé, AES pour les données.
Taille de clé. La longueur du module est le réglage de sécurité : 1024 bits est « cassé par la politique » (la factorisation est à portée des États), 2048 bits ≈ 112 bits de sécurité symétrique, 3072 bits ≈ 128 bits, 15360 bits équivaudraient à une clé symétrique de 256 bits. Remarque post-quantique : l’algorithme de Shor casse RSA purement et simplement sur un grand ordinateur quantique — une raison de plus de limiter la durée de vie des clés.
OAEP : le seul remplissage de chiffrement à utiliser
Le problème de RSA brut. RSA « de manuel » (me mod n sur le message brut) est déterministe et malléable : des messages identiques se chiffrent de la même façon, un attaquant peut multiplier un chiffré par le chiffrement de 2 pour doubler le message clair, et les messages courts tombent par attaque « rencontre au milieu ». Il ne doit jamais être utilisé directement.
Ce que fait OAEP. OAEP (PKCS#1 v2, RFC 8017) mélange le message avec une graine aléatoire via un réseau de Feistel fondé sur un hachage, avant l’exponentiation. Résultat : le chiffrement est randomisé (un même texte clair donne un chiffré différent à chaque fois — lancez l’exemple OAEP deux fois et comparez), toute altération est détectée au déchiffrement, et le message doit tenir dans le module avec de la place pour le hachage — la limite k−2·hashLen−2 indiquée plus haut.
L’étiquette. Une chaîne publique facultative liée au remplissage. Les deux côtés doivent fournir exactement la même étiquette, sinon le déchiffrement échoue — comme l’AAD d’AES-GCM, elle permet de lier le chiffré à un contexte (un nom de fichier, un identifiant d’algorithme). Vide, c’est normal.
Le chiffrement PKCS#1 v1.5 est volontairement absent. Ce remplissage, datant de 1993, n’offre aucune intégrité et laisse fuir de l’information par le comportement sur erreur de déchiffrement (l’attaque de Bleichenbacher de 1998 transforme un oracle de remplissage en déchiffrement complet avec quelques millions de chiffrés forgés ; elle casse encore de vrais systèmes sous le nom de ROBOT, en 2017). WebCrypto refuse de l’implémenter ; cette page aussi.
Signatures PSS contre PKCS#1 v1.5
Signer = hacher, puis remplir, puis exponentier. Les deux schémas hachent le message (SHA-256/384/512 ici), mettent l’empreinte en forme dans un bloc et appliquent l’exposant privé. La vérification remet le bloc en forme avec la clé publique et compare. La différence réside dans la mise en forme :
Schéma
Contenu du bloc
Propriétés
RSASSA-PKCS1-v1_5
empreinte + en-tête DigestInfo, déterministe
Chaque signature d’un même message est identique octet pour octet (vérifiez l’autotest : son vecteur v1.5 est fixe). Prise en charge héritée universelle : certificats X.509, JWT RS*, TLS avant la 1.3. Aucune contrefaçon connue lorsque la vérification est implémentée correctement.
RSA-PSS
empreinte + sel aléatoire de la longueur du hachage, masquage MGF1
Randomisée — chaque signature diffère. Prouvablement sûre dans le modèle de l’oracle aléatoire ; exigée par les certificats futurs de TLS 1.3 et les protocoles plus récents. Le vérificateur doit connaître la longueur du sel (cette page utilise la longueur du hachage, le défaut courant).
Lequel choisir. Pour les nouvelles conceptions : PSS. Pour l’interopérabilité avec des certificats existants, des JWT (RS256) ou d’anciens correspondants : v1.5. Les deux sont sûrs en tant que schémas de signature — l’histoire du désastre v1.5 concerne le *chiffrement*, une construction différente malgré le nom proche.
PKCS#1 contre PKCS#8 contre SPKI : pourquoi la même clé a quatre PEM
Un PEM n’est que du DER encapsulé en base64. Un fichier PEM est une étiquette suivie du base64 d’une structure DER (ASN.1 binaire). L’étiquette indique quelle structure — et c’est toute la différence entre les quatre formats générés par cette page :
Étiquette PEM
Structure DER
Contient
-----BEGIN PUBLIC KEY-----
SubjectPublicKeyInfo (SPKI)
OID d’algorithme + clé publique (n, e). La « clé publique » par défaut partout.
-----BEGIN RSA PUBLIC KEY-----
PKCS#1 RSAPublicKey
Seulement (n, e). Anciens OpenSSL et certaines piles embarquées.
-----BEGIN PRIVATE KEY-----
PKCS#8 PrivateKeyInfo
OID d’algorithme + clé privée. Conteneur indépendant de l’algorithme, le défaut moderne.
-----BEGIN RSA PRIVATE KEY-----
PKCS#1 RSAPrivateKey
n, e, d, p, q, …. La sortie classique de genrsa d’OpenSSL.
Même clé, enveloppes différentes. Les quatre zones ci-dessus, après la génération, contiennent la même paire de clés — SPKI et PKCS#1 public contiennent les mêmes n et e ; PKCS#8 et PKCS#1 privé contiennent les mêmes valeurs privées. Cette page convertit entre eux sans perte dans le navigateur (son autotest vérifie les allers-retours). Confondre les formats est la cause la plus fréquente des erreurs « clé invalide » lorsqu’on colle des clés d’un outil à l’autre.
Les PEM chiffrés (-----BEGIN ENCRYPTED PRIVATE KEY-----) sont du PKCS#8 avec une couche de chiffrement fondée sur un mot de passe. Cette page ne les accepte pas — déchiffrez-les d’abord hors ligne (openssl pkcs8 -in enc.pem -out plain.pem).
Erreurs courantes
Chiffrer des données volumineuses avec RSA. Au-delà de la limite de taille stricte d’OAEP, c’est absurdement lent. Le schéma est le suivant : générer une clé AES aléatoire, chiffrer cette clé avec RSA-OAEP, chiffrer les données avec AES-GCM, puis envoyer les deux parties.
Livrer la clé privée parce que « c’est un test ». Les clés d’exemple intégrées aux vecteurs de cette page sont publiées volontairement — elles ne peuvent signer que des données de test. Vos clés, elles, ne sont pas comme cela.
Vérifier avec la clé privée. Cela « marche » en général mathématiquement, et certains outils le permettent, mais distribuer une clé privée aux vérificateurs annule tout le modèle. Vérifiez avec la clé publique (cette page l’impose).
Comparer les signatures octet pour octet pour vérifier du code. PSS (et OAEP) sont randomisés : deux exécutions correctes produisent des sorties différentes. Comparez en vérifiant, non en égalité — seules les signatures v1.5 sont déterministes.
Des clés de 1024 bits « parce qu’elles sont plus rapides ». Elles sont aussi à portée d’une factorisation bien financée. L’argument de la vitesse a disparu avec le chiffrement hybride : RSA ne s’exécute qu’une fois par session, et non par octet.
Coder en dur une longueur de sel différente de la longueur du hachage pour PSS. Le vérificateur doit être d’accord ; la longueur du hachage (le choix de cette page et le -sigopt rsa_pss_saltlen:32 d’OpenSSL) est la valeur par défaut interopérable.
FAQ
Pourquoi mon déchiffrement a-t-il échoué avec « mauvaise clé, mauvais hachage ou chiffré altéré » ? Le déchiffrement OAEP échoue si l’une de ces conditions est vraie : ce n’est pas la clé privée correspondante, le hachage diffère du côté chiffrement, l’étiquette diffère, ou un octet du chiffré a changé. Le message d’erreur est volontairement identique dans tous les cas — révéler quelle vérification a échoué constituerait en soi une fuite d’oracle de remplissage.
Peut-on obtenir la clé publique à partir de la clé privée ? Oui — les formats privés contiennent aussi n et e. Cette page affiche les deux après la génération ; OpenSSL le fait avec openssl pkey -in priv.pem -pubout.
Pourquoi 65537 comme exposant ? C’est un nombre premier, qui ne comporte que deux bits à 1 (exponentiation rapide), et il est assez grand pour éviter les attaques à faible exposant qui touchent e=3. C’est le choix standard depuis les années 1990 ; un exposant « bizarre » signale en général une clé faible ou non standard.
RSA est-il mort à cause des ordinateurs quantiques ? Pas encore — aucune machine ne peut exécuter l’algorithme de Shor sur un module de 2048 bits. Mais les données devant rester secrètes au-delà des années 2030 font déjà l’objet d’une migration ; les schémas hybrides post-quantiques sont la réponse d’ingénierie.
Et openssl rsautl ? C’est l’ancêtre déprécié de pkeyutl. Il utilise par défaut le remplissage de chiffrement v1.5 — une raison de plus de l’avoir retiré.