SM4-kryptering / -dekryptering

Krypter eller dekrypter med SM4 — GB/T 32907-2016, den kinesiske nasjonale 128-bit blokkchifferen — i ECB- og CBC-moduser med PKCS#7-polstring. Utdataene er byte for byte kompatible med openssl enc -sm4-ecb / -sm4-cbc. Alt kjøres i nettleseren; ingenting lastes opp.
PKCS#7-polstring brukes alltid, akkurat som OpenSSL enc.
Les inndata som:
Skriv utdata som:
OpenSSL-kontroll — krypter her, og kjør deretter openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (eller -sm4-ecb uten -iv): bytene samsvarer nøyaktig, fordi denne siden bruker samme PKCS#7-polstring som OpenSSL.
Selvtest
Gjenspiller GB/T 32907-2016 vedlegg A.1-kjent-svar-vektoren, seks deterministiske ECB/CBC-kryssvektorer produsert av en uavhengig Python-referanseimplementasjon, alle fire eksempelpoolene, og de negative stiene (feil nøkkelstørrelse, chiffertekst som ikke er et blokkmultiplum, og manipulert polstring skal avvises).
Hva er SM4?
Kort fortalt: SM4 er den kinesiske nasjonale standard blokkchifferen — en 128-bit blokk, 128-bit nøkkel, 32-runders chiffer med en ubalansert Feistel-struktur, publisert som GB/T 32907-2016 (tidligere GM/T 0002-2012), og spiller i den kinesiske «SM»-pakken den rollen AES spiller i NIST-verdenen.
SM4 vs AES i oversikt
AspektSM4AES
Blokkstørrelse128 bit128 bit
Nøkkelstørrelserkun 128 bit128 / 192 / 256 bit
Runder3210 / 12 / 14
Strukturubalansert Feistel (ett 32-bit ord oppdateres per runde)substitusjon–permutasjonsnettverk (hele tilstanden hver runde)
S-boksén 8×8-boks, brukt 4× per rundeén 8×8-boks, 16× per runde + MixColumns
StandardmoduserECB, CBC (denne siden); GCM/CTR i TLS-suiter (RFC 8998)ECB, CBC, CTR, GCM, ...
Publisert2012 (GM/T 0002-2012; GB/T 32907-2016); i ISO/IEC 18033-3:20102001 (FIPS 197)

Samme jobb, ulik design: begge er 128-bit blokkchiffere med en offentlig 8×8-S-boks, men SM4 itererer 32 lette Feistel-runder mens AES bruker 10–14 tyngre runder over hele tilstanden. I programvare er AES vanligvis raskere takket være maskinvareinstruksjoner (AES-NI); SM4 oppnådde lignende stilling med dedikerte CPU-utvidelser på kinesiske plattformer. Ingen av dem har et praktisk angrep; 128-bit-nøkkelen er 128-bit-nøkkelen.

Hvorfor skulle man bruke SM4 i stedet for AES?

Dette handler om samsvar og interoperabilitet, ikke styrke: kinesiske regler for kommersiell kryptografi (商用密码) krever SM-pakken i sertifiserte sektorer, og protokoller som TLCP og TLS 1.3 med RFC 8998-suiter forhandler frem SM4. Hvis motparten, regulatoren eller maskinvaren bare snakker SM4, bruker man SM4. Er man fri til å velge, er AES-256 på AES-siden på denne nettsiden fortsatt den globale standarden.

Vanlige feil
  • ECB på strukturerte data. Identiske klarteksblokker gir identiske chifferblokker — den klassiske pingvinen. Bruk CBC (denne sidens standard) med en ny IV når dataene er lengre enn én blokk.
  • En nøkkel er nøyaktig 16 byte. I motsetning til AES har SM4 ingen 192/256-bit-varianter. En passordfrase som «password» er ikke en nøkkel — avled en med en KDF først (se Passordhash-generatoren).
  • Å anta at polstring er valgfri. Denne siden — som OpenSSL enc — bruker alltid PKCS#7, så en 16-byte klartekst krypteres til 32 byte. Rå, upolstret SM4 tilbys med vilje ikke.
  • Gjenbruk av IV i CBC. Et gjentatt nøkkel- og IV-par i CBC lekker likhet mellom meldingsprefikser. Generer en tilfeldig IV per melding og send den sammen med chifferteksten.
Ofte stilte spørsmål

Er dette kompatibelt med OpenSSL? Ja — byte for byte. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) gir nøyaktig chifferteksten denne siden skriver ut for samme nøkkel, IV og inndata; GmSSL er det samme.

Hvorfor ingen SM4-GCM her? Det standardnære bibliotekøkosystemet eksponerer SM4-GCM hovedsakelig inne i TLS-stakker; den filorienterte kommandolinjekonvensjonen denne siden følger (enc) dekker ECB/CBC. Autentisert SM4 hører hjemme på protokollaget.

Finnes SM4 i WebCrypto? Nei — ingen nettleser implementerer det. Derfor kjører denne siden en implementasjon skrevet fra bunnen av i JavaScript, med standardens egne testvektorer koblet inn i selvtesten over.

Kan jeg dekryptere noe som er kryptert andre steder? Ja, hvis modusen, nøkkelen og IV-en er kjent, og PKCS#7 ble brukt — lim inn chifferteksten som heks eller Base64, bytt til Dekrypter og kjør.