SM4-kryptering / -dekryptering

Kryptera eller dekryptera med SM4 — GB/T 32907-2016, den kinesiska nationella standarden för 128-bitars blockchiffer — i lägena ECB och CBC med PKCS#7-padding. Utdata är byte för byte kompatibel med openssl enc -sm4-ecb / -sm4-cbc. Allt körs i webbläsaren; inget laddas upp.
PKCS#7-padding tillämpas alltid, precis som OpenSSL enc.
Läs indata som:
Skriv utdata som:
OpenSSL-korskontroll — kryptera här och kör sedan openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (eller -sm4-ecb utan -iv): byten matchar exakt, eftersom denna sida tillämpar samma PKCS#7-padding som OpenSSL.
Självtest
Spelar upp GB/T 32907-2016 bilaga A.1-kända svaret, sex deterministiska ECB/CBC-korsvektorer producerade av en oberoende Python-referensimplementation, alla fyra exempelpoolerna och de negativa vägarna (fel nyckelstorlek, chiffertext som inte är en multipel av blockstorleken och manipulerad padding måste avvisas).
Vad är SM4?
Med en mening: SM4 är det kinesiska nationella standardblockchiffret — ett chiffer med 128-bitars block, 128-bitars nyckel och 32 rundor med en obalanserad Feistel-struktur, publicerat som GB/T 32907-2016 (tidigare GM/T 0002-2012), och spelar i den kinesiska "SM"-sviten samma roll som AES spelar i NIST-världen.
SM4 kontra AES i korthet
AspektSM4AES
Blockstorlek128 bitar128 bitar
Nyckelstorlekarendast 128 bitar128 / 192 / 256 bitar
Rundor3210 / 12 / 14
Strukturobalanserad Feistel (ett 32-bitars ord uppdateras per rund)substitutions–permutationsnätverk (hela tillståndet varje rund)
S-boxen 8×8-box, använd 4 gånger per runden 8×8-box, 16 gånger per rund + MixColumns
StandardlägenECB, CBC (denna sida); GCM/CTR i TLS-sviter (RFC 8998)ECB, CBC, CTR, GCM, ...
Publicerad2012 (GM/T 0002-2012; GB/T 32907-2016); i ISO/IEC 18033-3:20102001 (FIPS 197)

Samma uppgift, olika konstruktion: båda är 128-bitars blockchiffer med en publik 8×8-S-box, men SM4 itererar 32 lättviktiga Feistel-rundor medan AES tillämpar 10–14 tyngre rundor över hela tillståndet. I mjukvara är AES oftast snabbare tack vare hårdvaruinstruktioner (AES-NI); SM4 nådde jämförbar ställning med dedikerade CPU-tillägg på kinesiska plattformar. Ingen av dem har en praktisk attack; 128-bitarsnyckeln är 128-bitarsnyckeln.

Varför skulle man använda SM4 i stället för AES?

Efterlevnad och interoperabilitet, inte styrka: kinesiska regler för kommersiell kryptografi (商用密码) kräver SM-sviten i certifierade sektorer, och protokoll som TLCP och TLS 1.3 med RFC 8998-sviter förhandlar fram SM4. Om motparten, regulatorn eller hårdvaran bara talar SM4 används SM4. Är valet fritt är AES-256 på webbplatsens AES-sida fortfarande den globala standarden.

Vanliga misstag
  • ECB på strukturerad data. Identiska klartextblock ger identiska chifferblock — den klassiska pingvinen. Använd CBC (sidans standard) med ett nytt IV när datan är längre än ett block.
  • En nyckel är exakt 16 byte. Till skillnad från AES har SM4 inga 192- eller 256-bitars varianter. Ett lösenord som "password" är inte en nyckel — härled en med en KDF först (se Lösenordshashgeneratorn).
  • Att anta att padding är valfri. Den här sidan — liksom OpenSSL enc — tillämpar alltid PKCS#7, så en 16-byte klartext krypteras till 32 byte. Rå SM4 utan padding erbjuds avsiktligt inte.
  • Återanvändning av IV i CBC. Ett upprepat nyckel+IV-par i CBC läcker likhet mellan meddelandeprefix. Generera ett slumpmässigt IV per meddelande och skicka det tillsammans med chiffertexten.
Vanliga frågor

Är detta kompatibelt med OpenSSL? Ja — byte för byte. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) producerar exakt den chiffertext som denna sida skriver ut för samma nyckel, IV och indata; GmSSL är detsamma.

Varför ingen SM4-GCM här? Det standardnära biblioteksekosystemet exponerar SM4-GCM främst inom TLS-stackar; den filorienterade kommandoradskonventionen som denna sida följer (enc) täcker ECB/CBC. Autentiserad SM4 hör hemma på protokollagret.

Finns SM4 i WebCrypto? Nej — ingen webbläsare implementerar det. Därför kör den här sidan en implementation från grunden i JavaScript, med standardens egna testvektorer kopplade till självtestet ovan.

Kan man dekryptera något som krypterats någon annanstans? Ja, om läget, nyckeln, IV:t är kända och att PKCS#7 användes — klistra in chiffertexten som hex eller Base64, byt till Dekryptera och kör.