Vollständiger SM2-Verschlüsselungsleitfaden: Schlüsselerzeugung, Ver- und Entschlüsselung sowie digitale Signaturen in der Praxis

Kodierung

Was ist SM2?

SM2 ist ein asymmetrischer Verschlüsselungsalgorithmus, der von der Nationalen Kryptographie-Verwaltung Chinas veröffentlicht wurde, basierend auf Elliptic Curve Cryptography (ECC), der RSA als nationalen Standard ersetzt.

Vergleich SM2 RSA 2048
Schlüssellänge 256 Bit 2048 Bit
Sicherheitsstärke 128 Bit 112 Bit
Signaturgeschwindigkeit ~0,5ms ~3ms
Verifikationsgeschwindigkeit ~1ms ~0,1ms
Schlüssellängenverhältnis 1 8
Nationaler Standard GM/T 0003 PKCS#1

SM2 erreicht die Sicherheitsstärke von RSA 2048 Bit mit einem 256-Bit-Schlüssel, kürzerer Schlüssel, höhere Geschwindigkeit.


Drei Verwendungszwecke von SM2

Verwendung Beschreibung Entsprechendes Tool
Ver-/Entschlüsselung Mit öffentlichem Schlüssel verschlüsseln, mit privatem Schlüssel entschlüsseln SM2-Verschlüsselung
Digitale Signatur Mit privatem Schlüssel signieren, mit öffentlichem Schlüssel verifizieren SM2-Signatur
Schlüsselaustausch Beide Parteien verhandeln einen gemeinsamen Schlüssel ECDH-Protokoll

Schritt 1: SM2-Schlüsselpaar generieren

ToolsKu-Tool verwenden

  1. SM2-Verschlüsselungstool öffnen
  2. Auf „Schlüsselpaar generieren" klicken
  3. Öffentlichen und privaten Schlüssel erhalten

Kommandozeile verwenden

# gmssl installieren
brew install gmssl  # macOS
# Oder von https://github.com/guanzhi/GmSSL/releases herunterladen

# SM2-Schlüsselpaar generieren
gmssl sm2 -genkey -out sm2.key

# Schlüssel anzeigen
gmssl sm2 -in sm2.key -text

JavaScript verwenden

import { sm2 } from 'sm-crypto';

// Schlüsselpaar generieren
const keyPair = sm2.generateKeyPairHex();
// keyPair.privateKey → Privater Schlüssel (64 Hexadezimalzeichen)
// keyPair.publicKey  → Öffentlicher Schlüssel (128 Hexadezimalzeichen, 04 + X + Y)

console.log('Privater Schlüssel:', keyPair.privateKey);
console.log('Öffentlicher Schlüssel:', keyPair.publicKey);

Schlüsselformat

SM2-Öffentlicher-Schlüssel-Format:
04 || X (32 Bytes) || Y (32 Bytes)
↓
04 + 64 Hexadezimalzeichen X + 64 Hexadezimalzeichen Y
Gesamtlänge: 130 Hexadezimalzeichen (65 Bytes)

SM2-Privater-Schlüssel-Format:
32-Byte-Zufallszahl
Gesamtlänge: 64 Hexadezimalzeichen (32 Bytes)

Schritt 2: SM2-Ver- und Entschlüsselung

Verschlüsselungsablauf

Klartext → SM2-Verschlüsselung (öffentlicher Schlüssel) → Chiffretext (C1 || C3 || C2)
  • C1: Elliptic-Curve-Punkt (65 Bytes)
  • C3: SM3-Hashwert (32 Bytes)
  • C2: Verschlüsselte Daten

ToolsKu-Tool verwenden

  1. SM2-Verschlüsselungstool öffnen
  2. Öffentlichen Schlüssel einfügen
  3. Zu verschlüsselnden Klartext eingeben
  4. Chiffretext-Format wählen (C1C3C2 oder C1C2C3)
  5. Auf „Verschlüsseln" klicken, um den Chiffretext zu erhalten

JavaScript verwenden

import { sm2 } from 'sm-crypto';

const publicKey = '04...'; // 128 Hexadezimalzeichen
const privateKey = '...';  // 64 Hexadezimalzeichen

// Verschlüsseln (Standard: C1C3C2-Format)
const cipherText = sm2.doEncrypt('Hallo SM2', publicKey, 1);
// Parameter 1 = C1C3C2-Format (nationaler Standard empfohlen)
// Parameter 0 = C1C2C3-Format (Abwärtskompatibilität)

console.log('Chiffretext:', cipherText);

// Entschlüsseln
const plainText = sm2.doDecrypt(cipherText, privateKey, 1);
console.log('Klartext:', plainText); // "Hallo SM2"

Chiffretext-Kodierungsformate

Format Beschreibung Verwendungszweck
C1C3C2 Vom nationalen Standard empfohlenes Format Neue Projekte (Standard)
C1C2C3 Altes Format Kompatibilität mit alten Systemen
ASN.1 DER-Kodierung Java/C#-Interoperabilität

Schritt 3: SM2-Digitale Signatur

Signaturablauf

Nachricht → SM3-Hash → SM2-Signatur (privater Schlüssel) → Signaturwert (r, s)

ToolsKu-Tool verwenden

  1. SM2-Verschlüsselungstool öffnen
  2. Zum Tab „Signatur" wechseln
  3. Privaten Schlüssel und zu signierende Nachricht eingeben
  4. Auf „Signieren" klicken, um den Signaturwert zu erhalten

JavaScript verwenden

import { sm2 } from 'sm-crypto';

const privateKey = '...';
const publicKey = '04...';

// Signieren (automatischer SM3-Hash der Nachricht)
const signature = sm2.doSignature('Zu signierende Nachricht', privateKey);
console.log('Signatur:', signature);

// Signatur verifizieren
const verified = sm2.doVerifySignature(
  'Zu signierende Nachricht',
  signature,
  publicKey
);
console.log('Verifikationsergebnis:', verified); // true

Signatur mit Benutzer-ID

Die SM2-Signatur verwendet standardmäßig die Benutzer-ID 1234567812345678 (Standardwert des nationalen Standards), die angepasst werden kann:

// Benutzer-ID beim Signieren angeben
const sig = sm2.doSignature('Nachricht', privateKey, {
  userId: 'customUserId'
});

// Gleiche Benutzer-ID bei der Verifikation verwenden
const valid = sm2.doVerifySignature('Nachricht', sig, publicKey, {
  userId: 'customUserId'
});

SM2 vs RSA: Wann was wählen?

Szenario Empfehlung Grund
Nationale Regierungssysteme SM2 Kryptographie-Compliance-Anforderung
Nationale Finanzsysteme SM2 UnionPay/PBoC-Anforderung
Internationale Standardsysteme RSA Internationale Kompatibilität
Mobile Verschlüsselung SM2 Kurzer Schlüssel, schnelle Berechnung
Grenzüberschreitender Datenaustausch RSA Internationaler Standard

Nationale Kryptographie-Trio: SM2 + SM3 + SM4

Algorithmus Typ Verwendung Tool
SM2 Asymmetrisch Verschlüsselung/Signatur/Schlüsselaustausch SM2-Tool
SM3 Hash Nachrichtenübersicht (ähnlich SHA-256) SM3-Tool
SM4 Symmetrisch Datenverschlüsselung (ähnlich AES-128) SM4-Tool

Typische Kombination: SM2 + SM4 Hybridverschlüsselung

1. Zufälligen SM4-Schlüssel generieren
2. Große Daten mit SM4 verschlüsseln (schnell)
3. SM4-Schlüssel mit SM2-öffentlichem Schlüssel verschlüsseln (sichere Übertragung)
4. Senden: SM2(SM4-Schlüssel) + SM4(Daten)
import { sm2, sm4 } from 'sm-crypto';

// 1. Zufälligen SM4-Schlüssel generieren
const sm4Key = crypto.getRandomValues(new Uint8Array(16));
const sm4KeyHex = Array.from(sm4Key).map(b => b.toString(16).padStart(2, '0')).join('');

// 2. Daten mit SM4 verschlüsseln
const encryptedData = sm4.encrypt(plainText, sm4KeyHex);

// 3. SM4-Schlüssel mit SM2 verschlüsseln
const encryptedKey = sm2.doEncrypt(sm4KeyHex, sm2PublicKey, 1);

// Senden: encryptedKey + encryptedData

Häufige Fragen

Warum ist der SM2-Chiffretext viel länger als der Klartext?

SM2-Chiffretext = C1 (65 Bytes) + C3 (32 Bytes) + C2 (Klartextlänge), also ist der Chiffretext 97 Bytes länger als der Klartext. Dies ist eine Eigenschaft der asymmetrischen Verschlüsselung. Für große Daten wird SM2+SM4-Hybridverschlüsselung empfohlen.

Was ist der Unterschied zwischen SM2 und ECDSA?

SM2 verwendet die vom nationalen Standard spezifizierte elliptische Kurve (sm2p256v1), ECDSA verwendet NIST-Kurven (P-256). Die Algorithmuslogik ist ähnlich, aber die Kurvenparameter sind unterschiedlich, nicht kompatibel.

Wie verwendet man SM2 in Java?

// Bouncy Castle + nationale Kryptographie-Erweiterung verwenden
Security.addProvider(new BouncyCastleProvider());

// Schlüsselpaar generieren
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC");
kpg.initialize(new ECParameterSpec(...)); // SM2-Kurvenparameter
KeyPair kp = kpg.generateKeyPair();

Zusammenfassung

SM2 ist der zentrale asymmetrische Verschlüsselungsalgorithmus des nationalen Kryptographie-Systems, der mit einem 256-Bit-Schlüssel die Sicherheitsstärke von RSA 2048 Bit erreicht. Beherrschen Sie die drei Hauptoperationen: Schlüsselerzeugung, Ver-/Entschlüsselung und digitale Signatur, kombiniert mit SM3-Hash und SM4-symmetrischer Verschlüsselung, um die nationalen Compliance-Anforderungen zu erfüllen. ToolsKu bietet drei Online-Tools: SM2, SM3, SM4, lokale Verarbeitung im Browser, keine Daten-Uploads.

#国密#SM2#非对称加密#数字签名#加密教程