SM2 šifrovanie / dešifrovanie / podpis

Úplná sada nástrojov verejného kľúča SM2 na odporúčanej krivke sm2p256v1 (GB/T 32918.5): generovanie páru kľúčov, podpisovanie a overovanie schémou ZA na báze SM3 (GB/T 32918.2) a šifrovanie alebo dešifrovanie v štandardnom poradí C1C3C2, v staršom poradí C1C2C3 alebo v ASN.1 DER. Všetko beží v prehliadači; nič sa nenahráva.
Súkromný kľúč (hex, 64 číslic — s ním sa zaobchádza ako s heslom)
Verejný kľúč (hex, 130 číslic s prefixom 04 alebo 128 číslic x||y)
Súkromný kľúč používa Podpísať a Dešifrovať; verejný kľúč Overiť a Šifrovať. Kľúče túto stránku nikdy neopúšťajú.
ID používateľa(„rozlišujúci identifikátor“ zmiešaný do ZA; predvolený je de facto štandard)
Čítať správu ako: Pevné k (pokročilé):
r (hex)
s (hex)
Podpis, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } — formát, ktorý používajú OpenSSL/GmSSL)
O poli pevného k: každý skutočný podpis musí používať nové nepredvídateľné k — opätovné použitie alebo uhádnutie k prezradí súkromný kľúč (lekcia z ECDSA v Sony). Táto stránka generuje náhodné k cez crypto.getRandomValues, kedykoľvek je pole prázdne. Pole sa vypĺňa len na reprodukciu známeho vektora na výuku alebo testovanie.
ID používateľa(musí zodpovedať podpisovateľovi)
Čítať správu ako: Formát podpisu:
r (hex)
s (hex)
✓ Podpis je PLATNÝ
✗ Podpis je NEPLATNÝ
Čítať správu ako: Formát šifrovaného textu: Výstup:
Pevné k (pokročilé):
Pripomienka hybridného šifrovania: šifrovanie SM2 je určené pre krátke tajomstvá (relačné kľúče, PIN), nie pre veľké údaje — každá správa nesie 96 bajtov režie C1+C3 a jedno násobenie bodu na eliptickej krivke. Náhodný kľúč SM4/AES sa zašifruje cez SM2 a potom údaje symetrickou šifrou (stránka SM4 / stránka AES).
Čítať šifrovaný text ako: Rád: Zapísať otvorený text ako:
Krížová kontrola cez OpenSSL — hex C1C3C2 tejto stránky sa zhoduje s openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x s -pkeyopt ec_scheme:c1c3c2, predvolené) a s nástrojmi GmSSL gmssl sm2randkey / sm2encrypt; podpisy sa zhodujú s openssl dgst -sm3 -sign pri rovnakom ID používateľa cez -pkeyopt sm2_userid:1234567812345678. Úvodný bajt 04 pred C1 (ako ho vytvára niekoľko knižníc) sa pri dešifrovaní akceptuje.
Poznámka k súladu: SM2 je voľba algoritmu daná čínskou komerčnou kryptografickou reguláciou a interoperabilitou, s bezpečnosťou porovnateľnou s 256-bitovým ECC (NIST P-256). V produkcii ho treba spárovať so skutočným systémom správy kľúčov alebo hardvérovými kľúčmi — stránka v prehliadači je kalkulačka, nie trezor.
Autotest
Zopakuje sa odvodenie kľúčov, podpisy s pevným k a vektory šifrovania, ktoré vytvoril nezávislý referenčný Python (a overil voči gmssl), okrúhle cesty podpisov DER a šifrovaného textu DER, náhodné k pri podpisovaní/overovaní a šifrovaní/dešifrovaní a negatívne cesty (pozmenené C3, skrátený šifrovaný text, verejný kľúč mimo krivky, r = 0).
Čo je SM2?
Jednou vetou: SM2 je čínsky národný štandard kryptosystému s verejným kľúčom — schéma podpisu a šifrovania s eliptickými krivkami nad pevnou krivkou sm2p256v1, publikovaná ako GB/T 32918-2016 (skôr GM/T 0003-2012), a v čínskej sade „SM“ zohráva rolu, akú v svete NIST zohrávajú ECDSA/ECDH (P-256).
ECC v jednom odseku (intuícia)

Celá kryptografia s eliptickými krivkami stojí na jednom triku: ak je daný základný bod G na krivke nad veľkým prvočíselným poľom a násobok P = d·G, výpočet d z P znamená riešenie problému diskrétneho logaritmu na eliptickej krivke, pre ktorý nie je známy rýchly algoritmus. Súkromný kľúč d je len 256-bitové číslo; verejný kľúč je bod d·G. SM2 nie je nová aritmetika kriviek — je to konkrétny spôsob podpisovania (podobne ako ECDSA) a šifrovania (podobne ako miniatúrne ECIES) na jednej konkrétnej krivke, s hashovaním cez SM3 namiesto SHA.

sm2p256v1 vs NIST P-256
Aspektsm2p256v1NIST P-256 (secp256r1)
Veľkosť poľa256-bitové prvočíslo256-bitové prvočíslo
Tvar krivkyy² = x³ + ax + by² = x³ − 3x + b (a = −3)
Úroveň bezpečnosti≈ 128 bitov≈ 128 bitov
PodpisSM2 (GB/T 32918.2), na báze SM3, ID používateľa viazané do ZAECDSA so SHA-256
ŠifrovanieSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, nie je štandardizované NIST)
HashSM3 (GB/T 32905)rodina SHA-2
Publikovanénávrh z roku 2010, GM/T 0003-2012, GB/T 32918-2016; v ISO/IEC 14888-31999 (SEC 2 / NIST)
Podpora TLSTLCP (GM/T 386) a sady TLS 1.3 RFC 8998všade

Obe krivky ponúkajú rovnakú konkrétnu bezpečnosť; ani jedna nemá praktický útok. Voľba medzi nimi je regulačná a otázka interoperability, nie sily.

ID používateľa a ZA — to, čo SM2 podpisuje a ECDSA nie

Pred hashovaním SM2 zahŕňa identitu podpisovateľa do odtlačku: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), kde ENTL je dĺžka ID v bitoch, štyri stredné polia pevne určujú presnú krivku a posledné dve sú verejný kľúč podpisovateľa. Správa sa hashuje ako SM3(ZA ‖ M). Z toho plynú dva dôsledky: podpis je viazaný na tvrdenú identitu (výhoda) a overovateľ musí poznať ID podpisovateľa a použiť rovnaké (klasická pasca interoperability). Takmer celý ekosystém sa ustálil na 16-miestnom predvolenom 1234567812345678 — nie z textu štandardu, ale z príkladov v prílohe GM/T 0003; predvolené nastavenie OpenSSL sa s ním zhoduje a rovnako aj táto stránka.

Formáty šifrovaného textu: C1C3C2, C1C2C3 a DER

Šifrovaný text SM2 má tri časti: C1 = efemérny bod kG (64 bajtov, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 bajtov, integrita), C2 = M ⊕ KDF(x2 ‖ y2) (zamaskovaná správa). Text GM/T 0003 z roku 2012 ich spájal C1 ‖ C2 ‖ C3; štandard GB/T 32918.4 z roku 2016 poradie zmenil na C1 ‖ C3 ‖ C2 a OpenSSL 1.1.1+ ho nasledovalo. Staré bankové a vládne systémy stále používajú pôvodné poradie — preto táto stránka podporuje obe, plus formu ASN.1 (SEQUENCE z INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2), ktorú niektoré knižnice vytvárajú. Keď dešifrovanie zlyhá s nástrojom druhej strany, prvá vec na kontrolu je poradie bajtov.

Časté chyby
  • Opätovné použitie alebo šetrenie na k. Nonce k pri podpisovaní aj šifrovaní musí byť pri každej operácii nové a nepredvídateľné. Jedno zopakované k pri dvoch podpisoch odovzdá súkromný kľúč každému, kto vidí oba. Táto stránka čerpá k z CSPRNG prehliadača; polia pevného k slúžia len na reprodukciu známych vektorov.
  • Nesprávne ID používateľa. Podpis s predvoleným ID a overenie s vlastným (alebo naopak) spôsobí zlyhanie každého platného podpisu. ID je súčasťou podpísaných údajov.
  • Predpoklad, že všade platí C1C3C2. Systémy z éry GM/T 0003, niektoré čipové karty a staršie zostavenia GmSSL predvolene používajú C1C2C3; niekoľko nástrojov tiež pridáva na začiatok bajt 04 nekomprimovaného bodu. Táto stránka všetky tieto formy pri dešifrovaní prijíma.
  • Šifrovanie veľkých údajov cez SM2. Každý šifrovaný text nesie 96 bajtov režie a stojí dve násobenia bodov. Na kľúč sa použije SM2, na údaje SM4/AES.
  • Spracovanie verejného kľúča s prefixom 04 ako 65 surových bajtov kľúča. Bajt 04 je značka kódovania: samotný kľúč je x ‖ y, 128 šestnástkových číslic. Táto stránka prijíma oba zápisy.
FAQ

Je to kompatibilné s OpenSSL / GmSSL? Áno. Výstup C1C3C2 v hex sa zhoduje s openssl pkeyutl -sm2encrypt pre rovnaký verejný kľúč, správu a k; podpisy DER sa bajt po bajte zhodujú s výstupom openssl dgst -sm3 -sign (ID používateľa sa nastaví cez -pkeyopt sm2_userid:...). Behy s náhodným k sa samozrejme líšia — porovnanie sa robí overením alebo dešifrovaním, nie rovnosťou.

Prečo tu nie je výmena kľúčov SM2? GB/T 32918.3 definuje interaktívny autentifikovaný protokol výmeny kľúčov; ako jednostranková kalkulačka nedáva zmysel. Podpis a šifrovanie pokrývajú neinteraktívne použitia.

Je SM2 vo WebCrypto? Nie — žiadny prehliadač ju neimplementuje (Chrome ju sprístupňuje iba za nestandardnými príznakmi, ak vôbec). Táto stránka beží na implementácii v JavaScripte napísanej od nuly, s vektormi z príloh štandardu zapojenými do samotestu vyššie.

Dá sa použiť kľúč PEM z OpenSSL? Namiesto toho sa exportuje surový hex: openssl ec -in key.pem -text vypíše súkromný skalár a verejný bod. Táto stránka prijíma iba kľúče v hex, a to zámerne — mechanika PEM/SEC1 patrí na stránku RSA, kam patrí.

Čo je potom SM9? Iné zviera: kryptografia založená na identite, kde ľubovoľný reťazec (napríklad e-mailová adresa) je verejný kľúč a KGC vydáva súkromné kľúče$1Súvisiace: prehľad SM9.