SM4-kryptering / -dekryptering

Kryptér eller dekryptér med SM4 — GB/T 32907-2016, den kinesiske nationale standard for 128-bit blokchiffer — i ECB- og CBC-tilstande med PKCS#7-polstring. Outputtet er byte for byte kompatibelt med openssl enc -sm4-ecb / -sm4-cbc. Alt kører i browseren; intet uploades.
PKCS#7-polstring anvendes altid, præcis som OpenSSL enc.
Læs input som:
Skriv output som:
OpenSSL-krydstjek — kryptér her, og kør derefter openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (eller -sm4-ecb uden -iv): bytene matcher præcist, fordi denne side anvender samme PKCS#7-polstring som OpenSSL.
Selvtest
Kører GB/T 32907-2016 appendiks A.1-kendt-svar-vektoren, seks deterministiske ECB/CBC-krydsvektorer produceret af en uafhængig Python-referenceimplementering, alle fire eksempelpuljer og de negative stier (forkert nøglestørrelse, ciphertext der ikke er et multiplum af blokstørrelsen, manipuleret polstring skal afvises).
Hvad er SM4?
I én sætning: SM4 er det kinesiske nationale standard-blokchiffer — et 128-bit blok, 128-bit nøgle, 32-runders chiffer med en ubalanceret Feistel-struktur, offentliggjort som GB/T 32907-2016 (tidligere GM/T 0002-2012), og det spiller den rolle i den kinesiske "SM"-pakke, som AES spiller i NIST-verdenen.
SM4 kontra AES i overblik
EgenskabSM4AES
Blokstørrelse128 bit128 bit
Nøglestørrelserkun 128 bit128 / 192 / 256 bit
Runder3210 / 12 / 14
Strukturubalanceret Feistel (ét 32-bit-ord opdateres pr. runde)substitutions–permutationsnetværk (hele tilstanden hver runde)
S-boksén 8×8-boks, brugt 4× pr. rundeén 8×8-boks, 16× pr. runde + MixColumns
StandardtilstandeECB, CBC (denne side); GCM/CTR i TLS-pakker (RFC 8998)ECB, CBC, CTR, GCM, ...
Offentliggjort2012 (GM/T 0002-2012; GB/T 32907-2016); i ISO/IEC 18033-3:20102001 (FIPS 197)

Samme opgave, forskelligt design: begge er 128-bit blokchiffre med en offentlig 8×8 S-boks, men SM4 itererer 32 lette Feistel-runder, mens AES anvender 10–14 tungere hele-tilstands-runder. I software er AES normalt hurtigere takket være hardwareinstruktioner (AES-NI); SM4 har opnået en sammenlignelig position med dedikerede CPU-udvidelser på kinesiske platforme. Ingen af dem har et praktisk angreb; 128-bit-nøglen er 128-bit-nøglen.

Hvorfor bruge SM4 frem for AES?

Overensstemmelse og interop, ikke styrke: kinesiske regler for kommerciel kryptografi (商用密码) kræver SM-pakken i certificerede sektorer, og protokoller som TLCP og TLS 1.3 med RFC 8998-pakkerne forhandler SM4. Hvis modparten, regulatoren eller hardwaren kun taler SM4, bruges SM4. Hvis man frit kan vælge, er AES-256 på AES-siden stadig den globale standard.

Almindelige fejl
  • ECB på struktureret data. Identiske klartekstblokke giver identiske ciphertext-blokke — den klassiske pingvin. Brug CBC (denne sides standard) med en frisk IV, når data er længere end én blok.
  • En nøgle er præcis 16 byte. I modsætning til AES har SM4 ingen 192/256-bit-varianter. En adgangssætning som "password" er ikke en nøgle — udled først en med en KDF (se Password Hash Generator).
  • At antage, at polstring er valgfri. Denne side — ligesom OpenSSL enc — anvender altid PKCS#7, så en 16-byte klartekst krypteres til 32 byte. Rå, upolstret SM4 tilbydes bevidst ikke.
  • Genbrug af en IV i CBC. Et gentaget nøgle+IV-par i CBC lækker ligheden mellem beskedpræfikser. Generér en tilfældig IV pr. besked, og send den sammen med ciphertexten.
Ofte stillede spørgsmå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+) producerer præcis den ciphertext, denne side udskriver for samme nøgle, IV og input; GmSSL er det samme.

Hvorfor ingen SM4-GCM her? Det standard-nære biblioteksøkosystem eksponerer SM4-GCM primært inde i TLS-stakke; den filorienterede kommandolinjekonvention, denne side følger (enc), dækker ECB/CBC. Autentificeret SM4 hører hjemme på protokollaget.

Er SM4 i WebCrypto? Nej — ingen browser implementerer det. Derfor kører denne side en implementering skrevet fra bunden i JavaScript, med standardens egne testvektorer koblet ind i selvtesten ovenfor.

Kan jeg dekryptere noget, der er krypteret andetsteds? Ja, hvis tilstanden, nøglen, IV'en er kendt, og at PKCS#7 blev brugt — indsæt ciphertexten som hex eller Base64, skift til Dekryptér, og kør.