Šifrování a dešifrování SM4

Šifrování nebo dešifrování pomocí SM4 — GB/T 32907-2016, čínská národní norma 128bitové blokové šifry — v režimech ECB a CBC s výplní PKCS#7. Výstup je bajt po bajtu kompatibilní s openssl enc -sm4-ecb / -sm4-cbc. Vše běží ve vašem prohlížeči; nic se nenahrává.
Výplň PKCS#7 se vždy použije, přesně jako v OpenSSL enc.
Číst vstup jako:
Zapisovat výstup jako:
Kontrola v OpenSSL — zašifrujte zde a pak spusťte openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (nebo -sm4-ecb bez -iv): bajty přesně sedí, protože tato stránka používá stejnou výplň PKCS#7 jako OpenSSL.
Autotest
Přehraje známý vektor přílohy A.1 GB/T 32907-2016, šest deterministických křížových vektorů ECB/CBC vytvořených nezávislou referenční implementací v Pythonu, všechny čtyři vzorové sady a negativní cesty (špatná velikost klíče, šifrotext, který není násobkem bloku, pozměněná výplň musí být odmítnuta).
Co je SM4?
Stručně: SM4 je čínská národní norma blokové šifry — blok 128 bitů, klíč 128 bitů, 32kolová šifra s nevyváženou strukturou Feistel, publikovaná jako GB/T 32907-2016 (dříve GM/T 0002-2012). Ve čínské sadě „SM“ plní roli, kterou v světě NIST plní AES.
SM4 vs AES na první pohled
AspektSM4AES
Velikost bloku128 bitů128 bitů
Velikosti klíčůpouze 128 bitů128 / 192 / 256 bitů
Kola3210 / 12 / 14
Strukturanevyvážený Feistel (v každém kole se aktualizuje jedno 32bitové slovo)síť substituce–permutace (celý stav v každém kole)
S-boxjeden S-box 8×8, použitý 4× v každém kolejeden S-box 8×8, 16× v každém kole + MixColumns
Standardní režimyECB, CBC (tato stránka); GCM/CTR v sadách TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Publikováno2012 (GM/T 0002-2012; GB/T 32907-2016); v ISO/IEC 18033-3:20102001 (FIPS 197)

Stejná práce, jiný návrh: obě jsou 128bitové blokové šifry s veřejným S-boxem 8×8, ale SM4 iteruje 32 lehkých kol Feistela, zatímco AES aplikuje 10–14 těžších kol nad celým stavem. V softwaru bývá AES obvykle rychlejší díky hardwarovým instrukcím (AES-NI); SM4 dosáhla srovnatelného postavení s vyhrazenými rozšířeními CPU v čínských platformách. Ani jedna nemá praktický útok; 128bitový klíč je 128bitový klíč.

Proč bych použil SM4 místo AES?

Shoda a interoperabilita, ne síla: čínská pravidla komerční kryptografie (商用密码) vyžadují sadu SM v certifikovaných odvětvích a protokoly jako TLCP a TLS 1.3 se sadami podle RFC 8998 vyjednávají SM4. Pokud vaše protistrana, regulátor nebo hardware umí jen SM4, použijete SM4. Pokud můžete volit, zůstává celosvětovým výchozím řešením AES-256 na stránce AES tohoto webu.

Časté chyby
  • ECB na strukturovaných datech. Shodné otevřené bloky dávají shodné šifrované bloky — klasický příklad tučňáka. Používejte CBC (výchozí režim této stránky) s novým IV, kdykoli jsou data delší než jeden blok.
  • Klíč má přesně 16 bajtů. Na rozdíl od AES nemá SM4 varianty 192/256bitové. Heslo jako „password“ není klíč — nejprve z něj odvoďte klíč pomocí KDF (viz Generátor hashů hesel).
  • Předpoklad, že výplň je volitelná. Tato stránka — stejně jako OpenSSL enc — vždy použije PKCS#7, takže 16bajtový otevřený text se zašifruje na 32 bajtů. Syrový SM4 bez výplně záměrně nenabízíme.
  • Opětovné použití IV v CBC. Opakovaný pár klíč+IV v CBC prozrazuje shodnost začátků zpráv. Pro každou zprávu vygenerujte náhodné IV a odešlete je spolu se šifrotextem.
Časté dotazy

Je to kompatibilní s OpenSSL? Ano — bajt po bajtu. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) vyrobí přesně ten šifrotext, který tato stránka vypíše pro stejný klíč, IV a vstup; GmSSL je stejný.

Proč tu není SM4-GCM? Ekosystém knihoven blízký standardům vystavuje SM4-GCM hlavně uvnitř zásobníků TLS; souborová konvence příkazové řádky, které se tato stránka drží (enc), pokrývá ECB/CBC. Autentizované SM4 patří na protokolovou vrstvu.

Je SM4 ve WebCrypto? Ne — žádný prohlížeč ji neimplementuje. Proto tato stránka běží na implementaci v JavaScriptu napsané od základu, s testovacími vektory standardu zapojenými do autotestu výše.

Mohu dešifrovat něco, co bylo zašifrováno jinde? Ano, pokud znáte režim, klíč, IV a to, že se použila výplň PKCS#7 — vložte šifrotext jako hex nebo Base64, přepněte na Dešifrovat a můžete jít.