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.
Modulin koko:
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ää.
Järjestelmä: Tiiviste:
Järjestelmä: Tiiviste:
Kuinka paljon yksi RSA-kutsu voi kantaa? OAEP-viestiraja = avaimen tavut − 2×tiivisteen tavut − 2:
ModuliSHA-256SHA-384SHA-512
1024-bittinen62 tavua30 tavua0 tavua
2048-bittinen190 tavua126 tavua62 tavua
3072-bittinen318 tavua254 tavua190 tavua
4096-bittinen446 tavua382 tavua318 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.
OpenSSL-yhteentoimivuus — tämän sivun tuottamat PEM:t kiertävät komentoriviltä:
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
PSS: lisää -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 molempiin dgst-kutsuihin. Avainmuodon muunnos: openssl rsa -in key.pem -RSAPublicKey -out pubkey.pem tekee SPKI ↔ PKCS#1 levyllä; tämä sivu tekee sen selaimessa.
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_5tiiviste + tiivisteinfo-otsikko, deterministinenSaman 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.
RSA-PSStiiviste + satunnainen suola tiivisteen pituudelta, MGF1-peittoSatunnaistettu — 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-nimikeDER-rakenneSisältää
-----BEGIN PUBLIC KEY-----SubjectPublicKeyInfo (SPKI)Algoritmitunniste + julkinen avain (n, e). Oletusarvoinen "julkinen avain" kaikkialla.
-----BEGIN RSA PUBLIC KEY-----PKCS#1 RSAPublicKeyPelkkä (n, e). Vanhat OpenSSL ja jotkin sulautetut pinot.
-----BEGIN PRIVATE KEY-----PKCS#8 PrivateKeyInfoAlgoritmitunniste + yksityinen avain. Algoritmiriippumaton kontti, nykyaikainen oletus.
-----BEGIN RSA PRIVATE KEY-----PKCS#1 RSAPrivateKeyn, 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ä.