SM2-salaus / -purku / -allekirjoitus

Täydellinen SM2-julkisen avaimen työkalupakki suositellulla käyrällä sm2p256v1 (GB/T 32918.5): luo avainpari, allekirjoita ja vahvista SM3-pohjaisella ZA-järjestelmällä (GB/T 32918.2), ja salaa tai pura standardijärjestyksessä C1C3C2, vanhassa C1C2C3-järjestyksessä tai ASN.1 DER-muodossa. Kaikki toimii selaimessa; mitään ei lähetetä.
Yksityinen avain (hex, 64 numeroa — käsittele kuin salasanaa)
Julkinen avain (hex, 130 numeroa 04-etuliitteellä tai 128 numeroa x||y)
Yksityistä avainta käytetään allekirjoitukseen ja purkuun; julkista vahvistukseen ja salaukseen. Avaimet eivät koskaan poistu tältä sivulta.
Käyttäjätunnus("erottava tunniste", joka sekoitetaan ZA:han; oletus on de facto -standardi)
Lue viesti muodossa: Kiinteä k (edistynyt):
r (hex)
s (hex)
Allekirjoitus, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } - OpenSSL/GmSSL:n käyttämä muoto)
Kiinteä k -kentästä: jokaisen todellisen allekirjoituksen on käytettävä uutta, ennustamatonta k:ta — k:n uudelleenkäyttö tai arvaaminen vuotaa yksityisen avaimen (Sonyn ECDSA-opetus). Tämä sivu luo satunnaisen k:n crypto.getRandomValues-funktiolla aina kun kenttä on tyhjä. Täytä kenttä vain tunnetun vektorin toistamiseen opetusta tai testausta varten.
Käyttäjätunnus(on vastattava allekirjoittajan arvoa)
Lue viesti muodossa: Allekirjoituksen muoto:
r (hex)
s (hex)
✓ Allekirjoitus on KELVOLLINEN
✗ Allekirjoitus on VIRHEELLINEN
Lue viesti muodossa: Salatekstin muoto: Tulos:
Kiinteä k (edistynyt):
Hybridisalauksen muistutus: SM2-salaus on tarkoitettu lyhyille salaisuuksille (istuntoavaimille, PIN-koodeille), ei massadatalle — jokainen viesti maksaa 96 tavun C1+C3-lisäyksen ja elliptisen käyrän pistekertolaskun. Salaa satunnainen SM4/AES-avain SM2:lla ja sitten data symmetrisellä salauksella (SM4-sivu / AES-sivu).
Lue salateksti muodossa: Kertaluku: Kirjoita selkoteksti muodossa:
OpenSSL-ristitarkistus — tämän sivun C1C3C2-hex vastaa komentoa openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x, -pkeyopt ec_scheme:c1c3c2 oletuksena), ja GmSSL:n gmssl sm2randkey / sm2encrypt -työkalut; allekirjoitukset vastaavat komentoa openssl dgst -sm3 -sign samalla käyttäjätunnuksella -pkeyopt sm2_userid:1234567812345678. Johtava 04-tavu ennen C1:tä (kuten useat kirjastot tuottavat) hyväksytään purussa.
Vaatimustenmukaisuushuomautus: SM2 on algoritmivalinta, jonka ajavat kiinalaisen kaupallisen kryptografian vaatimustenmukaisuus ja yhteentoimivuus; turvataso on verrattavissa 256-bittiseen ECC:hen (NIST P-256). Tuotannossa sitä on käytettävä oikean avainhallintajärjestelmän tai laitteistoavainten kanssa — selainsivu on laskin, ei holvi.
Itsetesti
Toistaa avainjohdannan, kiinteän k:n allekirjoitus- ja salausvektorit, jotka tuotti riippumaton Python-viitetoteutus (ja ristitarkistettu GmSSL:llä), DER-allekirjoitus- ja DER-salausrunkokierrokset, satunnaisen k:n allekirjoitus/vahvistus- ja salaus/purku -kierrokset sekä negatiiviset polut (muokattu C3, katkaistu salateksti, käyrän ulkopuolinen julkinen avain, r = 0).
Mikä SM2 on?
Yhdellä lauseella: SM2 on kiinalainen kansallinen standardi julkisen avaimen kryptojärjestelmälle — elliptisen käyrän allekirjoitus- ja salausjärjestelmä kiinteällä käyrällä sm2p256v1, julkaistu nimellä GB/T 32918-2016 (aiemmin GM/T 0003-2012), ja se toimii kiinalaisessa "SM"-sarjassa samaa roolia kuin ECDSA/ECDH (P-256) NIST-maailmassa.
ECC yhdessä kappaleessa (intuitio)

Kaikki elliptisen käyrän kryptografia perustuu yhteen temppuun: kun annetaan peruspiste G käyrällä suurten alkulukukunnan yli ja monikerta P = d·G, d:n laskeminen P:stä tarkoittaa elliptisen käyrän diskreetin logaritmin ongelman ratkaisemista, jolle ei tunneta nopeaa algoritmia. Yksityinen avain d on vain 256-bittinen luku; julkinen avain on piste d·G. SM2 ei ole uusi käyrälaskenta — se on tietty tapa allekirjoittaa (kuten ECDSA) ja salata (kuten pieni ECIES) yhdellä tietyllä käyrällä, tiivistäen SM3:lla SHA:n sijaan.

sm2p256v1 vs. NIST P-256
Näkökulmasm2p256v1NIST P-256 (secp256r1)
Kentän koko256-bittinen alkuluku256-bittinen alkuluku
Käyrän muotoy² = x³ + ax + by² = x³ − 3x + b (a = −3)
Turvataso≈ 128 bittiä≈ 128 bittiä
AllekirjoitusSM2 (GB/T 32918.2), SM3-pohjainen, käyttäjätunnus sidottu ZA:hanECDSA SHA-256:lla
SalausSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, ei NIST-standardoitu)
TiivisteSM3 (GB/T 32905)SHA-2-perhe
Julkaistu2010 suunnittelu, GM/T 0003-2012, GB/T 32918-2016; ISO/IEC 14888-3:ssa1999 (SEC 2 / NIST)
TLS-tukiTLCP (GM/T 386) ja TLS 1.3 RFC 8998 -sarjatkaikkialla

Molemmat käyrät tarjoavat saman konkreettisen turvan; kummallekaan ei tunneta käytännön hyökkäystä. Valinta niiden välillä on sääntely- ja yhteentoimivuuskysymys, ei vahvuuskysymys.

Käyttäjätunnus ja ZA — mitä SM2 allekirjoittaa, mitä ECDSA ei

Ennen tiivistämistä SM2 sisällyttää allekirjoittajan identiteetin tiivisteeseen: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), missä ENTLa on ID:n bittipituus, keskimmäiset neljä kenttää kiinnittävät tarkan käyrän ja kaksi viimeistä ovat allekirjoittajan julkinen avain. Viesti tiivistetään muodossa SM3(ZA ‖ M). Kaksi seurausta: allekirjoitus on sidottu väitettyyn identiteettiin (ominaisuus), ja vahvistajalle on kerrottava allekirjoittajan tunnus ja käytettävä samaa (klassinen yhteentoimivuusansa). Lähes koko ekosysteemi on vakiintunut 16-numeroiseen oletustunnukseen 1234567812345678 — ei standardin tekstistä, vaan GM/T 0003:n liitteen esimerkeistä; OpenSSL:n oletus vastaa sitä, samoin tämä sivu.

Salatekstimuodot: C1C3C2, C1C2C3 ja DER

SM2-salatekstillä on kolme osaa: C1 = efemeerinen piste kG (64 tavua, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 tavua, eheys), C2 = M ⊕ KDF(x2 ‖ y2) (peitetty viesti). Vuoden 2012 GM/T 0003 -teksti yhdisti ne järjestyksessä C1 ‖ C2 ‖ C3; vuoden 2016 GB/T 32918.4-standardi järjesti uudelleen C1 ‖ C3 ‖ C2-järjestykseen, ja OpenSSL 1.1.1+ seurasi. Vanhat pankki- ja hallintojärjestelmät puhuvat yhä vanhaa järjestystä — siksi tällä sivulla on molemmat, lisäksi ASN.1-muoto (SEQUENCE of INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2), jota jotkin kirjastot tuottavat. Kun purku epäonnistuu toisen osapuolen työkalulla, tavujärjestys on ensimmäinen tarkistettava asia.

Yleisiä virheitä
  • k:n uudelleenkäyttö tai säästely. Nonce k sekä allekirjoituksessa että salauksessa on oltava uusi ja ennustamaton jokaisessa operaatiossa. Yksi toistettu k kahdessa allekirjoituksessa antaa yksityisen avaimen kenelle tahansa, joka näkee molemmat. Tämä sivu ottaa k:n selaimen CSPRNG:stä; kiinteän k:n kentät ovat olemassa vain tunnettujen vektorien toistamiseen.
  • Käyttäjätunnusten ristiriita. Jos allekirjoitetaan oletustunnuksella ja vahvistetaan mukautetulla (tai päinvastoin), jokainen kelvollinen allekirjoitus epäonnistuu. Tunnus on osa allekirjoitettua dataa.
  • Oletus, että C1C3C2 on kaikkialla. GM/T 0003 -aikakauden järjestelmät, jotkin älykortit ja vanhemmat GmSSL-versiot oletusarvoisesti käyttävät C1C2C3:a; monet työkalut lisäävät myös pakkaamattoman pisteen 04-tavun. Tämä sivu hyväksyy kaikki nämä purussa.
  • Massadatan salaaminen SM2:lla. Jokainen salateksti kantaa 96 tavun lisäyksen ja maksaa kaksi pistekertolaskua. Käytä SM2:ta avaimeen, SM4:ää/AES:ää dataan.
  • 04-etuliitteisen julkisen avaimen käsittely 65 raakana avaintavuna. 04 on koodausmerkki: itse avain on x ‖ y, 128 hex-numeroa. Tämä sivu hyväksyy molemmat kirjoitustavat.
UKK

Onko tämä yhteensopiva OpenSSL:n / GmSSL:n kanssa? Kyllä. C1C3C2-hex-tuloste vastaa komentoa openssl pkeyutl -sm2encrypt samalle julkiselle avaimelle, viestille ja k:lle; DER-allekirjoitukset vastaavat komentoa openssl dgst -sm3 -sign -tulostetta tavu tavulta (aseta käyttäjätunnus komennolla -pkeyopt sm2_userid:...). Satunnaisella k:lla tehdyt ajot eroavat tietysti — vertaa purkamalla/vahvistamalla, ei yhtäsuuruudella.

Miksi SM2:n avainvaihtoa ei ole tässä? GB/T 32918.3 määrittelee interaktiivisen todennetun avainvaihtoprotokollan; se ei ole järkevää yhden sivun laskimena. Allekirjoitus ja salaus kattavat ei-interaktiiviset käytöt.

Onko SM2 WebCryptossa? Ei — mikään selain ei toteuta sitä (Chrome toimittaa sen vain epästandardien lippujen takana, jos lainkaan). Tämä sivu ajaa alusta asti kirjoitetun JavaScript-toteutuksen, jossa standardin omat liitevektorit on kytketty yllä olevaan itsetestiin.

Voiko OpenSSL:n PEM-avainta käyttää? Vie raaka hex sen sijaan: openssl ec -in key.pem -text tulostaa yksityisen skalaarin ja julkisen pisteen. Tämä sivu hyväksyy vain hex-avaimia tarkoituksella — PEM/SEC1-koneisto kuuluu RSA-sivulle, jonne se kuuluu.

Mikä SM9 sitten on? Eri eläin: identiteettipohjainen kryptografia, jossa mikä tahansa merkkijono (sähköpostiosoite) on julkinen avain ja KGC myöntää yksityiset avaimet. Katso SM9-yleiskatsaussivu.