Šifrování a dešifrování RSA

Generujte páry klíčů RSA v prohlížeči, šifrujte a dešifrujte pomocí RSA-OAEP, podepisujte pomocí RSA-PSS nebo PKCS#1 v1.5 a převádějte klíče mezi formáty PEM SPKI, PKCS#8 a PKCS#1. Vše běží lokálně s enginem WebCrypto — žádný klíč ani zpráva nikdy neopustí tuto stránku.
K čemu je RSA: malé zprávy a podpisy, ne velká data. RSA zašifruje nejvýše k−2·hashLen−2 bajtů na volání (190 bajtů pro klíč 2048bitový se SHA-256) a je ~1000× pomalejší než AES. Skutečné systémy používají hybridní šifrování: RSA obaluje náhodný klíč AES, AES šifruje data (viz nástroj AES). Tato stránka slouží k učení, testování a kontrolám interoperability.
Velikost modulu:
Hash: Popisek:
PKCS#1 v1.5 šifrování je záměrně neimplementováno: nemá integritu šifrotextu a padá na útoky orákulem výplně (Bleichenbacher). OAEP je jediný režim šifrování, který by měl nový návrh používat.
Schéma: Hash:
Schéma: Hash:
Kolik může nést jedno volání RSA? Limit zprávy OAEP = bajty klíče − 2×bajty hashe − 2:
ModulSHA-256SHA-384SHA-512
1024bitový62 bajtů30 bajtů0 bajtů
2048bitový190 bajtů126 bajtů62 bajtů
3072bitový318 bajtů254 bajtů190 bajtů
4096bitový446 bajtů382 bajtů318 bajtů
Podpisy nemají limit zprávy — zpráva se nejprve zahešuje; samotný podpis má vždy přesně velikost klíče (256 bajtů pro klíč 2048bitový).
Síla klíče a jeho životnost (NIST SP 800-57 Part 1 Rev. 5): 1024bitový byl po roce 2013 zakázán pro nové použití; 2048bitový je dnes minimum a zůstává přijatelný do roku 2030; 3072bitový a větší je pohodlná volba pro roky 2031+. 8192bitový zde funguje, ale generování může trvat minutu nebo déle v prohlížeči a koupí bezpečnost, kterou nikdo teď nepotřebuje — dávejte přednost 3072/4096.
Interoperabilita s OpenSSL — PEMy, které tato stránka produkuje, prochází na příkazové řádce:
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: přidejte -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 do obou volání dgst. Převod formátu klíče: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem provede SPKI ↔ PKCS#1 na disku; tato stránka to dělá v prohlížeči.
Autotest
Spustí engine stránky proti nezávislým kotvám: generování klíčů při třech velikostech modulu, kruhové testy šifrování a dešifrování OAEP, podpisy a ověřování PSS a PKCS#1 v1.5 napříč hashi, deterministický vektor podpisu v1.5 bajt po bajtu (vygenerovaný nezávislou nativní implementací), pevný šifrotext OAEP a podpis PSS vytvořený OpenSSL, které tato stránka musí dešifrovat / ověřit (interoperabilita mezi implementacemi), kruhové převody formátů PEM a negativní testy (pozměněný podpis, špatný klíč musí selhat). Nic se nikam neodesílá.
Šifrování a podpisy RSA vysvětleny od začátku
Jednou větou: RSA je kryptografie s veřejným klíčem — kdokoli vám může zašifrovat zprávu veřejným klíčem nebo ověřit vaše podpisy, ale dešifrovat nebo podepsat může jen soukromý klíč — a její bezpečnost spočívá na tom, že rozklad čísla o 2048 bitech na dvě prvočísla je nad možnosti jakéhokoli existujícího počítače.
Co RSA ve skutečnosti počítá

Dvě prvočísla a zadní vrátka. Klíč RSA začíná dvěma velkými náhodnými prvočísly p a q; jejich součin n (modul, odtud „klíč 2048bitový“) se zveřejní ve veřejném klíči spolu s exponentem e (téměř vždy 65537). Soukromý klíč je dvojice d, modulární inverze k e − vypočtená z p a q — plus zkratky odvozené z prvočísel, které operace se soukromým klíčem zrychlí 4×.

Šifrování a podepisování je tatáž exponenciace. Zašifrování bloku zprávy m znamená výpočet me mod n; dešifrování je cd mod n. Podepsání předformátovaného bloku soukromým exponentem a ověření veřejným je tatáž operace v opačném směru. Vše ostatní na této stránce — OAEP, PSS, PKCS#1 — je o bezpečném formátování toho bloku, aby se nikdy nevystavila nechráněná exponenciace.

Proč je to pomalé. Jedna operace RSA na klíči 2048bitovém stojí řádově milionkrát více procesorového času než zašifrování jednoho bloku AES. Proto TLS používá RSA (nebo ECC) jen k dohodě na náhodném klíči AES a poté přepne. Stejné pravidlo platí pro cokoli, co vytvoříte: RSA pro klíč, AES pro data.

Velikost klíče. Délka modulu je ovladač bezpečnosti: 1024bitový je podle politiky prolomený (faktorizace je na dosah státům), 2048bitový ≈ 112bitová symetrická síla, 3072bitový ≈ 128bitová, 15360bitový by odpovídal 256bitovému symetrickému klíči. Poznámka k postkvantovému světu: Shorův algoritmus úplně prolomí RSA na velkém kvantovém počítači — další důvod udržovat životnost klíčů konečnou.

OAEP: jediná výplň šifrování, kterou byste měli používat

Problém syrového RSA. Učebnicové RSA (me mod n na syrové zprávě) je deterministické a plastické: stejné zprávy se zašifrují stejně, útočník může vynásobit šifrotext zašifrovanou dvojkou, aby se otevřený text zdvojnásobil, a krátké zprávy padají metodou meet-in-the-middle. Nikdy se nesmí používat přímo.

Co dělá OAEP. OAEP (PKCS#1 v2, RFC 8017) před exponenciací mísí zprávu s náhodným semenem přes Feistelovu síť založenou na hashi. Výsledek: šifrování je randomizované (stejný otevřený text dá pokaždé jiný šifrotext — spusťte vzorek OAEP dvakrát a porovnejte), při dešifrování se pozná manipulace a zpráva se musí vejít do modulu s místem na hash — limit k−2·hashLen−2 uvedený výše v tabulce.

Popisek. Volitelný veřejný řetězec svázaný do výplně. Obě strany musí zadat totožný popisek, jinak dešifrování selže — jako AAD u AES-GCM vám umožňuje svázat šifrotext s kontextem (název souboru, identifikátor algoritmu). Prázdný je normální.

Výplň PKCS#1 v1.5 pro šifrování je záměrně vynechána. Výplň z roku 1993 nemá integritu a prozrazuje informace skrze chování chyb při dešifrování (útok Bleichenbacherova z roku 1998 promění orákulum výplně v úplné dešifrování za několik milionů vytvořených šifrotextů; stále láme skutečné systémy jako ROBOT z roku 2017). WebCrypto ji odmítá implementovat; tak i tato stránka.

PSS vs podpisy PKCS#1 v1.5

Podepsání = hash, pak výplň, pak exponenciace. Obě schémata zahešují zprávu (zde SHA-256/384/512), formátují otisk do bloku a aplikují soukromý exponent. Ověření znovu naformátuje blok veřejným klíčem a porovná jej. Rozdíl je ve formátování:

SchémaObsah blokuVlastnosti
RSASSA-PKCS1-v1_5otisk + hlavička digest-info, deterministickýKaždý podpis téže zprávy je bajt po bajtu totožný (zkontrolujte samotest: jeho vektor v1.5 je pevný). Univerzální podpora zpětné kompatibility: certifikáty X.509, JWT RS*, TLS před 1.3. Žádný známý padělek, pokud je ověřování správně implementováno.
RSA-PSSotisk + náhodná sůl o délce hashe, maskování MGF1Randomizovaný — každý podpis se liší. Dokazatelně bezpečný v modelu náhodného orákula; vyžadován v certifikátech TLS 1.3 a novějších protokolech. Ověřovatel musí znát délku soli (tato stránka používá délku hashe, běžný výchozí).

Kterou zvolit. Nové návrhy: PSS. Interoperabilita se stávajícími certifikáty, JWT (RS256) nebo staršími protějšky: v1.5. Obě jsou bezpečné jako schémata podpisů — příběh katastrofy v1.5 se týká *šifrovací* výplně, což je jiná konstrukce navzdory podobnému názvu.

PKCS#1 vs PKCS#8 vs SPKI: proč má týž klíč čtyři PEMy

PEM je jen base64 obalený DER. Soubor PEM je štítek plus base64 struktury DER (binární ASN.1). Štítek říká, o jakou strukturu jde — a v tom spočívá celý rozdíl mezi čtyřmi formáty, které tato stránka generuje:

Štítek PEMstruktura DERObsahuje
-----BEGIN PUBLIC KEY-----SubjectPublicKeyInfo (SPKI)OID algoritmu + veřejný klíč (n, e). Výchozí „veřejný klíč“ všude.
-----BEGIN RSA PUBLIC KEY-----PKCS#1 RSAPublicKeyHolý (n, e). Starý OpenSSL a některé vestavěné zásobníky.
-----BEGIN PRIVATE KEY-----PKCS#8 PrivateKeyInfoOID algoritmu + soukromý klíč. Kontejner nezávislý na algoritmu, moderní výchozí volba.
-----BEGIN RSA PRIVATE KEY-----PKCS#1 RSAPrivateKeyn, e, d, p, q, …. Klasický výstup OpenSSL genrsa.

Týž klíč, jiné obaly. Všechny čtyři boxy výše po generování obsahují týž pár klíčů — veřejný SPKI a veřejný PKCS#1 obsahují totožné n, e; soukromý PKCS#8 a soukromý PKCS#1 obsahují totožné soukromé hodnoty. Tato stránka mezi nimi převádí bez ztrát v prohlížeči (její samotest převody zpětně ověřuje). Záměna formátů je nejčastější příčinou chyby „neplatný klíč“ při vkládání klíčů mezi nástroji.

Šifrované PEMy (-----BEGIN ENCRYPTED PRIVATE KEY-----) jsou PKCS#8 s vrstvou šifrování založeného na heslu. Tato stránka je nepřijímá — nejprve je dešifrujte offline (openssl pkcs8 -in enc.pem -out plain.pem).

Časté chyby
  • Šifrování velkých objemů dat pomocí RSA. Kromě tvrdého limitu velikosti OAEP je to absurdně pomalé. Vzor je: vygenerujte náhodný klíč AES, zašifrujte klíč AES pomocí RSA-OAEP, data zašifrujte pomocí AES-GCM a odešlete obě části.
  • Posílání soukromého klíče, protože „je to jen test“. Ukázkové klíče vložené do vektorů této stránky jsou zveřejněny záměrně — mohou podepisovat jen zkušební data. Vaše klíče takové nejsou.
  • Ověřování soukromým klíčem. Obvykle to matematicky „funguje“ a některé nástroje to dovolují, ale distribuce soukromého klíče ověřovatelům maří celý model. Ověřujte veřejným klíčem (tato stránka to vynucuje).
  • Porovnávání podpisů bajt po bajtu při kontrole kódu. PSS (a OAEP) jsou randomizované: dva správné běhy dají různé výstupy. Porovnávejte ověřením, ne rovností — jen podpisy v1.5 jsou deterministické.
  • Klíče 1024bitové „protože jsou rychlejší“. Jsou také na dosah dobře financované faktorizaci. Argument o rychlosti zanikl s hybridním šifrováním: RSA běží jednou na relaci, ne na bajt.
  • Pevná délka soli pro PSS jinou než délka hashe. Ověřovatel musí souhlasit; délka hashe (volba této stránky a OpenSSL -sigopt rsa_pss_saltlen:32) je interoperabilní výchozí hodnota.
Časté dotazy

Proč mi dešifrování selhalo s „špatný klíč, špatný hash nebo poškozený šifrotext“? Dešifrování OAEP selže, když: nejde o odpovídající soukromý klíč, hash se liší od strany šifrování, popisek se liší, nebo se změnil bajt šifrotextu. Chyba je záměrně stejná pro všechny případy — prozradit, která kontrola selhala, je samo o sobě únikem orákula výplně.

Mohu získat veřejný klíč ze soukromého? Ano — soukromé formáty obsahují také n a e. Tato stránka je po generování zobrazí obě; OpenSSL to dělá příkazem openssl pkey -in priv.pem -pubout.

Proč 65537 jako exponent? Je prvočíslo, má jen dva bity jedna (rychlá exponenciace) a je dost velký, aby se vyhnul útokům s nízkým exponentem, které zasáhnou e=3. Je standardní volbou od 90. let; „podivný“ exponent obvykle znamená slabý nebo nestandardní klíč.

Je RSA mrtvé kvůli kvantovým počítačům? Zatím ne — neexistuje stroj, který by dokázal spustit Shorův algoritmus na modulu 2048bitovém. Data, která musí zůstat tajná až do 30. let a dále, se ale již migrují; hybridní schémata PQC jsou inženýrskou odpovědí.

A co openssl rsautl? Je zastaralým předchůdcem pkeyutl. Jako výchozí používá výplň šifrování v1.5 — další důvod, proč byl vyřazen.