RSA-salaus / -purku — RSA-OAEP, PSS ja PKCS#1 v1.5
RSA-salaus / -purku
Luo RSA-avainpareja selaimessa, salaa ja pura RSA-OAEP:lla, allekirjoita RSA-PSS:llä tai PKCS#1 v1.5:llä ja muunna avaimia SPKI-, PKCS#8- ja PKCS#1 PEM -muotojen välillä. Kaikki toimii paikallisesti WebCrypto-moottorilla — yksikään avain tai viesti ei poistu tältä sivulta.
Mihin RSA on tarkoitettu: pieniin viesteihin ja allekirjoituksiin, ei massadataan. RSA salaa enintään k−2·hashLen−2 tavua kutsua kohden (190 tavua 2048-bittisellä avaimella SHA-256:lla) ja on noin 1000× hitaampi kuin AES. Todelliset järjestelmät käyttävät hybridisalausta: RSA kääri satunnaisen AES-avaimen, AES salaa datan (katso AES-työkalu). Tämä sivu on oppimista, testausta ja yhteentoimivuustarkistuksia varten.
1. Luo avainpari(WebCrypto, paikallisesti; kaikki neljä PEM-muotoa tuotetaan yhdessä)
Modulin koko:
Julkinen avain — SPKI(-----BEGIN PUBLIC KEY-----, tavallinen "RSA-julkinen avain" -muoto)
Julkinen avain — PKCS#1(-----BEGIN RSA PUBLIC KEY-----, pelkkä moduli + eksponentti)
Yksityinen avain — PKCS#8(-----BEGIN PRIVATE KEY-----, salaamaton; käsittele kuin salasanaa)
Yksityinen avain — PKCS#1(-----BEGIN RSA PRIVATE KEY-----, klassinen OpenSSL-muoto)
Avaimen luominen selaimessa ei salaa sitä. Tallennusta varten siirrä se oikeaan avainvarastoon tai salaa se offline-tilassa.
2. Tai tuo olemassa oleva avain(liitä mikä tahansa neljästä PEM-muodosta)
3. Salaa / pura (RSA-OAEP)- suunta seuraa nykyistä avainta: julkinen = salaa, yksityinen = pura
Tiiviste:Nimike:
PKCS#1 v1.5 -salaus on tarkoituksella toteuttamatta: sillä ei ole salatekstin eheyttä, ja se murtuu täytekyselyhyökkäyksillä (Bleichenbacher). OAEP on ainoa salaustila, jota uusi suunnitelma voi käyttää.
4. Allekirjoita (vaatii yksityisen avaimen)- PSS (satunnaistettu, nykyaikainen) tai PKCS#1 v1.5 (deterministinen, vanhaa yhteensopiva)
Järjestelmä:Tiiviste:
5. Vahvista (vaatii julkisen avaimen)- liitä viesti ja allekirjoitus
Järjestelmä:Tiiviste:
Kuinka paljon yksi RSA-kutsu voi kantaa?OAEP-viestiraja = avaimen tavut − 2×tiivisteen tavut − 2:
Moduli
SHA-256
SHA-384
SHA-512
1024-bittinen
62 tavua
30 tavua
0 tavua
2048-bittinen
190 tavua
126 tavua
62 tavua
3072-bittinen
318 tavua
254 tavua
190 tavua
4096-bittinen
446 tavua
382 tavua
318 tavua
Allekirjoituksilla ei ole viestirajaa — viesti tiivistetään ensin; allekirjoitus itsessään on aina täsmälleen avaimen koko (256 tavua 2048-bittiselle).
Avaimen vahvuus ja elinikä(NIST SP 800-57 Part 1 Rev. 5): 1024-bittinen kiellettiin uuteen käyttöön vuoden 2013 jälkeen; 2048-bittinen on tänään vähimmäismäärä ja pysyy hyväksyttävänä vuoteen 2030 asti; 3072-bittinen ja suuremmat ovat mukava valinta vuodesta 2031 eteenpäin. 8192-bittinen toimii tässä, mutta luonti voi kestää minuutin tai pidempään selaimessa, ja se ostaa turvallisuutta, jota kukaan ei tällä hetkellä tarvitse — suosi 3072/4096.
Itsetesti Ajaa sivun moottorin riippumattomia ankkureita vastaan: avaingeneroinnin kolmella moduulikoolla, OAEP-salaus- ja purkukierrokset, PSS- ja PKCS#1 v1.5 -allekirjoitus ja vahvistus eri tiivisteillä, deterministisen v1.5-allekirjoituksen vektori tavu tavulta (tuotettu riippumattomalla natiivitoteutuksella), kiinteä OAEP-salateksti ja PSS-allekirjoitus, jotka OpenSSL tuotti ja jotka tämän sivun on purettava/vahvistettava (ristiin toteutusten yhteensopivuus), PEM-muunnosten kierrokset ja negatiiviset testit (muokattu allekirjoitus, väärä avain on epäonnistuttava). Mitään ei lähetetä minnekään.
RSA-salaus ja -allekirjoitukset alusta asti selitettynä
Yhdellä lauseella: RSA on julkisen avaimen kryptografiaa — kuka tahansa voi salata viestejä julkisella avaimella tai vahvistaa allekirjoituksia, mutta vain yksityinen avain voi purkaa tai allekirjoittaa — ja sen turvallisuus perustuu siihen, ettei 2048-bittisen luvun jakaminen kahteen alkulukuun ole minkään olemassa olevan tietokoneen ulottuvilla.
Mitä RSA oikeasti laskee
Kaksi alkulukua ja takaovi. RSA-avain alkaa kahdesta suuresta satunnaisesta alkuluvusta p ja q; niiden tulo n (moduli, siis "2048-bittinen avain") julkaistaan julkisessa avaimessa yhdessä eksponentin e kanssa (lähes aina 65537). Yksityinen avain on pari d, joka on e:n modulaarinen käänteisluku − laskettuna p:stä ja q:sta — sekä alkuluvuista johdetut oikotiet, jotka nopeuttavat yksityisen avaimen toimintoja 4×.
Salaus ja allekirjoitus ovat sama potenssiinkorotus. Viestilohkon m salaaminen tarkoittaa laskemista me mod n; purkaminen on cd mod n. Esimuotoillun lohkon allekirjoittaminen yksityisellä eksponentilla ja vahvistaminen julkisella on sama toiminto toiseen suuntaan. Kaikki muu tällä sivulla — OAEP, PSS, PKCS#1 — koskee sitä, miten lohko muotoillaan turvallisesti, jotta raakaa potenssiinkorotusta ei koskaan paljasteta.
Miksi se on hidasta. Yksi RSA-toiminto 2048-bittisellä avaimella maksaa suuruusluokkaa miljoona kertaa enemmän prosessoritehoa kuin yhden lohkon salaaminen AES:llä. Siksi TLS käyttää RSA:ta (tai ECC:tä) vain satunnaisen AES-avaimen sopimiseen ja vaihtaa sitten. Sama sääntö pätee kaikkeen, mitä rakennat: RSA avaimelle, AES datalle.
Avaimen koko. Modulin pituus on turvallisuuden säädin: 1024-bittinen on käytännössä rikki (tekijöihin jako on valtioiden ulottuvilla), 2048-bittinen ≈ 112 bitin symmetrinen vahvuus, 3072-bittinen ≈ 128 bittiä, 15360-bittinen vastaisi 256-bittistä symmetristä avainta. Kvanttihuomautus: Shorin algoritmi murtaa RSA:n kokonaan suurella kvanttitietokoneella — yksi lisäsyy pitää avainten elinikä rajallisena.
OAEP: ainoa salaustäyte, jota kannattaa käyttää
Raa'an RSA:n ongelma. Oppikirjan RSA (me mod n raakaviestille) on deterministinen ja muokattavissa: samat viestit salautuvat samoin, hyökkääjä voi kertoa salatekstin salauksella luvusta 2, jolloin selkoteksti kaksinkertaistuu, ja lyhyet viestit murtuvat kohtaamisen keskeltä -hyökkäyksellä. Sitä ei saa koskaan käyttää suoraan.
Mitä OAEP tekee. OAEP (PKCS#1 v2, RFC 8017) sekoittaa viestin satunnaiseen siemeneen tiivisteperusteisen Feistel-verkon kautta ennen potenssiinkorotusta. Tulos: salaus on satunnaistettu (sama selkoteksti antaa joka kerta eri salatekstin — aja OAEP-esimerkki kahdesti ja vertaa), manipulointi havaitaan purussa, ja viestin on mahduttava moduliin tilan jätettyään tiivisteelle — yllä taulukoitu raja k−2·hashLen−2.
Nimike. Valinnainen julkinen merkkijono, joka sidotaan täytteeseen. Molempien osapuolten on annettava täsmälleen sama nimike, muuten purku epäonnistuu — kuten AES-GCM:n AAD, sen avulla voi sitoa salatekstin kontekstiin (tiedostonimi, algoritmitunnus). Tyhjä on normaali.
PKCS#1 v1.5 -salaus puuttuu tarkoituksella. Vuoden 1993 aikainen täyte ei sisällä eheyttä ja vuotaa tietoa purun virhekäyttäytymisen kautta (Bleichenbacherin vuoden 1998 hyökkäys muuttaa täytekyselyn täydeksi purkuksi muutamalla miljoonalla laaditulla salatekstillä; se murtaa yhä oikeita järjestelmiä nimellä ROBOT, 2017). WebCrypto kieltäytyy toteuttamasta sitä; niin tekee tämä sivu.
PSS vs PKCS#1 v1.5 -allekirjoitukset
Allekirjoitus = tiivistä, täytä, korota potenssiin. Molemmat järjestelmät tiivistävät viestin (SHA-256/384/512 tässä), muotoilevat tiivisteen lohkoksi ja soveltavat yksityistä eksponenttia. Vahvistus muotoilee lohkon uudelleen julkisella avaimella ja vertaa. Ero on muotoilussa:
Järjestelmä
Lohkon sisältö
Ominaisuudet
RSASSA-PKCS1-v1_5
tiiviste + tiivisteinfo-otsikko, deterministinen
Saman viestin jokainen allekirjoitus on tavu tavulta identtinen (tarkista itsetesti: sen v1.5-vektori on kiinteä). Yleinen vanhan tuen: X.509-varmenteet, JWT RS*, TLS ennen 1.3:a. Ei tunnettua väärennystä, kun vahvistus on toteutettu oikein.
Satunnaistettu — jokainen allekirjoitus eroaa. Todistettavasti turvallinen satunnaisoraakkelimallissa; vaaditaan tulevaisuuden TLS 1.3 -varmenteissa ja uudemmissa protokollissa. Vahvistajan on tiedettävä suolan pituus (tämä sivu käyttää tiivisteen pituutta, yleinen oletus).
Kumman valita. Uudet suunnitelmat: PSS. Yhteentoimivuus olemassa olevien varmenteiden, JWT:iden (RS256) tai vanhojen vertaisten kanssa: v1.5. Molemmat ovat turvallisia allekirjoitusjärjestelminä — v1.5-katastrofitarina koskee *salaustäytettä*, eri rakennelmaa, vaikka nimi on samankaltainen.
PKCS#1 vs PKCS#8 vs SPKI: miksi sama avain on neljänä PEM:nä
PEM on vain base64-kääritty DER. PEM-tiedosto on nimike ja DER:n (binäärinen ASN.1-rakenne) base64-muoto. Nimike kertoo, mikä rakenne on — ja siinä on koko ero neljän tässä sivulla luodun muodon välillä:
PEM-nimike
DER-rakenne
Sisältää
-----BEGIN PUBLIC KEY-----
SubjectPublicKeyInfo (SPKI)
Algoritmitunniste + julkinen avain (n, e). Oletusarvoinen "julkinen avain" kaikkialla.
-----BEGIN RSA PUBLIC KEY-----
PKCS#1 RSAPublicKey
Pelkkä (n, e). Vanhat OpenSSL ja jotkin sulautetut pinot.
-----BEGIN PRIVATE KEY-----
PKCS#8 PrivateKeyInfo
Algoritmitunniste + yksityinen avain. Algoritmiriippumaton kontti, nykyaikainen oletus.
-----BEGIN RSA PRIVATE KEY-----
PKCS#1 RSAPrivateKey
n, e, d, p, q, …. Klassinen OpenSSL genrsa -tuloste.
Sama avain, eri kääreet. Kaikki neljä yllä olevaa ruutua Luo-toiminnon jälkeen sisältävät saman avainparin — SPKI ja PKCS#1 julkinen sisältävät samat n:n ja e:n, PKCS#8 ja PKCS#1 yksityinen samat yksityiset arvot. Tämä sivu muuntaa niiden välillä häviöttömästi selaimessa (sen itsetesti tekee muunnoskierroksia). Muotojen sekoittaminen on yksittäinen yleisin syy "virheelliseen avaimeen" -virheisiin, kun avaimia liitetään työkalujen välillä.
Salatut PEM:t (-----BEGIN ENCRYPTED PRIVATE KEY-----) ovat PKCS#8:aa salasanapohjaisella salauskerroksella. Tämä sivu ei hyväksy niitä — pura ne ensin offline-tilassa (openssl pkcs8 -in enc.pem -out plain.pem).
Yleisiä virheitä
Massadatan salaaminen RSA:lla. Kovan OAEP-kokorajan ylittävällä datalla se on järjettömän hidasta. Malli on: luo satunnainen AES-avain, salaa AES-avain RSA-OAEP:llä, salaa data AES-GCM:llä ja lähetä molemmat osat.
Yksityisen avaimen toimittaminen, koska "se on testi". Tämän sivun vektoreihin upotetut esimerkkiavaimet on julkaistu tarkoituksella — ne voivat allekirjoittaa vain testidataa. Todelliset avaimet eivät ole sellaisia.
Vahvistaminen yksityisellä avaimella. Se yleensä "toimii" matemaattisesti, ja jotkin työkalut sallivat sen, mutta yksityisen avaimen jakaminen vahvistajille kumoaa koko mallin. Vahvista julkisella avaimella (tämä sivu pakottaa sen).
Allekirjoitusten vertaaminen tavu tavulta koodin tarkistamiseksi. PSS (ja OAEP) ovat satunnaistettuja: kaksi oikeaa ajoa tuottaa eri tuloksia. Vertaa vahvistamalla, ei yhtäsuuruudella — vain v1.5-allekirjoitukset ovat deterministisiä.
1024-bittiset avaimet, "koska ne ovat nopeampia". Ne ovat myös hyvin rahoitettujen tekijöihin jakamisen ulottuvilla. Nopeusargumentti kuoli hybridisalauksen myötä: RSA ajetaan kerran istuntoa kohden, ei tavua kohden.
PSS:n suolan pituuden kovakoodaaminen muuksi kuin tiivisteen pituudeksi. Vahvistajan on oltava samaa mieltä; tiivisteen pituus (tämän sivun valinta ja OpenSSL:n -sigopt rsa_pss_saltlen:32) on yhteentoimiva oletus.
UKK
Miksi purku epäonnistui viestillä "väärä avain, väärä tiiviste tai vioittunut salateksti"? OAEP-purku epäonnistuu, kun jokin seuraavista pitää paikkansa: kyseessä ei ole vastaava yksityinen avain, tiiviste eroaa salauspuolelta, nimike eroaa tai salatekstin tavu on muuttunut. Virheviesti on tarkoituksella sama kaikissa tapauksissa — sen paljastaminen, mikä tarkistus epäonnistui, olisi itsessään täytevuoto (padding oracle).
Onko julkista avainta mahdollista saada yksityisestä? Kyllä — yksityiset muodot sisältävät myös n:n ja e:n. Tämä sivu näyttää molemmat Luo-toiminnon jälkeen; OpenSSL tekee sen komennolla openssl pkey -in priv.pem -pubout.
Miksi eksponentti on 65537? Se on alkuluku, sillä on vain kaksi 1-bittiä (nopea potenssiinkorotus), ja se on riittävän suuri välttämään matalan eksponentin hyökkäykset, jotka osuvat e=3:een. Se on ollut vakiovalinta 1990-luvulta lähtien; ”outo” eksponentti tarkoittaa yleensä heikkoa tai epästandardia avainta.
Onko RSA kuollut kvanttitietokoneiden takia? Ei vielä — ei ole olemassa konetta, joka voisi ajaa Shorin algoritmia 2048-bittisellä modulilla. Mutta data, jonka on pysyttävä salassa 2030-luvulle asti tai pidempään, siirretään jo; PQC-hybridijärjestelmät ovat insinööriratkaisu.
Entä openssl rsautl? Se on pkeyutl:n vanhentunut edeltäjä. Oletuksena se käyttää v1.5-salaustäytettä — yksi lisäsyy, miksi se poistettiin käytöstä.