Šifrovanie a dešifrovanie RSA

Generovanie párov kľúčov RSA v prehliadači, šifrovanie a dešifrovanie cez RSA-OAEP, podpisovanie cez RSA-PSS alebo PKCS#1 v1.5 a prevod kľúčov medzi formátmi SPKI, PKCS#8 a PKCS#1 PEM. Všetko beží lokálne cez engine WebCrypto — žiadny kľúč ani správa neopustí túto stránku.
Na čo slúži RSA: malé správy a podpisy, nie veľké údaje. RSA šifruje najviac k−2·hashLen−2 bajtov na volanie (190 bajtov pre kľúč 2048-bit s SHA-256) a je ~1000× pomalšie než AES. Reálne systémy používajú hybridné šifrovanie: RSA obalí náhodný kľúč AES, AES zašifruje údaje (súvisiace: nástroj AES). Táto stránka slúži na učenie, testovanie a kontrolu interoperability.
Veľkosť modulu:
Hash: Štítok:
PKCS#1 v1.5 šifrovanie je zámerne neimplementované: nemá integritu šifrovaného textu a podlieha útokom padding oracle (Bleichenbacher). OAEP je jediný šifrovací režim, ktorý by mal nový návrh používať.
Schéma: Hash:
Schéma: Hash:
Koľko dokáže niesť jedno volanie RSA? Limit správy OAEP = bajty kľúča − 2×bajty hashu − 2:
ModulSHA-256SHA-384SHA-512
1024-bit62 bajtov30 bajtov0 bajtov
2048-bit190 bajtov126 bajtov62 bajtov
3072-bit318 bajtov254 bajtov190 bajtov
4096-bit446 bajtov382 bajtov318 bajtov
Podpisy nemajú limit správy — správa sa najprv hashuje; samotný podpis má vždy presne veľkosť kľúča (256 bajtov pre kľúč 2048-bit).
Sila kľúča a životnosť (NIST SP 800-57 Part 1 Rev. 5): 1024-bit bolo po roku 2013 zakázané pre nové použitie; 2048-bit je dnes minimum a zostáva prijateľné do roku 2030; 3072-bit a viac je pohodlná voľba pre roky 2031+. 8192-bit tu funguje, ale generovanie môže v prehliadači trvať minútu alebo viac a kupuje bezpečnosť, ktorú nikto v súčasnosti nepotrebuje — uprednostniť 3072/4096.
Interoperabilita s OpenSSL — PEM súbory, ktoré táto stránka vytvára, sa dajú prenášať na príkazovom riadku:
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
Pre PSS sa do oboch volaní dgst pridá -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32. Prevod formátu kľúča: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem prevedie SPKI ↔ PKCS#1 na disku; táto stránka to robí v prehliadači.
Autotest
Spustí engine stránky proti nezávislým kotvám: generovanie kľúčov pri troch veľkostiach modulu, okrúhle cesty šifrovania a dešifrovania OAEP, podpisovanie a overovanie PSS a PKCS#1 v1.5 pri rôznych hašoch, deterministický podpis v1.5 bajt po bajte (vygenerovaný nezávislou natívnou implementáciou), pevný šifrovaný text OAEP a podpis PSS vytvorené OpenSSL, ktoré táto stránka musí dešifrovať a overiť (interoperabilita medzi implementáciami), okrúhle cesty prevodu formátu PEM a negatívne testy (upravený podpis, nesprávny kľúč musí zlyhať). Nič sa nikam neodosiela.
Šifrovanie a podpisy RSA od základov
Jednou vetou: RSA je kryptografia s verejným kľúčom — ktokoľvek môže zašifrovať alebo overiť podpisy pomocou verejného kľúča, ale dešifrovať alebo podpisovať môže len súkromný kľúč; a jej bezpečnosť spočíva na tom, že rozklad 2048-bitového čísla na dve prvočísla je mimo dosahu každého existujúceho počítača.
Čo RSA v skutočnosti počíta

Dve prvočísla a pascová dvierka. Kľúč RSA začína dvoma veľkými náhodnými prvočíslami p a q; ich súčin n (modul, odtiaľ „kľúč 2048-bit“) sa zverejní vo verejnom kľúči spolu s exponentom e (takmer vždy 65537). Súkromný kľúč tvorí dvojica d, modulárna inverzia k e − vypočítaná z p a q — plus skratky odvodené z prvočísel, ktoré urýchľujú operácie so súkromným kľúčom 4×.

Šifrovanie a podpisovanie sú to isté umocňovanie. Zašifrovanie správneho bloku m znamená výpočet me mod n; dešifrovanie je cd mod n. Podpísanie vopred naformátovaného bloku súkromným exponentom a overenie verejným je tá istá operácia v opačnom smere. Všetko ostatné na tejto stránke — OAEP, PSS, PKCS#1 — sa týka bezpečného formátovania tohto bloku, aby sa surové umocňovanie nikdy nevystavilo.

Prečo je to pomalé. Jedna operácia RSA nad kľúčom 2048-bit stojí rádovo milión-krát viac procesorového času než zašifrovanie jedného bloku pomocou AES. Preto TLS používa RSA (alebo ECC) len na dohodu o náhodnom kľúči AES a potom prejde na AES. Rovnaké pravidlo platí pre čokoľvek, čo sa staviame: RSA pre kľúč, AES pre údaje.

Veľkosť kľúča. Dĺžka modulu je bezpečnostný regulátor: 1024-bit je podľa politík prelomený (faktorizácia je na dosah štátov), 2048-bit ≈ 112-bitová symetrická sila, 3072-bit ≈ 128-bit, 15360-bit by zodpovedalo 256-bitovému symetrickému kľúču. Poznámka k postkvantovému svetu: Shorov algoritmus na veľkom kvantovom počítači RSA úplne prelomí — ďalší dôvod držať životnosť kľúčov obmedzenú.

OAEP: jediné šifrovacie vypĺňanie, ktoré by sa malo používať

Problém so surovým RSA. Učebnicové RSA (me mod n nad surovou správou) je deterministické a tvárne: rovnaké správy sa zašifrujú rovnako, útočník môže vynásobiť šifrovaný text zašifrovaním čísla 2, aby sa otvorený text zdvojnásobil, a krátke správy padnú pod útokom stretnutia v strede. Nikdy sa nesmie používať priamo.

Čo robí OAEP. OAEP (PKCS#1 v2, RFC 8017) mieša správu s náhodným semenom cez Feistelovu sieť založenú na hashi ešte pred umocňovaním. Výsledok: šifrovanie je randomizované (rovnaký otvorený text dá pri každom zašifrovaní iný šifrovaný text — spustí sa vzorka OAEP dvakrát a výsledky sa porovnajú), manipulácia sa pri dešifrovaní zistí a správa musí zmestiť do modulu s miestom pre hash — limit k−2·hashLen−2 uvedený vyššie v tabuľke.

Štítok. Voliteľný verejný reťazec viazaný do vypĺňania. Obe strany musia poskytnúť rovnaký štítok, inak dešifrovanie zlyhá — podobne ako AAD v AES-GCM umožňuje zviazať šifrovaný text s kontextom (názov súboru, identifikátor algoritmu). Prázdny štítok je bežný.

Šifrovacie vypĺňanie PKCS#1 v1.5 je zámerne vynechané. Vypĺňanie z čias okolo roku 1993 nemá integritu a unikajú cez správanie pri chybách dešifrovania informácie (Bleichenbacherov útok z roku 1998 premení padding oracle na úplné dešifrovanie niekoľkými miliónmi zostrojených šifrovaných textov; stále láme reálne systémy ako ROBOT, 2017). WebCrypto ho odmieta implementovať; rovnako aj táto stránka.

Podpisy PSS vs PKCS#1 v1.5

Podpis = hash, potom vypĺňanie, potom umocňovanie. Obe schémy hashujú správu (tu SHA-256/384/512), naformátujú odtlačok do bloku a použijú súkromný exponent. Overenie znova naformátuje blok verejným kľúčom a porovná. Rozdiel je vo formátovaní:

SchémaObsah blokuVlastnosti
RSASSA-PKCS1-v1_5odtlačok + hlavička digest-info, deterministickýKaždý podpis tej istej správy je bajt po bajte identický (overte to v samoteste: jeho vektor v1.5 je pevný). Univerzálna podpora v staršom softvéri: certifikáty X.509, JWT RS*, TLS pred 1.3. Pri správnej implementácii overovania nie je známy spôsob falšovania.
RSA-PSSodtlačok + náhodná soľ dĺžky hashu, maskovanie MGF1Randomizovaný — každý podpis je iný. Dokázateľne bezpečný v modeli náhodného orákula; vyžadovaný v certifikátoch TLS 1.3 a novších protokoloch. Overovateľ musí poznať dĺžku soli (táto stránka používa dĺžku hashu, bežný predvolený stav).

Ktorú zvoliť. Nové návrhy: PSS. Interoperabilita s existujúcimi certifikátmi, JWT (RS256) alebo staršími partnermi: v1.5. Obe sú ako podpisové schémy bezpečné — príbeh katastrofy v1.5 sa týka *šifrovacieho* vypĺňania, inej konštrukcie napriek podobnému názvu.

PKCS#1 vs PKCS#8 vs SPKI: prečo má rovnaký kľúč štyri PEM

PEM je len štruktúra DER zabalená do base64. Súbor PEM je označenie plus base64 štruktúry DER (binárna ASN.1). Označenie hovorí, o akú štruktúru ide — a práve to je celý rozdiel medzi štyrmi formátmi, ktoré táto stránka generuje:

označenie PEMštruktúra DERObsahuje
-----BEGIN PUBLIC KEY-----SubjectPublicKeyInfo (SPKI)OID algoritmu + verejný kľúč (n, e). Predvolený „verejný kľúč“ všade.
-----BEGIN RSA PUBLIC KEY-----PKCS#1 RSAPublicKeyHolý pár (n, e). Staršie OpenSSL a niektoré vstavané zásobníky.
-----BEGIN PRIVATE KEY-----PKCS#8 PrivateKeyInfoOID algoritmu + súkromný kľúč. Kontajner nezávislý od algoritmu, moderný štandard.
-----BEGIN RSA PRIVATE KEY-----PKCS#1 RSAPrivateKeyn, e, d, p, q, …. Klasický výstup OpenSSL genrsa.

Rovnaký kľúč, iné obaly. Všetky štyri políčka vyššie po vygenerovaní obsahujú rovnaký pár kľúčov — verejné SPKI a verejné PKCS#1 obsahujú rovnaké n, e; súkromné PKCS#8 a súkromné PKCS#1 obsahujú rovnaké súkromné hodnoty. Táto stránka medzi nimi prevádza bez straty v prehliadači (jej samotest overuje okrúhle cesty prevodov). Zamieňanie formátov je najčastejšia príčina chýb „neplatný kľúč“ pri vkladaní kľúčov medzi nástrojmi.

Šifrované PEM (-----BEGIN ENCRYPTED PRIVATE KEY-----) sú PKCS#8 s vrstvou šifrovania založenou na hesle. Táto stránka ich neprijíma — najprv sa offline dešifrujú (openssl pkcs8 -in enc.pem -out plain.pem).

Časté chyby
  • Šifrovanie veľkých údajov pomocou RSA. Okrem tvrdého limitu veľkosti OAEP je to absurdne pomalé. Vzor je: vygenerovať náhodný kľúč AES, zašifrovať kľúč AES cez RSA-OAEP, zašifrovať údaje cez AES-GCM a odoslať obe časti.
  • Odoslanie súkromného kľúča s odôvodnením „je to len test“. Vzorové kľúče vložené do vektorov tejto stránky sú zverejnené zámerne — môžu podpisovať len testovacie údaje. Takéto kľúče nie sú.
  • Overovanie súkromným kľúčom. Matematicky to zvyčajne „funguje“ a niektoré nástroje to umožňujú, ale distribúcia súkromného kľúča overovateľom maria celý model. Overuje sa verejným kľúčom (táto stránka to vynucuje).
  • Porovnávanie podpisov bajt po bajte na kontrolu kódu. PSS (a OAEP) sú randomizované: dva správne behy dajú rozdielne výstupy. Porovnanie sa robí overením, nie rovnosťou — deterministické sú len podpisy v1.5.
  • Kľúče s 1024 bitmi „lebo sú rýchlejšie“. Sú tiež na dosah dobre financovanej faktorizácii. Argument o rýchlosti zanikol s hybridným šifrovaním: RSA beží raz na reláciu, nie na každý bajt.
  • Pevne zadaná dĺžka soli pre PSS iná než dĺžka hashu. Overovateľ musí súhlasiť; dĺžka hashu (voľba tejto stránky a parameter OpenSSL -sigopt rsa_pss_saltlen:32) je interoperabilný predvolený stav.
FAQ

Prečo dešifrovanie zlyhalo s hláškou „zlý kľúč, zlý hash alebo poškodený šifrovaný text“? Dešifrovanie OAEP zlyhá, keď ide o nezodpovedajúci súkromný kľúč, hash sa líši od strany šifrovania, štítok sa líši alebo sa zmenil bajt šifrovaného textu. Chyba je úmyselne rovnaká pre všetky prípady — prezradenie, ktorá kontrola zlyhala, by samo bolo únikom typu padding oracle.

Dá sa verejný kľúč získať zo súkromného? Áno — súkromné formáty obsahujú aj n a e. Táto stránka ich zobrazí obe po vygenerovaní; OpenSSL to robí príkazom openssl pkey -in priv.pem -pubout.

Prečo 65537 ako exponent? Je prvočíslo, má iba dve jednotkové bity (rýchle umocňovanie) a je dostatočne veľký, aby sa vyhol útokom s malým exponentom, ktoré postihujú e=3. Je štandardnou voľbou od 90. rokov; „zvláštny“ exponent zvyčajne znamená slabý alebo neštandardný kľúč.

Je RSA mŕtve kvôli kvantovým počítačom? Zatiaľ nie — neexistuje stroj, ktorý by dokázal spustiť Shorov algoritmus nad modulom 2048-bit. Údaje, ktoré musia zostať tajné do 30. rokov a neskôr, sa však už migrujú; hybridné schémy PQC sú inžinierskou odpoveďou.

A čo openssl rsautl? Je to zastaraný predchodca pkeyutl. Predvolene používa šifrovacie vypĺňanie v1.5 — ďalší dôvod, prečo bol vyradený.