SM2 titkosítás / visszafejtés / aláírás

A teljes SM2 nyilvános kulcsú eszköztár az ajánlott sm2p256v1 görbén (GB/T 32918,5): kulcspár generálása, aláírás és ellenőrzés az SM3-alapú ZA-sémával (GB/T 32918,2), valamint titkosítás és visszafejtés a szabványos C1C3C2 sorrendben, a régi C1C2C3 sorrendben vagy ASN.1 DER formában. Minden a böngészőben fut; semmi nincs feltöltve.
Privát kulcs (hex, 64 számjegy — jelszóként kezelendő)
Nyilvános kulcs (hex, 130 számjegy 04 előtaggal vagy 128 számjegy x||y)
A privát kulcsot az Aláírás és a Visszafejtés használja; a nyilvánost az Ellenőrzés és a Titkosítás. A kulcsok soha nem hagyják el ezt az oldalt.
Felhasználói azonosító(a ZA-ba kevert „megkülönböztető azonosító”; az alapértelmezett a de facto szabvány)
Üzenet olvasása mint: Rögzített k (haladó):
r (hex)
s (hex)
Aláírás, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } — az OpenSSL/GmSSL formátuma)
A rögzített-k mezőről: minden valódi aláírásnak friss, kiszámíthatatlan k-t kell használnia — a k újrahasználása vagy kitalálása kiszivárogtatja a privát kulcsot (a Sony ECDSA-tanulsága). Ha a mező üres, az oldal véletlen k-t generál a crypto.getRandomValues segítségével. A mezőt csak ismert vektor újratermeléséhez, tanítási vagy tesztelési célra szabad kitölteni.
Felhasználói azonosító(meg kell egyeznie az aláíróéval)
Üzenet olvasása mint: Aláírás-formátum:
r (hex)
s (hex)
✓ Az aláírás ÉRVÉNYES
✗ Az aláírás ÉRVÉNYTELEN
Üzenet olvasása mint: Titkosszöveg-formátum: Kimenet:
Rögzített k (haladó):
Hibrid titkosítás emlékeztető: az SM2-titkosítás rövid titkokra (munkamenet-kulcsok, PIN-kódok) való, nem nagy adatmennyiségre — minden üzenet 96 bájt C1+C3 többletet és egy elliptikus görbés pontszorzást fizet meg. Egy véletlen SM4/AES-kulcs SM2-vel titkosítható, majd az adat a szimmetrikus rejtjelezővel (SM4-oldal / AES-oldal).
Titkosszöveg olvasása mint: Rend: Nyílt szöveg írása mint:
OpenSSL-ellenőrzés — az oldal C1C3C2 hex kimenete megegyezik a openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem eredményével (OpenSSL 3.x a -pkeyopt ec_scheme:c1c3c2 beállítással, ami az alapértelmezett), és a GmSSL gmssl sm2randkey / sm2encrypt eszközeivel; az aláírások ugyanazzal a felhasználói azonosítóval egyeznek a openssl dgst -sm3 -sign eredményével, a -pkeyopt sm2_userid:1234567812345678 beállítással. A C1 előtti vezető 04 bájt (több könyvtár ezt adja) visszafejtéskor elfogadott.
Megfelelőségi megjegyzés: Az SM2 a kínai kereskedelmi kriptográfiai megfelelés és az együttműködés miatt választott algoritmus, 256 bites ECC-vel (NIST P-256) összemérhető biztonsággal. Éles környezetben valódi kulcskezelő rendszerrel vagy hardverkulcsokkal párosítandó — a böngészőoldal számológép, nem széf.
Önteszt
Lejátssza a kulcsszármaztatási, rögzített-k aláírási és titkosítási vektorokat, amelyeket egy független Python referenciaimplementáció állított elő (és a gmssl-lel keresztellenőrizve), a DER-aláírás és DER-titkosszöveg körutakat, véletlen k-s aláírás/ellenőrzés és titkosítás/visszafejtés körutakat, valamint a negatív eseteket (megváltoztatott C3, csonkolt titkosszöveg, görbén kívüli nyilvános kulcs, r = 0).
Mi az SM2?
Egy mondatban: az SM2 a kínai nemzeti szabvány nyilvános kulcsú kriptorendszere — elliptikus görbés aláírási és titkosítási séma a rögzített sm2p256v1 görbén, GB/T 32918-2016 (korábban GM/T 0003-2012) néven publikálva, a kínai „SM” csomagban azt a szerepet tölti be, amelyet az ECDSA/ECDH (P-256) tölt be a NIST világában.
ECC egy bekezdésben (az intuíció)

Minden elliptikus görbés kriptográfia egyetlen trükkön nyugszik: adott a G alappont egy nagy prímtest feletti görbén és a P = d·G többszörös, a d kiszámítása P-ből az elliptikus görbés diszkrét logaritmus problémájának megoldását jelenti, amelyre nincs ismert gyors algoritmus. A privát kulcs d csupán egy 256 bites szám; a nyilvános kulcs a d·G pont. Az SM2 nem új görbearitmetika — ez egy meghatározott módja az aláírásnak (mint az ECDSA) és a titkosításnak (mint egy miniatűr ECIES) egy meghatározott görbén, SHA helyett SM3-mal kivonatolva.

sm2p256v1 vs NIST P-256
Szempontsm2p256v1NIST P-256 (secp256r1)
Mezőméret256 bites prím256 bites prím
Görbealaky² = x³ + ax + by² = x³ − 3x + b (a = −3)
Biztonsági szint≈ 128 bit≈ 128 bit
AláírásSM2 (GB/T 32918,2), SM3-alapú, a felhasználói azonosító a ZA-ba kötveECDSA SHA-256-tal
TitkosításSM2 (GB/T 32918,4), C1C3C2ECIES (ANSI X9,63, nem NIST-szabványosított)
HashSM3 (GB/T 32905)SHA-2 család
Közzétéve2010-es tervezés, GM/T 0003-2012, GB/T 32918-2016; az ISO/IEC 14888-3-ban1999 (SEC 2 / NIST)
TLS-támogatásTLCP (GM/T 386) és TLS 1.3 RFC 8998 csomagokmindenhol

Mindkét görbe ugyanazt a konkrét biztonságot nyújtja; egyikre sincs gyakorlati támadás. A kettő közötti választás szabályozási és együttműködési, nem erősségi kérdés.

A felhasználói azonosító és a ZA — amit az SM2 aláír, de az ECDSA nem

A kivonatolás előtt az SM2 beleépíti az aláíró azonosságát az üzenet kivonatába: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), ahol ENTLa az azonosító bithosszúsága, a középső négy mező a pontos görbét rögzíti, az utolsó kettő pedig az aláíró nyilvános kulcsa. Az üzenet SM3(ZA ‖ M) kivonattal készül. Ebből két következmény: az aláírás a megadott azonossághoz kötődik (ez előny), és az ellenőrzőnek meg kell mondani az aláíró azonosítóját, és ugyanazt kell használnia (klasszikus együttműködési buktató). Az egész ökoszisztéma nagyjából a 1234567812345678 alapértelmezetthez igazodott — nem a szabványszövegből, hanem a GM/T 0003 függelékpéldáiból; az OpenSSL alapértelmezése egyezik vele, és így ez az oldal is.

Titkosszöveg-formátumok: C1C3C2, C1C2C3 és DER

Egy SM2-titkosszöveg három részből áll: C1 = az ideiglenes pont kG (64 bájt, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 bájt, integritás), C2 = M ⊕ KDF(x2 ‖ y2) (az álcázott üzenet). A 2012-es GM/T 0003 szöveg C1 ‖ C2 ‖ C3 sorrendbe fűzte őket; a 2016-os GB/T 32918,4 szabvány C1 ‖ C3 ‖ C2 sorrendre cserélte, és az OpenSSL 1.1.1+ ezt követte. A régi bank- és kormányzati rendszerek még a régi sorrendet beszélik — ezért van itt mindkettő, valamint az ASN.1-forma (SEQUENCE of INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2), amelyet egyes könyvtárak kibocsátanak. Ha a visszafejtés a másik fél eszközével meghiúsul, a bájtsorrend az első ellenőrzendő dolog.

Gyakori hibák
  • A k újrahasználása vagy takarékoskodás vele. Az aláíráskor és a titkosításkor használt k nonce-nak minden műveletre frissnek és kiszámíthatatlannak kell lennie. Egy k ismétlése két aláírás között bárkinek átadja a privát kulcsot, aki mindkettőt látja. Ez az oldal a k-t a böngésző CSPRNG-jéből húzza; a rögzített-k mezők csak ismert vektorok újratermeléséhez léteznek.
  • Eltérő felhasználói azonosítók. Ha az alapértelmezett azonosítóval ír alá, és egyéni azonosítóval ellenőriz (vagy fordítva), minden érvényes aláírás meghiúsul. Az azonosító az aláírt adat része.
  • Feltételezés, hogy mindenhol C1C3C2. A GM/T 0003 korszakbeli rendszerek, egyes okoskártyák és a régebbi GmSSL-buildek alapértelmezetten a C1C2C3-at használják; több eszköz tömörítetlen pont 04 bájtot is elé illeszt. Ez az oldal mindezeket elfogadja visszafejtéskor.
  • Nagy adatmennyiség titkosítása SM2-vel. Minden titkosszöveg 96 bájt többletet hordoz és két pontszorzást igényel. Az SM2 egy kulcsra, az SM4/AES az adatra szolgál.
  • A 04 előtagú nyilvános kulcs 65 nyers kulcsbájtként kezelése. A 04 kódolási jelölő: a kulcs x ‖ y, 128 hex számjegy. Ez az oldal mindkét írásmódot elfogadja.
GYIK

Kompatibilis az OpenSSL / GmSSL-lel? Igen. A C1C3C2 hex kimenet ugyanazzal a nyilvános kulccsal, üzenettel és k-val megegyezik az openssl pkeyutl -sm2encrypt eredményével; a DER-aláírások bájtról bájtra megegyeznek az openssl dgst -sm3 -sign kimenetével (a felhasználói azonosító a -pkeyopt sm2_userid:... beállítással adható meg). Véletlen k-s futások persze különböznek — az összehasonlítás visszafejtéssel / ellenőrzéssel történjen, ne egyenlőséggel.

Miért nincs itt SM2 kulcscsere? A GB/T 32918,3 interaktív, hitelesített kulcscsere-protokollt határoz meg; egyetlen oldalas számológépként nincs értelme. Az aláírás és a titkosítás a nem interaktív felhasználásokat fedi le.

Benne van az SM2 a WebCrypto-ban? Nem — egyetlen böngésző sem valósítja meg (a Chrome legfeljebb nem szabványos jelzők mögött szállítja, ha egyáltalán). Ez az oldal egy nulláról írt JavaScript-implementációt futtat, a szabvány függelékvektorait pedig a fenti önellenőrzésbe kötötte be.

Használhatok-e OpenSSL PEM-kulcsot? Helyette a nyers hex exportálható: az openssl ec -in key.pem -text kiírja a privát skalárt és a nyilvános pontot. Ez az oldal szándékosan csak hex kulcsokat fogad el — a PEM/SEC1 gépezet ott van, ahol a helye van: az RSA-oldalon.

Akkor mi az SM9? Más állat: identitásalapú kriptográfia, ahol bármely sztring (például egy e-mail-cím) a nyilvános kulcs, és egy KGC adja ki a privát kulcsokat. Az SM9 áttekintő oldal ismerteti.