SM2 criptare / decriptare / semnătură

Setul complet de instrumente cu cheie publică SM2 pe curba recomandată sm2p256v1 (GB/T 32918.5): se generează o pereche de chei, se semnează și se verifică cu schema ZA bazată pe SM3 (GB/T 32918.2), iar criptarea și decriptarea se fac în ordinea standard C1C3C2, în ordinea veche C1C2C3 sau în ASN.1 DER. Totul rulează în browser; nimic nu se încarcă.
Cheie privată (hexazecimal, 64 de cifre — se tratează ca o parolă)
Cheie publică (hexazecimal, 130 de cifre cu prefixul 04 sau 128 de cifre x||y)
Cheia privată este folosită de Semnare și Decriptare; cheia publică de Verificare și Criptare. Cheile nu părăsesc niciodată această pagină.
ID de utilizator(„identificatorul distinctiv” amestecat în ZA; implicitul este standardul de facto)
Se citește mesajul ca: k fix (avansat):
r (hexazecimal)
s (hexazecimal)
Semnătură, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } - formatul folosit de OpenSSL/GmSSL)
Despre caseta k fix: fiecare semnătură reală trebuie să folosească un k proaspăt, imprevizibil — refolosirea sau ghicirea lui k scurge cheia privată (lecția ECDSA de la Sony). Pagina generează un k aleatoriu din crypto.getRandomValues ori de câte ori caseta este goală. Se completează caseta doar pentru a reproduce un vector cunoscut, în scop didactic sau de testare.
ID de utilizator(trebuie să se potrivească cu cel al semnatarului)
Se citește mesajul ca: Format semnătură:
r (hexazecimal)
s (hexazecimal)
✓ Semnătura este VALIDĂ
✗ Semnătura este INVALIDĂ
Se citește mesajul ca: Format text cifrat: Ieșire:
k fix (avansat):
Reamintire despre criptarea hibridă: criptarea SM2 este destinată secretelor scurte (chei de sesiune, PIN-uri), nu datelor în volum mare — fiecare mesaj plătește 96 de octeți de cost suplimentar pentru C1+C3 și o înmulțire de punct pe curba eliptică. Se criptează o cheie SM4/AES aleatoare cu SM2, apoi datele cu cifrul simetric (pagina SM4 / pagina AES).
Se citește textul cifrat ca: Ordin: Se scrie textul clar ca:
Verificare cu OpenSSL — hexul C1C3C2 al acestei pagini se potrivește cu openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x cu -pkeyopt ec_scheme:c1c3c2, implicit), iar uneltele GmSSL gmssl sm2randkey / sm2encrypt; semnăturile se potrivesc cu openssl dgst -sm3 -sign cu același ID de utilizator prin -pkeyopt sm2_userid:1234567812345678. Un octet 04 de la început înaintea lui C1 (cum produc mai multe biblioteci) este acceptat la decriptare.
Notă de conformitate: SM2 este o alegere de algoritm dictată de conformitatea criptografiei comerciale chineze și de interoperare, cu o securitate comparabilă cu ECC pe 256 de biți (NIST P-256). În producție, se asociază cu un sistem real de gestionare a cheilor sau cu chei hardware — o pagină de browser este un calculator, nu un seif.
Autotest
Reia vectorii de derivare a cheii, de semnătură cu k fix și de criptare produși de o implementare independentă de referință în Python (cu verificare încrucișată față de gmssl), dus-întorsurile semnăturii DER și ale textului cifrat DER, dus-întorsurile semnare/verificare și criptare/decriptare cu k aleatoriu, precum și căile negative (C3 modificat, text cifrat trunchiat, cheie publică în afara curbei, r = 0).
Ce este SM2?
Într-o propoziție: SM2 este sistemul criptografic cu cheie publică standard național chinez — o schemă de semnătură și criptare pe curbe eliptice, pe curba fixă sm2p256v1, publicată ca GB/T 32918-2016 (anterior GM/T 0003-2012), și joacă în suita chineză „SM” rolul pe care ECDSA/ECDH (P-256) îl joacă în lumea NIST.
ECC într-un paragraf (intuiția)

Toată criptografia pe curbe eliptice se bazează pe un singur truc: dat fiind punctul de bază G de pe o curbă peste un corp prim mare și multiplul P = d·G, aflarea lui d din P înseamnă rezolvarea problemei logaritmului discret pe curbe eliptice, pentru care nu se cunoaște niciun algoritm rapid. Cheia privată d este doar un număr de 256 de biți; cheia publică este punctul d·G. SM2 nu este o nouă aritmetică de curbă — este un mod specific de a semna (ca ECDSA) și de a cripta (ca un ECIES în miniatură) pe o curbă anume, cu hash SM3 în loc de SHA.

sm2p256v1 vs NIST P-256
Aspectsm2p256v1NIST P-256 (secp256r1)
Dimensiunea corpuluinumăr prim de 256 de biținumăr prim de 256 de biți
Forma curbeiy² = x³ + ax + by² = x³ − 3x + b (a = −3)
Nivel de securitate≈ 128 de biți≈ 128 de biți
SemnăturaSM2 (GB/T 32918.2), bazat pe SM3, ID de utilizator legat în ZAECDSA cu SHA-256
CriptareSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, nestandardizat de NIST)
HashSM3 (GB/T 32905)familia SHA-2
Publicatproiectare din 2010, GM/T 0003-2012, GB/T 32918-2016; în ISO/IEC 14888-31999 (SEC 2 / NIST)
Suport TLSSuite TLCP (GM/T 386) și TLS 1.3 RFC 8998peste tot

Ambele curbe oferă aceeași securitate concretă; niciuna nu are un atac practic. Alegerea între ele ține de reglementare și interoperabilitate, nu de rezistență.

ID-ul de utilizator și ZA — ce semnează SM2 și ECDSA nu semnează

Înainte de hash, SM2 include identitatea semnatarului în digest: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), unde ENTLa este lungimea în biți a ID-ului, cele patru câmpuri din mijloc fixează exact curba, iar ultimele două sunt cheia publică a semnatarului. Mesajul se face hash ca SM3(ZA ‖ M). Două consecințe: o semnătură este legată de identitatea declarată (o trăsătură), iar verificatorul trebuie să știe ID-ul semnatarului și să folosească același (o capcană clasică de interoperare). Aproape tot ecosistemul s-a stabilit pe ID-ul implicit de 16 cifre 1234567812345678 — nu din textul standardului, ci din exemplele din anexa GM/T 0003; OpenSSL îl are ca implicit, la fel și această pagină.

Formate de text cifrat: C1C3C2, C1C2C3 și DER

Un text cifrat SM2 are trei părți: C1 = punctul efemer kG (64 de octeți, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 de octeți, integritate), C2 = M ⊕ KDF(x2 ‖ y2) (mesajul mascat). Textul GM/T 0003 din 2012 le concatena C1 ‖ C2 ‖ C3; standardul GB/T 32918.4 din 2016 a reordonat în C1 ‖ C3 ‖ C2, iar OpenSSL 1.1.1+ a urmat. Sistemele bancare și guvernamentale vechi vorbesc încă ordinea veche — de aceea această pagină le are pe ambele, plus forma ASN.1 (SEQUENCE de INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2) pe care o emit unele biblioteci. Când decriptarea eșuează cu unealta celeilalte părți, ordinea octeților este primul lucru de verificat.

Greșeli frecvente
  • Refolosirea sau economisirea lui k. Nonce-ul k, atât la semnare, cât și la criptare, trebuie să fie proaspăt și imprevizibil pentru fiecare operație. Un k repetat în două semnături predă cheia privată oricui vede ambele. Această pagină extrage k din CSPRNG-ul browserului; casetele cu k fix există doar pentru reproducerea vectorilor cunoscuți.
  • ID-uri de utilizator neconcordante. Dacă se semnează cu ID-ul implicit și se verifică cu unul personalizat (sau invers), fiecare semnătură validă eșuează. ID-ul face parte din datele semnate.
  • Presupunerea că peste tot este C1C3C2. Sistemele din era GM/T 0003, unele carduri inteligente și versiunile mai vechi de GmSSL folosesc implicit C1C2C3; mai multe unelte adaugă și un octet 04 de punct necomprimat la început. Această pagină acceptă toate aceste variante la decriptare.
  • Criptarea datelor în volum mare cu SM2. Fiecare text cifrat poartă 96 de octeți de cost suplimentar și costă două înmulțiri de punct. Se folosește SM2 pentru o cheie, SM4/AES pentru date.
  • Tratarea unei chei publice cu prefixul 04 ca 65 de octeți brute de cheie. 04 este un marcaj de codificare: cheia în sine este x ‖ y, 128 de cifre hexazecimale. Această pagină acceptă ambele forme.
Întrebări frecvente

Este compatibil cu OpenSSL / GmSSL? Da. Ieșirea hexazecimală C1C3C2 se potrivește cu openssl pkeyutl -sm2encrypt pentru aceeași cheie publică, același mesaj și același k; semnăturile DER se potrivesc octet cu octet cu ieșirea openssl dgst -sm3 -sign (se setează ID-ul de utilizator cu -pkeyopt sm2_userid:...). Rulările cu k aleatoriu diferă, desigur — se compară prin decriptare / verificare, nu prin egalitate.

De ce nu există aici schimb de chei SM2? GB/T 32918.3 definește un protocol interactiv de schimb de chei autentificat; nu are sens ca un calculator dintr-o pagină. Semnarea și criptarea acoperă utilizările neinteractive.

Este SM2 în WebCrypto? Nu — niciun browser nu îl implementează (Chrome îl livrează doar în spatele unor steaguri nestandard, dacă este cazul). Această pagină rulează o implementare JavaScript de la zero, cu vectorii din anexele standardului incluși în autotestul de mai sus.

Pot folosi o cheie PEM din OpenSSL? Se exportă hexul brut: openssl ec -in key.pem -text afișează scalarul privat și punctul public. Această pagină acceptă doar chei hexazecimale, intenționat — mecanismul PEM/SEC1 aparține paginii RSA, unde îi este locul.

Atunci ce este SM9? Un alt animal: criptografie bazată pe identitate, în care orice șir (o adresă de e-mail) este cheia publică, iar un KGC emite cheile private. Se consultă pagina de prezentare SM9.