Criptare / decriptare SM4

Criptează sau decriptează cu SM4 — GB/T 32907-2016, cifrul bloc național chinez de 128 de biți — în modurile ECB și CBC, cu umplutură PKCS#7. Ieșirea este identică octet cu octet cu openssl enc -sm4-ecb / -sm4-cbc. Totul rulează în browser; nimic nu se încarcă.
Umplutura PKCS#7 se aplică mereu, exact ca enc din OpenSSL.
Se citește intrarea ca:
Se scrie ieșirea ca:
Verificare cu OpenSSL — se criptează aici, apoi se rulează openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (sau -sm4-ecb fără -iv): octeții se potrivesc exact, deoarece pagina aplică aceeași umplutură PKCS#7 pe care o aplică OpenSSL.
Autotest
Reia vectorul de răspuns cunoscut GB/T 32907-2016 din anexa A.1, șase vectori ECB/CBC deterministe încrucișate produși de o implementare independentă de referință în Python, toate cele patru seturi de exemple și căile negative (dimensiune de cheie greșită, text cifrat care nu este multiplu de bloc, umplutură modificată trebuie respinse).
Ce este SM4?
Într-o propoziție: SM4 este cifrul bloc standard național chinez — un bloc de 128 de biți, o cheie de 128 de biți, un cifru cu 32 de runde și structură Feistel dezechilibrată, publicat ca GB/T 32907-2016 (anterior GM/T 0002-2012), și joacă în suita chineză „SM” rolul pe care AES îl joacă în lumea NIST.
SM4 vs AES dintr-o privire
AspectSM4AES
Dimensiunea blocului128 de biți128 de biți
Dimensiuni ale cheiidoar 128 de biți128 / 192 / 256 de biți
Runde3210 / 12 / 14
StructurăFeistel dezechilibrat (un cuvânt de 32 de biți actualizat pe rundă)rețea substituție–permutare (întreaga stare la fiecare rundă)
S-boxun S-box de 8×8, folosit de 4× pe rundăun S-box de 8×8, de 16× pe rundă + MixColumns
Moduri standardECB, CBC (această pagină); GCM/CTR în suitele TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Publicat2012 (GM/T 0002-2012; GB/T 32907-2016); în ISO/IEC 18033-3:20102001 (FIPS 197)

Același scop, proiectare diferită: ambii sunt cifruri bloc de 128 de biți cu un S-box public de 8×8, dar SM4 iterează 32 de runde Feistel ușoare, în timp ce AES aplică 10–14 runde mai grele pe întreaga stare. În software, AES este de obicei mai rapid datorită instrucțiunilor hardware (AES-NI); SM4 a atins o poziție comparabilă cu extensii dedicate ale procesorului pe platformele chinezești. Niciunul nu are un atac practic; cheia de 128 de biți rămâne cheie de 128 de biți.

De ce aș folosi SM4 în loc de AES?

Conformitate și interoperare, nu rezistență: reglementările chineze privind criptografia comercială (商用密码) cer suita SM în sectoarele certificate, iar protocoale precum TLCP și TLS 1.3 cu suitele RFC 8998 negociază SM4. Dacă partenerul, reglementatorul sau hardware-ul vorbește doar SM4, se folosește SM4. Dacă alegerea este liberă, AES-256 de pe pagina AES a acestui site rămâne implicitul global.

Greșeli frecvente
  • ECB pe date structurate. Blocuri identice de text clar produc blocuri identice de text cifrat — celebrul pinguin. Se folosește CBC (implicitul acestei pagini) cu un IV proaspăt ori de câte ori datele depășesc un bloc.
  • O cheie are exact 16 octeți. Spre deosebire de AES, SM4 nu are variante de 192/256 de biți. O frază de acces precum „password” nu este o cheie — se derivă mai întâi una cu un KDF (vezi Generatorul de hash pentru parole).
  • Presupunerea că umplutura este opțională. Această pagină — ca enc din OpenSSL — aplică mereu PKCS#7, deci un text clar de 16 octeți se criptează în 32 de octeți. SM4 brut, fără umplutură, nu este oferit intenționat.
  • Refolosirea unui IV în CBC. O pereche cheie+IV repetată în CBC scurge egalitatea prefixelor mesajelor. Se generează un IV aleatoriu pentru fiecare mesaj și se trimite împreună cu textul cifrat.
Întrebări frecvente

Este compatibil cu OpenSSL? Da — octet cu octet. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) produce exact textul cifrat pe care îl afișează această pagină pentru aceeași cheie, același IV și aceeași intrare; GmSSL este la fel.

De ce nu există SM4-GCM aici? Ecosistemul de biblioteci apropiat de standarde expune SM4-GCM mai ales în stivele TLS; convenția de linie de comandă orientată pe fișiere pe care o respectă această pagină (enc) acoperă ECB/CBC. SM4 autentificat ține de stratul de protocol.

Este SM4 în WebCrypto? Nu — niciun browser nu îl implementează. De aceea această pagină rulează o implementare de la zero în JavaScript, cu vectorii de test ai standardului incluși în autotestul de mai sus.

Se poate decripta ceva criptat în altă parte? Da, dacă se cunosc modul, cheia, IV-ul și faptul că s-a folosit PKCS#7 — se lipește textul cifrat ca hexazecimal sau Base64, se trece la Decriptare și se apasă.