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.
1. Kulcspár generálása(WebCrypto, helyben; a négy PEM-formátum együtt készül)
Moduluméret:
Nyilvános kulcs — SPKI(-----BEGIN PUBLIC KEY-----, a szokásos „RSA nyilvános kulcs” formátum)
Nyilvános kulcs — PKCS#1(-----BEGIN RSA PUBLIC KEY-----, csupasz modulus és kitevő)
Privát kulcs — PKCS#1(-----BEGIN RSA PRIVATE KEY-----, a klasszikus OpenSSL-formátum)
A kulcs böngészős generálása nem titkosítja a kulcsot. Tároláshoz valódi kulcstárolóba kell helyezni, vagy offline titkosítani.
2. Vagy meglévő kulcs importálása(a négy PEM-formátum bármelyike beilleszthető)
3. Titkosítás / visszafejtés (RSA-OAEP)- az irány az aktuális kulcstól függ: nyilvános = titkosítás, privát = visszafejtés
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.
4. Aláírás (privát kulcs szükséges)- PSS (randomizált, modern) vagy PKCS#1 v1.5 (determinisztikus, régi kompatibilitású)
Séma:Hash:
5. Ellenőrzés (nyilvános kulcs szükséges)- az üzenet és az aláírás beilleszthető
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éma
Blokktartalom
Tulajdonságok
RSASSA-PKCS1-v1_5
kivonat + digest-info fejléc, determinisztikus
Ugyanazon ü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-PSS
kivonat + véletlen só a hash hosszában, MGF1-maszkolás
Randomizá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ímke
DER-struktúra
Tartalmaz
-----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 RSAPublicKey
Csupasz (n, e). Régi OpenSSL és néhány beágyazott rendszer.
-----BEGIN PRIVATE KEY-----
PKCS#8 PrivateKeyInfo
Algoritmusazonosító + privát kulcs. Algoritmusfüggetlen tároló, a modern alapértelmezés.
-----BEGIN RSA PRIVATE KEY-----
PKCS#1 RSAPrivateKey
n, 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.