RSA verschlüsseln / entschlüsseln

Erzeugen Sie RSA-Schlüsselpaare im Browser, verschlüsseln und entschlüsseln Sie mit RSA-OAEP, signieren Sie mit RSA-PSS oder PKCS#1 v1.5 und wandeln Sie Schlüssel zwischen den PEM-Formaten SPKI, PKCS#8 und PKCS#1 um. Alles läuft lokal mit der WebCrypto-Engine — kein Schlüssel und keine Nachricht verlässt diese Seite.
Wofür RSA da ist: kleine Nachrichten und Signaturen, nicht Massendaten. RSA verschlüsselt höchstens k−2·hashLen−2 Bytes pro Aufruf (190 Bytes bei einem 2048-Bit-Schlüssel mit SHA-256) und ist etwa 1000× langsamer als AES. Reale Systeme verwenden hybride Verschlüsselung: RSA umhüllt einen zufälligen AES-Schlüssel, AES verschlüsselt die Daten (siehe das AES-Werkzeug). Diese Seite dient dem Lernen, Testen und Interoperabilitätsprüfungen.
Modulgröße:
Hash: Label:
Die PKCS#1-v1.5-Verschlüsselung ist bewusst nicht implementiert: Sie hat keine Integrität des Chiffretexts und fällt Padding-Oracle-Angriffen (Bleichenbacher) zum Opfer. OAEP ist der einzige Verschlüsselungsmodus, den ein neuer Entwurf verwenden sollte.
Verfahren: Hash:
Verfahren: Hash:
Wie viel kann ein RSA-Aufruf übertragen? OAEP-Nachrichtengrenze = Schlüsselbytes − 2×Hash-Bytes − 2:
ModulusSHA-256SHA-384SHA-512
1024 Bit62 Bytes30 Bytes0 Bytes
2048 Bit190 Bytes126 Bytes62 Bytes
3072 Bit318 Bytes254 Bytes190 Bytes
4096 Bit446 Bytes382 Bytes318 Bytes
Signaturen haben keine Nachrichtengrenze — die Nachricht wird zuerst gehasht; die Signatur selbst hat immer genau die Schlüsselgröße (256 Bytes bei 2048 Bit).
Schlüsselstärke und Lebensdauer (NIST SP 800-57 Teil 1 Rev. 5): 1024 Bit ist seit 2013 für neue Verwendungen nicht mehr zulässig; 2048 Bit ist heute das Minimum und bleibt bis 2030 akzeptabel; 3072 Bit und mehr sind die sichere Wahl für 2031 und danach. 8192 Bit funktioniert hier, doch die Erzeugung kann im Browser eine Minute oder mehr dauern und bringt Sicherheit, die derzeit niemand braucht — bevorzugen Sie 3072/4096.
OpenSSL-Interoperabilität — die PEMs, die diese Seite erzeugt, funktionieren auch in der Kommandozeile:
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: Fügen Sie -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 zu beiden dgst-Aufrufen hinzu. Schlüsselformat-Umwandlung: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem wandelt auf dem Datenträger zwischen SPKI und PKCS#1 um; diese Seite erledigt das im Browser.
Selbsttest
Führt die Seiten-Engine gegen unabhängige Referenzwerte aus: Schlüsselerzeugung in drei Modulgrößen, Hin- und Rück-Umwandlungen mit OAEP-Verschlüsselung und -Entschlüsselung, PSS- und PKCS#1-v1.5-Signieren und -Prüfen über verschiedene Hashes, ein deterministischer v1.5-Signaturvektor Byte für Byte (erzeugt durch eine unabhängige native Implementierung), ein fester OAEP-Chiffretext und eine PSS-Signatur, die OpenSSL erzeugt hat und die diese Seite entschlüsseln bzw. prüfen muss (Interoperabilität zwischen Implementierungen), PEM-Formatumwandlungen in beide Richtungen sowie Negativtests (manipulierte Signatur, falscher Schlüssel muss fehlschlagen). Nichts wird irgendwohin gesendet.
RSA-Verschlüsselung und Signaturen von Grund auf erklärt
In einem Satz: RSA ist Public-Key-Kryptografie — jeder kann mit dem öffentlichen Schlüssel an Sie verschlüsseln oder Ihre Signaturen prüfen, aber nur der private Schlüssel kann entschlüsseln oder signieren — und ihre Sicherheit beruht darauf, dass die Faktorisierung einer 2048-Bit-Zahl in zwei Primzahlen jeden existierenden Computer überfordert.
Was RSA tatsächlich berechnet

Zwei Primzahlen und eine Falltür. Ein RSA-Schlüssel beginnt mit zwei großen zufälligen Primzahlen p und q; ihr Produkt n (der Modulus, daher „2048-Bit-Schlüssel“) wird im öffentlichen Schlüssel zusammen mit einem Exponenten e veröffentlicht (fast immer 65537). Der private Schlüssel ist das Paar d, das modulare Inverse von e − berechnet aus p und q — zusammen mit Abkürzungen, die aus den Primzahlen abgeleitet werden und private Operationen um den Faktor 4 beschleunigen.

Verschlüsseln und Signieren sind dieselbe Potenzierung. Einen Nachrichtenblock m zu verschlüsseln bedeutet, me mod n zu berechnen; entschlüsseln ist cd mod n. Einen vorformatierten Block mit dem privaten Exponenten zu signieren und mit dem öffentlichen zu prüfen ist dieselbe Operation in der anderen Richtung. Alles Übrige auf dieser Seite — OAEP, PSS, PKCS#1 — betrifft das sichere Formatieren dieses Blocks, damit die rohe Potenzierung nie offenliegt.

Warum es langsam ist. Eine RSA-Operation mit einem 2048-Bit-Schlüssel kostet etwa eine Million Mal mehr Rechenzeit als die Verschlüsselung eines Blocks mit AES. Deshalb verwendet TLS RSA (oder ECC) nur, um sich auf einen zufälligen AES-Schlüssel zu einigen, und wechselt dann. Dieselbe Regel gilt für alles, was Sie bauen: RSA für den Schlüssel, AES für die Daten.

Schlüsselgröße. Die Modullänge ist der Sicherheitsregler: 1024 Bit gelten nach Richtlinie als gebrochen (die Faktorisierung liegt im Bereich staatlicher Akteure), 2048 Bit ≈ 112 Bit symmetrische Stärke, 3072 Bit ≈ 128 Bit, 15360 Bit entsprächen einem symmetrischen 256-Bit-Schlüssel. Hinweis zur Post-Quanten-Ära: Der Shor-Algorithmus bricht RSA auf einem großen Quantencomputer vollständig — ein weiterer Grund, Schlüssel nur für begrenzte Zeit zu verwenden.

OAEP: die einzige Verschlüsselungsfüllung, die Sie verwenden sollten

Das Problem mit reinem RSA. Lehrbuch-RSA (me mod n auf der rohen Nachricht) ist deterministisch und manipulierbar: Identische Nachrichten werden identisch verschlüsselt, ein Angreifer kann einen Chiffretext mit der Verschlüsselung von 2 multiplizieren, damit sich der Klartext verdoppelt, und kurze Nachrichten fallen dem Meet-in-the-Middle-Angriff zum Opfer. Es darf niemals direkt verwendet werden.

Was OAEP macht. OAEP (PKCS#1 v2, RFC 8017) vermischt die Nachricht mit einem zufälligen Seed über ein hashbasiertes Feistel-Netzwerk, bevor potenziert wird. Das Ergebnis: Die Verschlüsselung ist randomisiert (derselbe Klartext ergibt jedes Mal einen anderen Chiffretext — führen Sie das OAEP-Beispiel zweimal aus und vergleichen Sie), Manipulation wird bei der Entschlüsselung erkannt, und die Nachricht muss in den Modulus passen mit Platz für den Hash — die oben tabellierte Grenze k−2·hashLen−2.

Das Label. Eine optionale öffentliche Zeichenkette, die in die Füllung eingebunden wird. Beide Seiten müssen dasselbe Label angeben, sonst schlägt die Entschlüsselung fehl — wie die AAD bei AES-GCM erlaubt es, den Chiffretext an einen Kontext zu binden (einen Dateinamen, eine Algorithmus-ID). Leer ist normal.

Die PKCS#1-v1.5-Verschlüsselung fehlt mit Absicht. Die Füllung aus dem Jahr 1993 hat keine Integritätsprüfung und verrät Informationen über das Fehlerverhalten bei der Entschlüsselung (Bleichenbachers Angriff von 1998 macht aus einem Padding-Oracle mit einigen Millionen präparierten Chiffretexten eine vollständige Entschlüsselung; er bricht bis heute reale Systeme als ROBOT, 2017). WebCrypto verweigert die Implementierung; diese Seite ebenfalls.

PSS- gegenüber PKCS#1-v1.5-Signaturen

Signieren = hashen, dann auffüllen, dann potenzieren. Beide Verfahren hashen die Nachricht (hier SHA-256/384/512), formatieren den Digest in einen Block und wenden den privaten Exponenten an. Die Prüfung formatiert den Block mit dem öffentlichen Schlüssel neu und vergleicht. Der Unterschied liegt in der Formatierung:

VerfahrenBlockinhaltEigenschaften
RSASSA-PKCS1-v1_5Digest + Digest-Info-Kopf, deterministischJede Signatur derselben Nachricht ist Byte für Byte identisch (prüfen Sie den Selbsttest: sein v1.5-Vektor ist fest). Universelle Altkompatibilität: X.509-Zertifikate, JWT RS*, TLS vor 1.3. Keine bekannte Fälschung, wenn die Prüfung korrekt implementiert ist.
RSA-PSSDigest + zufälliges Salt der Hash-Länge, MGF1-MaskierungRandomisiert — jede Signatur unterscheidet sich. Im Random-Oracle-Modell beweisbar sicher; in TLS-1.3-Zertifikaten und neueren Protokollen vorgeschrieben. Der Prüfer muss die Salt-Länge kennen (diese Seite verwendet die Hash-Länge, den üblichen Standard).

Welches wählen. Neue Entwürfe: PSS. Interoperabilität mit bestehenden Zertifikaten, JWTs (RS256) oder älteren Gegenstellen: v1.5. Beide sind als Signaturverfahren sicher — die Katastrophengeschichte von v1.5 betrifft die *Verschlüsselungs*füllung, eine andere Konstruktion trotz des ähnlichen Namens.

PKCS#1 gegenüber PKCS#8 gegenüber SPKI: warum derselbe Schlüssel vier PEM-Formen hat

PEM ist nur Base64 um DER. Eine PEM-Datei besteht aus einer Kennzeichnung und dem Base64 einer DER-Struktur (binäres ASN.1). Die Kennzeichnung sagt Ihnen, welche Struktur vorliegt — und darin liegt der ganze Unterschied zwischen den vier Formaten, die diese Seite erzeugt:

PEM-KennzeichnungDER-StrukturEnthält
-----BEGIN PUBLIC KEY-----SubjectPublicKeyInfo (SPKI)Algorithmus-OID + öffentlicher Schlüssel (n, e). Der überall übliche „öffentliche Schlüssel“.
-----BEGIN RSA PUBLIC KEY-----PKCS#1 RSAPublicKeyNur (n, e). Altes OpenSSL und einige eingebettete Systeme.
-----BEGIN PRIVATE KEY-----PKCS#8 PrivateKeyInfoAlgorithmus-OID + privater Schlüssel. Algorithmusunabhängiger Container, der moderne Standard.
-----BEGIN RSA PRIVATE KEY-----PKCS#1 RSAPrivateKeyn, e, d, p, q, …. Die klassische Ausgabe von OpenSSL genrsa.

Derselbe Schlüssel, andere Hüllen. Alle vier Felder oben enthalten nach dem Erzeugen dasselbe Schlüsselpaar — SPKI und PKCS#1 öffentlich enthalten identische n, e; PKCS#8 und PKCS#1 privat enthalten identische private Werte. Diese Seite wandelt verlustfrei zwischen ihnen um (ihr Selbsttest prüft die Umwandlungen in beide Richtungen). Verwechselte Formate sind die häufigste Ursache für Fehler „ungültiger Schlüssel“ beim Einfügen von Schlüsseln zwischen Werkzeugen.

Verschlüsselte PEMs (-----BEGIN ENCRYPTED PRIVATE KEY-----) sind PKCS#8 mit einer passwortbasierten Verschlüsselungsschicht. Diese Seite akzeptiert sie nicht — entschlüsseln Sie sie zuerst offline (openssl pkcs8 -in enc.pem -out plain.pem).

Häufige Fehler
  • Massendaten mit RSA verschlüsseln. Abgesehen von der harten OAEP-Größengrenze ist das absurd langsam. Das Muster lautet: einen zufälligen AES-Schlüssel erzeugen, den AES-Schlüssel mit RSA-OAEP verschlüsseln, die Daten mit AES-GCM verschlüsseln und beide Teile senden.
  • Den privaten Schlüssel ausliefern, weil „es nur ein Test ist“. Die Beispielschlüssel in den Referenzvektoren dieser Seite sind bewusst veröffentlicht — sie können nur Testdaten signieren. Ihre Schlüssel sind nicht so.
  • Mit dem privaten Schlüssel prüfen. Das „funktioniert“ mathematisch meist, und manche Werkzeuge erlauben es, aber einen privaten Schlüssel an Prüfer zu verteilen, hebelt das ganze Modell aus. Prüfen Sie mit dem öffentlichen Schlüssel (diese Seite erzwingt es).
  • Signaturen Byte für Byte vergleichen, um Code zu prüfen. PSS (und OAEP) sind randomisiert: Zwei korrekte Durchläufe erzeugen unterschiedliche Ausgaben. Vergleichen Sie durch Prüfen, nicht durch Gleichheit — nur v1.5-Signaturen sind deterministisch.
  • 1024-Bit-Schlüssel „weil sie schneller sind“. Sie liegen außerdem im Bereich gut finanzierter Faktorisierung. Das Geschwindigkeitsargument ist mit der hybriden Verschlüsselung entfallen: RSA läuft einmal pro Sitzung, nicht pro Byte.
  • Eine andere Salt-Länge als die Hash-Länge für PSS festlegen. Der Prüfer muss zustimmen; die Hash-Länge (die Wahl dieser Seite und der Parameter -sigopt rsa_pss_saltlen:32 von OpenSSL) ist der interoperable Standard.
FAQ

Warum ist meine Entschlüsselung mit „falscher Schlüssel, falscher Hash oder beschädigter Chiffretext“ fehlgeschlagen? Die OAEP-Entschlüsselung schlägt fehl, wenn einer der folgenden Fälle zutrifft: Es ist nicht der passende private Schlüssel, der Hash weicht von der Verschlüsselungsseite ab, das Label ist anders, oder ein Byte des Chiffretexts hat sich geändert. Die Fehlermeldung ist bewusst für alle Fälle gleich — zu verraten, welche Prüfung fehlschlug, wäre selbst ein Padding-Oracle-Leck.

Kann ich den öffentlichen Schlüssel aus dem privaten gewinnen? Ja — die privaten Formate enthalten n und e ebenfalls. Diese Seite zeigt nach dem Erzeugen beide an; OpenSSL erledigt das mit openssl pkey -in priv.pem -pubout.

Warum 65537 als Exponent? Sie ist eine Primzahl, hat nur zwei Bits mit dem Wert 1 (schnelle Potenzierung) und ist groß genug, um die Angriffe mit kleinem Exponenten zu vermeiden, die e=3 treffen. Sie ist seit den 1990er-Jahren die Standardwahl; ein „ungewöhnlicher“ Exponent bedeutet meist einen schwachen oder nicht standardkonformen Schlüssel.

Ist RSA wegen Quantencomputern erledigt? Noch nicht — es gibt keine Maschine, die den Shor-Algorithmus auf einen 2048-Bit-Modulus anwenden kann. Doch Daten, die bis in die 2030er-Jahre und darüber geheim bleiben müssen, werden bereits migriert; hybride PQC-Verfahren sind die technische Antwort.

Was ist mit openssl rsautl? Er ist der veraltete Vorgänger von pkeyutl. Standardmäßig verwendet er die Verschlüsselungsfüllung nach v1.5 — ein weiterer Grund, warum er außer Dienst gestellt wurde.