RSA titkosítás / visszafejtés

RSA-kulcspárok generálása a böngészőben, titkosítás és visszafejtés RSA-OAEP-pal, aláírás RSA-PSS-sel vagy PKCS#1 v1.5-tel, valamint kulcsok átalakítása SPKI, PKCS#8 és PKCS#1 PEM-formátumok között. Minden a WebCrypto motorral helyben fut — kulcs vagy üzenet soha nem hagyja el ezt az oldalt.
Mire való az RSA: kis üzenetekre és aláírásokra, nem nagy adatmennyiségre. Az RSA hívásonként legfeljebb k−2·hashLen−2 bájtot titkosít (190 bájt 2048 bites kulcsnál SHA-256-tal), és kb. 1000×-szer lassabb az AES-nél. A valódi rendszerek hibrid titkosítást használnak: az RSA egy véletlen AES-kulcsot csomagol, az AES titkosítja az adatot (részletek: AES-eszköz). Ez az oldal tanulásra, tesztelésre és együttműködési ellenőrzésekre szolgál.
Moduluméret:
Hash: Címke:
A PKCS#1 v1.5 titkosítás szándékosan nincs megvalósítva: nincs titkosszöveg-integritása, és kitöltési orákulum-támadásokkal (Bleichenbacher) törhető. Új tervezésnél csak az OAEP a használható titkosítási mód.
Séma: Hash:
Séma: Hash:
Mennyit szállíthat egyetlen RSA-hívás? OAEP üzenetkorlát = kulcsbájtok − 2×hash-bájtok − 2:
ModulusSHA-256SHA-384SHA-512
1024 bit62 bájt30 bájt0 bájt
2048 bit190 bájt126 bájt62 bájt
3072 bit318 bájt254 bájt190 bájt
4096 bit446 bájt382 bájt318 bájt
Az aláírásoknak nincs üzenetkorlátjuk — az üzenetet először hashelik; az aláírás hossza mindig pontosan a kulcsméret (2048 bitnél 256 bájt).
Kulcserősség és élettartam (NIST SP 800-57 1. rész, 5. felülvizsgálat): az 1024 bit 2013 után új használatra tiltott; a 2048 bit ma a minimum, és 2030-ig elfogadható; a 3072 bit és afölötti a kényelmes választás 2031-től. A 8192 bit itt működik, de a generálás a böngészőben akár egy percet vagy többet is igényelhet, és olyan biztonságot jelent, amelyre jelenleg senkinek sincs szüksége — a 3072/4096 előnyben részesítendő.
OpenSSL-együttműködés — az oldal által előállított PEM-ek parancssorban oda-vissza működnek:
openssl pkeyutl -encrypt -pubin -inkey pub.pem ...
openssl pkeyutl -decrypt -inkey priv.pem ...
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 esetén mindkét dgst-hívás kiegészül a -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 kapcsolókkal. Kulcsformátum-átalakítás: az openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem lemezen végzi az SPKI ↔ PKCS#1 átalakítást; ez az oldal a böngészőben végzi.
Önteszt
Az oldal motorját független horgonyokhoz futtatja: kulcsgenerálás három moduluméretnél, OAEP titkosítás/visszafejtés körutak, PSS és PKCS#1 v1.5 aláírás/ellenőrzés hashekre, egy determinisztikus v1.5 aláírásvektor bájtról bájtra (független natív megvalósítással generálva), egy rögzített OAEP-titkosszöveg és PSS-aláírás, amelyet az OpenSSL állított elő, és amelyet ennek az oldalnak vissza kell fejtenie / ellenőriznie (implementációk közötti együttműködés), PEM-formátum-átalakítási körutak, valamint negatív tesztek (megváltoztatott aláírás, rossz kulcs: hibának kell lennie). Semmi nincs elküldve sehova.
Az RSA-titkosítás és az aláírások alapjai a nulláról
Egy mondatban: az RSA nyilvános kulcsú kriptográfia — bárki titkosíthat a nyilvános kulccsal, vagy ellenőrizheti az aláírásokat, de csak a privát kulcs fejthet vissza vagy írhat alá — biztonsága azon múlik, hogy egy 2048 bites szám két prímre bontása meghaladja a létező gépek képességeit.
Mit számol valójában az RSA

Két prím és egy csapóajtó. Egy RSA-kulcs két nagy véletlen prímmel p-vel és q-val indul; szorzatuk n (a modulus, innen a „2048 bites kulcs”) a nyilvános kulccsal együtt, egy e kitevővel közzétéve (szinte mindig 65537). A privát kulcs a d pár, e moduláris inverze − a p-ből és q-ból számítva —, plusz a prímekből származtatott gyorsítások, amelyek a privát kulcsú műveleteket 4×-es gyorsítják.

A titkosítás és az aláírás ugyanaz a hatványozás. Egy üzenetblokk m titkosítása a me mod n kiszámítását jelenti; visszafejtés a cd mod n. Előre formázott blokk aláírása a privát kitevővel, és ellenőrzése a nyilvánossal ugyanaz a művelet az ellenkező irányban. Minden más ezen az oldalon — OAEP, PSS, PKCS#1 — arról szól, hogy ezt a blokkot biztonságosan formázzák, hogy a nyers hatványozás soha ne legyen kitéve.

Miért lassú. Egy RSA-művelet 2048 bites kulccsal nagyságrendileg egymillió-szer több processzoridőt igényel, mint egy blokk AES-sel történő titkosítása. Ezért használ a TLS RSA-t (vagy ECC-t) csak egy véletlen AES-kulcs egyeztetésére, és utána vált. Ugyanez a szabály vonatkozik mindenre, amit készítenek: RSA a kulcsra, AES az adatra.

Kulcsméret. A modulus hossza a biztonsági tárcsa: az 1024 bit irányelvileg feltörtnek számít (a faktorizáció államok elérhetőségén belül van), a 2048 bit ≈ 112 bites szimmetrikus erősség, a 3072 bit ≈ 128 bit, a 15360 bit pedig egy 256 bites szimmetrikus kulcsnak felelne meg. Kvantumos megjegyzés: a Shor-algoritmus nagy kvantumszámítógépen egyszerűen feltöri az RSA-t — még egy ok a kulcsok élettartamának korlátozására.

OAEP: az egyetlen titkosítási kitöltés, amelyet használni kell

A nyers RSA problémája. A tankönyvi RSA (me mod n a nyers üzeneten) determinisztikus és módosítható: az azonos üzenetek azonosan titkosítódnak, egy támadó a titkosszöveget a 2 titkosításával megszorozhatja, hogy a nyílt szöveg megduplázódjon, a rövid üzenetek pedig a közbülső találkozás támadásával megtörnek. Soha nem szabad közvetlenül használni.

Mit csinál az OAEP. Az OAEP (PKCS#1 v2, RFC 8017) az üzenetet egy véletlen maggal keveri egy hash-alapú Feistel-hálózaton keresztül a hatványozás előtt. Az eredmény: a titkosítás randomizált (ugyanaz a nyílt szöveg minden alkalommal más titkosszöveget ad — az OAEP-minta kétszeri futtatása és összehasonlítása ezt megmutatja), a visszafejtéskor a manipuláció észlelhető, és az üzenetnek a modulus belsejébe kell férnie a hash számára fenntartott hellyel — a fent táblázatba foglalt k−2·hashLen−2 korláttal.

A címke. Egy opcionális nyilvános sztring, amely a kitöltésbe kötődik. Mindkét félnek azonos címkét kell megadnia, különben a visszafejtés meghiúsul — mint az AES-GCM AAD-ja, lehetővé teszi, hogy a titkosszöveget kontextushoz kössük (fájlnév, algoritmusazonosító). Az üres érték a szokásos.

A PKCS#1 v1.5 titkosítás szándékosan hiányzik. Az 1993-as korszak kitöltésének nincs integritása, és a visszafejtési hibaviselkedésen át információt szivárogtat (a Bleichenbacher-féle 1998-as támadás kitöltési orákulumot néhány millió szerkesztett titkosszöveggel teljes visszafejtéssé alakít; még 2017-ben is törte valós rendszereket ROBOT néven). A WebCrypto nem valósítja meg; ez az oldal sem.

PSS vs PKCS#1 v1.5 aláírások

Aláírás = hash, majd kitöltés, majd hatványozás. Mindkét séma hasheli az üzenetet (itt SHA-256/384/512), a digestet blokkba formázza, és alkalmazza a privát kitevőt. Az ellenőrzés a nyilvános kulccsal újraformázza a blokkot, és összehasonlítja. A különbség a formázásban van:

SémaBlokktartalomTulajdonságok
RSASSA-PKCS1-v1_5kivonat + digest-info fejléc, determinisztikusUgyanazon üzenet minden aláírása bájtról bájtra azonos (az önellenőrzés v1.5-vektora rögzített). Általános régi támogatás: X.509-tanúsítványok, JWT RS*, TLS 1.3 előtt. Helyes ellenőrzés-implementáció mellett ismert hamisítás nincs.
RSA-PSSkivonat + véletlen só a hash hosszában, MGF1-maszkolásRandomizált — minden aláírás különbözik. A véletlen-orákulum-modellben bizonyíthatóan biztonságos; a jövőbeli TLS 1.3-as tanúsítványokhoz és újabb protokollokhoz szükséges. Az ellenőrzőnek ismernie kell a sóhosszt (ez az oldal a hash hosszát használja, a szokásos alapértelmezést).

Melyik választandó. Új tervezéseknél: PSS. A meglévő tanúsítványokkal, JWT-kkel (RS256) vagy régi partnerekkel való együttműködéshez: v1.5. Mindkettő biztonságos aláírási sémaként — a v1.5-katasztrófa-történet a *titkosítási* kitöltésről szól, ami a hasonló név ellenére más konstrukció.

PKCS#1 vs PKCS#8 vs SPKI: miért négy PEM ugyanarra a kulcsra

A PEM csak base64-gel becsomagolt DER. Egy PEM-fájl címkéből és egy DER (bináris ASN.1) struktúra base64-jéből áll. A címke megmondja, melyik struktúra — és ez az egész különbség az oldal által generált négy formátum között:

PEM-címkeDER-struktúraTartalmaz
-----BEGIN PUBLIC KEY-----SubjectPublicKeyInfo (SPKI)Algoritmusazonosító + nyilvános kulcs (n, e). Mindenütt az alapértelmezett „nyilvános kulcs”.
-----BEGIN RSA PUBLIC KEY-----PKCS#1 RSAPublicKeyCsupasz (n, e). Régi OpenSSL és néhány beágyazott rendszer.
-----BEGIN PRIVATE KEY-----PKCS#8 PrivateKeyInfoAlgoritmusazonosító + privát kulcs. Algoritmusfüggetlen tároló, a modern alapértelmezés.
-----BEGIN RSA PRIVATE KEY-----PKCS#1 RSAPrivateKeyn, e, d, p, q, …. A klasszikus OpenSSL genrsa kimenet.

Ugyanaz a kulcs, más csomagolás. A fenti négy doboz a generálás után ugyanazt a kulcspárt tartalmazza — az SPKI és a PKCS#1 nyilvános kulcs azonos n-t és e-t, a PKCS#8 és PKCS#1 privát kulcs azonos privát értékeket. Az oldal veszteségmentesen konvertál közöttük a böngészőben (önellenőrzése oda-vissza futtatja az átalakításokat). A formátumok összekeverése a legelterjedtebb oka az „érvénytelen kulcs” hibának, amikor kulcsok illesztődnek be eszközök között.

Titkosított PEM-ek (-----BEGIN ENCRYPTED PRIVATE KEY-----) jelszó-alapú titkosító rétegű PKCS#8-ak. Az oldal ezeket nem fogadja el — előbb offline kell visszafejteni (openssl pkcs8 -in enc.pem -out plain.pem).

Gyakori hibák
  • Nagy adatmennyiség titkosítása RSA-val. Az OAEP szigorú méretkorlátján túl abszurdan lassú. A minta: generálni egy véletlen AES-kulcsot, az AES-kulcsot RSA-OAEP-pal titkosítani, az adatot AES-GCM-mel titkosítani, és mindkét részt elküldeni.
  • A privát kulcs közzététele, mert „ez csak teszt”. Az oldal vektoraiba ágyazott mintakulcsok szándékosan vannak közzétéve — csak tesztadatokat írhatnak alá. A valódi kulcsok nem ilyenek.
  • Ellenőrzés a privát kulccsal. Matematikailag általában „működik”, és egyes eszközök engedik, de a privát kulcs ellenőrzőknek való terjesztése megtöri az egész modellt. Az ellenőrzés a nyilvános kulccsal történjen (ezt az oldal kikényszeríti).
  • Aláírások bájtról bájtra való összehasonlítása kód ellenőrzésére. A PSS (és az OAEP) randomizált: két helyes futás különböző kimenetet ad. Összehasonlítás ellenőrzéssel történjen, ne egyenlőséggel — csak a v1.5 aláírások determinisztikusak.
  • 1024 bites kulcsok, „mert gyorsabbak”. Jól finanszírozott faktorizálás hatókörébe esnek. A sebesség érve a hibrid titkosítással megszűnt: az RSA munkamenetenként fut egyszer, nem bájtonként.
  • A PSS-hez a hash-hossztól eltérő sóhossz beégetése. Az ellenőrzőnek egyeznie kell; a hash-hossz (az oldal választása és az OpenSSL -sigopt rsa_pss_saltlen:32) az együttműködő alapértelmezett.
GYIK

Miért hiúsult meg a visszafejtés a „rossz kulcs, rossz hash vagy sérült titkosszöveg” üzenettel? Az OAEP-visszafejtés meghiúsul, ha: nem a megfelelő privát kulcs, a hash eltér a titkosítási oldaltól, a címke eltér, vagy a titkosszöveg egy bájtja megváltozott. A hiba szándékosan azonos minden esetben — annak megmutatása, melyik ellenőrzés hiúsult meg, kitöltési orákulum-szivárgás lenne.

Lehet a nyilvános kulcsot a privátból megkapni? Igen — a privát formátumok is tartalmazzák az n-t és az e-t. Az oldal a generálás után mindkettőt megmutatja; az OpenSSL ezt így végzi: openssl pkey -in priv.pem -pubout.

Miért a 65537 a kitevő? Prím, csak két 1-es bitje van (gyors hatványozás), és elég nagy ahhoz, hogy elkerülje az alacsony kitevős támadásokat, amelyek az e=3-at érintik. Az 1990-es évek óta szabványos választás; egy „furcsa” kitevő általában gyenge vagy nem szabványos kulcsot jelez.

Halott az RSA a kvantumszámítógépek miatt? Még nem — nincs olyan gép, amely a Shor-algoritmust egy 2048 bites modulusra futtatni tudná. De az olyan adatokat, amelyeknek a 2030-as évektől is titokban kell maradniuk, már most migrálják; a PQC-hibrid sémák a mérnöki válasz.

Mi a helyzet az openssl rsautl-lal? Ez a pkeyutl elavult őse. Alapértelmezetten v1.5 titkosítási kitöltést használ — még egy ok, amiért kivonták a forgalomból.