SM2 šifrování / dešifrování / podpis

Kompletní sada nástrojů SM2 s veřejným klíčem na doporučené křivce sm2p256v1 (GB/T 32918.5): vygenerujte pár klíčů, podepisujte a ověřujte schématem ZA založeným na SM3 (GB/T 32918.2) a šifrujte nebo dešifrujte ve standardním pořadí C1C3C2, v zastaralém pořadí C1C2C3, nebo v ASN.1 DER. Vše běží ve vašem prohlížeči; nic se nenahrává.
Soukromý klíč (hex, 64 číslic — zacházejte s ním jako s heslem)
Veřejný klíč (hex, 130 číslic s předponou 04, nebo 128 číslic x||y)
Soukromý klíč používají Podepsat a Dešifrovat; veřejný klíč Ověřit a Šifrovat. Klíče tuto stránku nikdy neopouštějí.
ID uživatele(„rozlišující identifikátor“ mísený do ZA; výchozí je de facto standard)
Číst zprávu jako: Pevné k (pokročilé):
r (hex)
s (hex)
Podpis, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } — formát, který používají OpenSSL/GmSSL)
K poli pevného k: každý skutečný podpis musí používat nový, nepředvídatelný k — opětovné použití nebo odhad k prozradí soukromý klíč (lekce o ECDSA u Sony). Tato stránka generuje náhodné k z crypto.getRandomValues, kdykoli je pole prázdné. Pole vyplňte jen tehdy, když chcete reprodukovat známý vektor pro výuku nebo testování.
ID uživatele(musí odpovídat podepisujícímu)
Číst zprávu jako: Formát podpisu:
r (hex)
s (hex)
✓ Podpis je PLATNÝ
✗ Podpis je NEPLATNÝ
Číst zprávu jako: Formát šifrotextu: Výstup:
Pevné k (pokročilé):
Připomenutí hybridního šifrování: šifrování SM2 je určeno pro krátká tajemství (session klíče, PIN), ne pro velká data — každá zpráva platí 96 bajty režie C1+C3 a násobením bodu na eliptické křivce. Náhodný klíč SM4/AES zašifrujte pomocí SM2 a data pak symetrickou šifrou (stránka SM4 / stránka AES).
Číst šifrotext jako: Řád: Zapisovat prostý text jako:
Kontrola v OpenSSL — šestnáctkový výstup C1C3C2 této stránky odpovídá openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x s -pkeyopt ec_scheme:c1c3c2, výchozí) a nástrojům GmSSL gmssl sm2randkey / sm2encrypt; podpisy odpovídají openssl dgst -sm3 -sign se stejným ID uživatele přes -pkeyopt sm2_userid:1234567812345678. Úvodní bajt 04 před C1 (jak ho produkuje několik knihoven) se při dešifrování přijme.
Poznámka k souladu: SM2 je volba algoritmu daná čínskými požadavky na komerční kryptografii a interoperabilitu; její bezpečnost je srovnatelná s 256bitovou ECC (NIST P-256). V produkci ji kombinujte se skutečným systémem správy klíčů nebo hardwarovými klíči — stránka v prohlížeči je kalkulačka, ne trezor.
Autotest
Přehraje vektory odvození klíče, podpisů s pevným k a šifrování vytvořené nezávislou referenční implementací v Pythonu (a zkontrolované proti gmssl), kolečka DER podpisu a DER šifrotextu, kolečka podepsat/ověřit a šifrovat/dešifrovat s náhodným k a negativní cesty (poškozené C3, useknutý šifrotext, veřejný klíč mimo křivku, r = 0).
Co je SM2?
Stručně: SM2 je čínský národní standard kryptosystému s veřejným klíčem — schéma podpisu a šifrování nad eliptickou křivkou s pevnou křivkou sm2p256v1, publikované jako GB/T 32918-2016 (dříve GM/T 0003-2012). V čínské sadě „SM“ plní roli, kterou v světě NIST plní ECDSA/ECDH (P-256).
ECC v jednom odstavci (intuice)

Veškerá kryptografie eliptických křivek stojí na jednom triku: dán základní bod G na křivce nad velkým prvočíselným tělesem a násobek P = d·G, výpočet d z P znamená řešit problém diskrétního logaritmu na eliptické křivce, pro který není známý rychlý algoritmus. Soukromý klíč d je jen 256bitové číslo; veřejný klíč je bod d·G. SM2 není nová aritmetika křivek — je to konkrétní způsob podepisování (jako ECDSA) a šifrování (jako miniaturní ECIES) na jedné konkrétní křivce, s hashováním přes SM3 místo SHA.

sm2p256v1 vs NIST P-256
Aspektsm2p256v1NIST P-256 (secp256r1)
Velikost tělesa256bitové prvočíslo256bitové prvočíslo
Tvar křivkyy² = x³ + ax + by² = x³ − 3x + b (a = −3)
Úroveň bezpečnosti≈ 128 bitů≈ 128 bitů
PodpisSM2 (GB/T 32918.2), na SM3, ID uživatele svázané do ZAECDSA s SHA-256
ŠifrováníSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, není standardizováno NIST)
HashSM3 (GB/T 32905)Rodina SHA-2
Publikováno2010 návrh, GM/T 0003-2012, GB/T 32918-2016; v ISO/IEC 14888-31999 (SEC 2 / NIST)
Podpora TLSSady TLCP (GM/T 386) a TLS 1.3 RFC 8998všude

Obě křivky nabízejí stejnou konkrétní bezpečnost; ani jedna nemá praktický útok. Volba mezi nimi je regulační a otázkou interoperability, ne síly.

ID uživatele a ZA — co SM2 podepisuje a ECDSA ne

Před hashováním SM2 zahrne identitu podepisujícího do otisku: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), kde ENTLa je délka ID v bitech, prostřední čtyři pole přesně určují křivku a poslední dvě jsou veřejný klíč podepisujícího. Zpráva se hashuje jako SM3(ZA ‖ M). Z toho plynou dva důsledky: podpis je svázán s tvrzenou identitou (což je vlastnost) a ověřovatel musí znát ID podepisujícího a použít stejné (klasická past interoperability). Téměř celý ekosystém se ustálil na výchozím 16místném ID 1234567812345678 — ne z textu standardu, ale z příkladů v příloze GM/T 0003; výchozí hodnota OpenSSL se s ním shoduje a shoduje se s ním i tato stránka.

Formáty šifrotextu: C1C3C2, C1C2C3 a DER

Šifrotext SM2 má tři části: C1 = efemérní bod kG (64 bajtů, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 bajtů, integrita), C2 = M ⊕ KDF(x2 ‖ y2) (maskovaná zpráva). Text GM/T 0003 z roku 2012 je zřetězil jako C1 ‖ C2 ‖ C3; standard GB/T 32918.4 z roku 2016 pořadí přeskupil na C1 ‖ C3 ‖ C2 a OpenSSL 1.1.1+ ho následovala. Staré bankovní a vládní systémy stále mluví starým pořadím — proto tato stránka obsahuje obě, plus formu ASN.1 (SEQUENCE of INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2), kterou některé knihovny vydávají. Když dešifrování selže v nástroji druhé strany, prvním kontrolovaným bodem je pořadí bajtů.

Časté chyby
  • Opětovné použití nebo zkracování k. Nonce k při podepisování i šifrování musí být pro každou operaci nové a nepředvídatelné. Jedno opakované k u dvou podpisů předá soukromý klíč každému, kdo vidí oba. Tato stránka čerpá k z CSPRNG prohlížeče; pole pevného k slouží jen k reprodukci známých vektorů.
  • Neshodující se ID uživatelů. Podepíšete s výchozím ID a ověříte s vlastním (nebo naopak) a každý platný podpis selže. ID je součástí podepisovaných dat.
  • Předpoklad, že všude platí C1C3C2. Systémy z éry GM/T 0003, některé čipové karty a starší buildy GmSSL výchozí používají C1C2C3; několik nástrojů navíc připojuje bajt 04 pro nekomprimovaný bod. Tato stránka všechny tyto varianty při dešifrování přijme.
  • Šifrování velkých dat pomocí SM2. Každý šifrotext nese 96 bajtů režie a stojí dvě násobení bodů. SM2 používejte na klíč, SM4/AES na data.
  • Zacházení s veřejným klíčem s předponou 04 jako s 65 surovými bajty klíče. 04 je značka kódování: samotný klíč je x ‖ y, 128 hex číslic. Tato stránka přijímá oba způsoby zápisu.
Časté dotazy

Je to kompatibilní s OpenSSL / GmSSL? Ano. Šestnáctkový výstup C1C3C2 odpovídá openssl pkeyutl -sm2encrypt pro stejný veřejný klíč, zprávu a k; podpisy DER odpovídají výstupu openssl dgst -sm3 -sign bajt po bajtu (ID uživatele nastavte pomocí -pkeyopt sm2_userid:...). Běhy s náhodným k se samozřejmě liší — porovnávejte dešifrováním/ověřením, ne rovností.

Proč tu není výměna klíčů SM2? GB/T 32918.3 definuje interaktivní protokol autentizované výměny klíčů; na jednostránkové kalkulačce nedává smysl. Podpis a šifrování pokrývají neinteraktivní použití.

Je SM2 ve WebCrypto? Ne — žádný prohlížeč ji neimplementuje (Chrome ji případně dodává jen za nestandardními příznaky). Tato stránka běží na implementaci v JavaScriptu napsané od základu, s vektory z příloh standardu zapojenými do autotestu výše.

Lze použít PEM klíč z OpenSSL? Exportujte místo toho surový hex: openssl ec -in key.pem -text vypíše soukromý skalár a veřejný bod. Tato stránka přijímá jen hex klíče, záměrně — mechanika PEM/SEC1 patří na stránku RSA, kde je na místě.

Co je tedy SM9? Jiné zvíře: kryptografie založená na identitě, kde libovolný řetězec (e-mailová adresa) je veřejný klíč a KGC vydává soukromé klíče. Viz přehled SM9.