Šifrovanie a dešifrovanie RSA — RSA-OAEP, PSS a PKCS#1 v1.5
Š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.
1. Vygenerovať pár kľúčov(WebCrypto, lokálne; všetky štyri formáty PEM sa vytvoria naraz)
Vygenerovanie kľúča v prehliadači ho nešifruje. Na uloženie ho treba presunúť do skutočného trezora kľúčov alebo ho offline zašifrovať.
2. Alebo importovať existujúci kľúč(vložiť ľubovoľný zo štyroch formátov PEM)
3. Šifrovanie / dešifrovanie (RSA-OAEP)- smer sa riadi aktuálnym kľúčom: verejný = šifrovanie, súkromný = dešifrovanie
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ť.
4. Podpis (vyžaduje súkromný kľúč)- PSS (randomizovaný, moderný) alebo PKCS#1 v1.5 (deterministický, kompatibilný so staršími)
Schéma:Hash:
5. Overenie (vyžaduje verejný kľúč)- vloží sa správa a podpis
Schéma:Hash:
Koľko dokáže niesť jedno volanie RSA?Limit správy OAEP = bajty kľúča − 2×bajty hashu − 2:
Modul
SHA-256
SHA-384
SHA-512
1024-bit
62 bajtov
30 bajtov
0 bajtov
2048-bit
190 bajtov
126 bajtov
62 bajtov
3072-bit
318 bajtov
254 bajtov
190 bajtov
4096-bit
446 bajtov
382 bajtov
318 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éma
Obsah bloku
Vlastnosti
RSASSA-PKCS1-v1_5
odtlač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-PSS
odtlačok + náhodná soľ dĺžky hashu, maskovanie MGF1
Randomizovaný — 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:
Holý pár (n, e). Staršie OpenSSL a niektoré vstavané zásobníky.
-----BEGIN PRIVATE KEY-----
PKCS#8 PrivateKeyInfo
OID algoritmu + súkromný kľúč. Kontajner nezávislý od algoritmu, moderný štandard.
-----BEGIN RSA PRIVATE KEY-----
PKCS#1 RSAPrivateKey
n, 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ý.