SM2 Şifrele / Çöz / İmzala

Önerilen sm2p256v1 eğrisi üzerinde (GB/T 32918.5) tam bir SM2 açık anahtar araç kutusu: bir anahtar çifti üretin, SM3 tabanlı ZA şemasıyla (GB/T 32918.2) imzalayın ve doğrulayın ve standart C1C3C2 sırasında, eski C1C2C3 sırasında ya da ASN.1 DER olarak şifreleyin ve şifresini çözün. Her şey tarayıcınızda çalışır; hiçbir şey yüklenmez.
Özel anahtar (onaltılık, 64 basamak — parola gibi davranın)
Genel anahtar (onaltılık, 04 önekli 130 basamak ya da 128 basamak x||y)
Özel anahtar İmzala ve Şifresini çöz tarafından; genel anahtar Doğrula ve Şifrele tarafından kullanılır. Anahtarlar bu sayfadan asla çıkmaz.
Kullanıcı kimliği(ZA'ya karıştırılan "ayırt edici tanımlayıcı"; varsayılan fiili standarttır)
İletiyi şu şekilde oku: Sabit k (gelişmiş):
r (onaltılık)
s (onaltılık)
İmza, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } - OpenSSL/GmSSL'in kullandığı biçim)
Sabit-k kutusu hakkında: her gerçek imza yeni ve öngörülemez bir k kullanmalıdır — k'yi yeniden kullanmak ya da tahmin etmek özel anahtarı sızdırır (Sony ECDSA dersi). Bu sayfa kutu boş olduğunda crypto.getRandomValues'den rastgele bir k üretir. Kutuyu yalnızca öğretim ya da test için bilinen bir vektörü yeniden üretmek amacıyla doldurun.
Kullanıcı kimliği(imzalayanınkiyle eşleşmelidir)
İletiyi şu şekilde oku: İmza biçimi:
r (onaltılık)
s (onaltılık)
✓ İmza GEÇERLİ
✗ İmza GEÇERSİZ
İletiyi şu şekilde oku: Şifreli metin biçimi: Çıktı:
Sabit k (gelişmiş):
Hibrit şifreleme hatırlatması: SM2 şifrelemesi kısa sırlar içindir (oturum anahtarları, PIN'ler), toplu veri için değil — her ileti 96 bayt C1+C3 ek yükü ve bir eliptik eğri nokta çarpımı öder. Rastgele bir SM4/AES anahtarını SM2 ile, ardından veriyi simetrik şifre ile şifreleyin (SM4 sayfası / AES sayfası).
Şifreli metni şu şekilde oku: Derece: Düz metni şu şekilde yaz:
OpenSSL çapraz denetimi — bu sayfanın C1C3C2 onaltılık çıktısı openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem ile eşleşir (-pkeyopt ec_scheme:c1c3c2 ile OpenSSL 3.x, varsayılan) ve GmSSL gmssl sm2randkey / sm2encrypt araçlarıyla; imzalar, -pkeyopt sm2_userid:1234567812345678 ile aynı kullanıcı kimliğiyle openssl dgst -sm3 -sign ile eşleşir. C1'den önceki baştaki 04 baytı (birkaç kütüphanenin ürettiği gibi) şifre çözmede kabul edilir.
Uyumluluk notu: SM2, Çin ticari kriptografi uyumluluğu ve birlikte çalışabilirlik tarafından yönlendirilen bir algoritma seçimidir; güvenliği 256 bitlik ECC'ye (NIST P-256) benzerdir. Üretimde onu gerçek bir anahtar yönetim sistemi ya da donanım anahtarlarıyla eşleştirin — bir tarayıcı sayfası bir hesap makinesidir, kasa değildir.
Öz test
Bağımsız bir Python referans uygulamasının (ve gmssl ile çapraz denetlenmiş) ürettiği anahtar türetme, sabit-k imza ve şifreleme vektörlerini, DER imza ve DER şifreli metin gidiş-dönüşlerini, rastgele-k imzala/doğrula ve şifrele/çöz gidiş-dönüşlerini ve olumsuz yolları (kurcalanmış C3, kesilmiş şifreli metin, eğri dışı genel anahtar, r = 0) yeniden oynatır.
SM2 nedir?
Tek cümleyle: SM2, Çin ulusal standardı açık anahtar kriptosistemidir — sabit sm2p256v1 eğrisi üzerinde bir eliptik eğri imza ve şifreleme şeması; GB/T 32918-2016 (önceki GM/T 0003-2012) olarak yayımlanmıştır ve Çin "SM" paketinde, NIST dünyasında ECDSA/ECDH'nin (P-256) oynadığı rolü oynar.
Tek paragrafta ECC (sezgi)

Tüm eliptik eğri kriptografisi tek bir numaraya dayanır: büyük bir asal alan üzerindeki bir eğrinin taban noktası G ve çarpım P = d·G verildiğinde, P'den d'yi hesaplamak eliptik eğri ayrık logaritma problemini çözmek demektir; bunun için bilinen hızlı bir algoritma yoktur. Özel anahtar d yalnızca 256 bitlik bir sayıdır; genel anahtar d·G noktasıdır. SM2 yeni bir eğri aritmetiği değildir — belirli bir eğri üzerinde imzalamanın (ECDSA gibi) ve şifrelemenin (minyatür bir ECIES gibi) belirli bir yoludur; SHA yerine SM3 ile karmalar.

sm2p256v1 ile NIST P-256
Yönsm2p256v1NIST P-256 (secp256r1)
Alan boyutu256 bitlik asal256 bitlik asal
Eğri biçimiy² = x³ + ax + by² = x³ − 3x + b (a = −3)
Güvenlik düzeyi≈ 128 bit≈ 128 bit
İmzaSM2 (GB/T 32918.2), SM3 tabanlı, kullanıcı kimliği ZA'ya bağlıSHA-256 ile ECDSA
ŞifrelemeSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, NIST standardı değil)
KarmaSM3 (GB/T 32905)SHA-2 ailesi
Yayımlandı2010 tasarımı, GM/T 0003-2012, GB/T 32918-2016; ISO/IEC 14888-3'te1999 (SEC 2 / NIST)
TLS desteğiTLCP (GM/T 386) ve TLS 1.3 RFC 8998 paketleriher yerde

İki eğri de aynı somut güvenliği sunar; hiçbirine pratik bir saldırı yoktur. Aralarındaki seçim güç değil, düzenleyici ve birlikte çalışabilirlik ile ilgilidir.

Kullanıcı kimliği ve ZA — SM2'nin ECDSA'nın imzalamadığı şey

Karmalamadan önce SM2, imzalayanın kimliğini özete katar: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA); burada ENTLa kimliğin bit uzunluğudur, ortadaki dört alan tam eğriyi sabitler ve son ikisi imzalayanın genel anahtarıdır. İleti SM3(ZA ‖ M) olarak karmalanır. İki sonucu vardır: bir imza iddia edilen kimliğe bağlanır (bir özellik) ve doğrulayıcıya imzalayanın kimliği söylenmeli ve aynısı kullanılmalıdır (klasik bir birlikte çalışabilirlik tuzağı). Neredeyse tüm ekosistem 16 basamaklı varsayılan 1234567812345678 üzerinde uzlaştı — standart metninden değil, GM/T 0003'ün ek örneklerinden; OpenSSL'in varsayılanı bununla eşleşir, bu sayfa da öyle.

Şifreli metin biçimleri: C1C3C2, C1C2C3 ve DER

Bir SM2 şifreli metni üç parçadan oluşur: C1 = geçici nokta kG (64 bayt, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 bayt, bütünlük), C2 = M ⊕ KDF(x2 ‖ y2) (maskelenmiş ileti). 2012 GM/T 0003 metni bunları C1 ‖ C2 ‖ C3 olarak birleştirdi; 2016 GB/T 32918.4 standardı C1 ‖ C3 ‖ C2 olarak yeniden sıraladı ve OpenSSL 1.1.1+ bunu izledi. Eski bankacılık ve devlet sistemleri hâlâ eski sırayı konuşur — bu yüzden bu sayfada her ikisi de var, üstelik bazı kütüphanelerin ürettiği ASN.1 biçimi de (INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2 dizisi). Şifre çözme diğer tarafın aracıyla başarısız olduğunda, ilk denetlenecek şey bayt sırasıdır.

Yaygın hatalar
  • k'yi yeniden kullanmak ya da kısmak. Hem imzalamada hem şifrelemede nonce k, her işlem için yeni ve öngörülemez olmalıdır. İki imza arasında tekrarlanan tek bir k, her ikisini görebilen herkese özel anahtarı verir. Bu sayfa k'yi tarayıcının CSPRNG'sinden çeker; sabit-k kutuları yalnızca bilinen vektörleri yeniden üretmek için vardır.
  • Uyuşmayan kullanıcı kimlikleri. Varsayılan kimlikle imzalayıp özel bir kimlikle doğrularsanız (ya da tersi) her geçerli imza başarısız olur. Kimlik imzalanan verinin bir parçasıdır.
  • Her yerde C1C3C2 varsaymak. GM/T 0003 dönemi sistemleri, bazı akıllı kartlar ve eski GmSSL derlemeleri varsayılan olarak C1C2C3 kullanır; birkaç araç da sıkıştırılmamış bir nokta 04 baytı ekler. Bu sayfa şifre çözmede bunların hepsini kabul eder.
  • SM2 ile toplu veri şifrelemek. Her şifreli metin 96 bayt ek yük taşır ve iki nokta çarpımına mal olur. Bir anahtar için SM2, veri için SM4/AES kullanın.
  • 04 önekli bir genel anahtarı 65 çıplak anahtar baytı saymak. 04 bir kodlama işaretçisidir: anahtarın kendisi x ‖ y, 128 onaltılık basamaktır. Bu sayfa her iki yazımı da kabul eder.
SSS

OpenSSL / GmSSL ile uyumlu mu? Evet. C1C3C2 onaltılık çıktısı, aynı genel anahtar, ileti ve k için openssl pkeyutl -sm2encrypt ile eşleşir; DER imzaları openssl dgst -sm3 -sign çıktısıyla bayt bayt eşleşir (kullanıcı kimliğini -pkeyopt sm2_userid:... ile ayarlayın). Rastgele k çalıştırmaları elbette farklıdır — eşitlikle değil, şifre çözerek ya da doğrulayarak karşılaştırın.

Neden burada SM2 anahtar değişimi yok? GB/T 32918.3 etkileşimli, kimliği doğrulanmış bir anahtar değişim protokolü tanımlar; tek sayfalık bir hesap makinesi olarak bir anlamı yoktur. İmzalama ve şifreleme etkileşimsiz kullanımları kapsar.

SM2, WebCrypto'da var mı? Hayır — hiçbir tarayıcı onu uygulamaz (Chrome onu, varsa, yalnızca standart dışı bayraklar arkasında sunar). Bu sayfa sıfırdan yazılmış bir JavaScript uygulaması çalıştırır; standardın kendi ek vektörleri yukarıdaki öz-teste bağlıdır.

OpenSSL'den bir PEM anahtarı kullanabilir miyim? Bunun yerine ham onaltılığı dışa aktarın: openssl ec -in key.pem -text özel skaleri ve genel noktayı yazdırır. Bu sayfa bilerek yalnızca onaltılık anahtarları kabul eder — PEM/SEC1 mekanizması, ait olduğu RSA sayfasında bulunur.

Peki SM9 nedir? Farklı bir hayvan: kimlik tabanlı kriptografi; burada herhangi bir dizgi (bir e-posta adresi) açık anahtardır ve bir KGC özel anahtarları verir. SM9 genel bakış sayfasına bakın.