SM4 Cifra / Decifra

Cifri o decifri con SM4 — GB/T 32907-2016, il cifrario a blocchi a 128 bit dello standard nazionale cinese — in modalità ECB e CBC con padding PKCS#7. L'output è compatibile byte per byte con openssl enc -sm4-ecb / -sm4-cbc. Tutto funziona nel suo browser; nulla viene caricato.
Il padding PKCS#7 è sempre applicato, esattamente come enc di OpenSSL.
Leggi l'input come:
Scrivi l'output come:
Verifica incrociata con OpenSSL — cifri qui, poi esegua openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (oppure -sm4-ecb senza -iv): i byte coincidono esattamente, perché questa pagina applica lo stesso padding PKCS#7 di OpenSSL.
Autotest
Riesegue il vettore noto dell'appendice A.1 della GB/T 32907-2016, sei vettori incrociati ECB/CBC deterministici prodotti da un'implementazione di riferimento Python indipendente, tutti e quattro i pool di esempio, e i percorsi negativi (dimensione della chiave errata, ciphertext non multiplo del blocco, padding alterato devono essere respinti).
Che cos'è SM4?
In una frase: SM4 è il cifrario a blocchi dello standard nazionale cinese — un blocco a 128 bit, una chiave a 128 bit, un cifrario a 32 round con struttura di Feistel non bilanciata, pubblicato come GB/T 32907-2016 (in precedenza GM/T 0002-2012), con il ruolo che nella suite «SM» cinese svolge AES nel mondo NIST.
SM4 contro AES in breve
AspettoSM4AES
Dimensione del blocco128 bit128 bit
Dimensioni della chiavesolo 128 bit128 / 192 / 256 bit
Round3210 / 12 / 14
StrutturaFeistel non bilanciata (una parola a 32 bit aggiornata per round)rete di sostituzione–permutazione (l'intero stato a ogni round)
S-boxuna S-box 8×8, usata 4× per rounduna S-box 8×8, 16× per round + MixColumns
Modalità standardECB, CBC (questa pagina); GCM/CTR nelle suite TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Pubblicato2012 (GM/T 0002-2012; GB/T 32907-2016); in ISO/IEC 18033-3:20102001 (FIPS 197)

Stesso lavoro, progetto diverso: entrambi sono cifrari a blocchi a 128 bit con una S-box 8×8 pubblica, ma SM4 itera 32 round di Feistel leggeri mentre AES applica da 10 a 14 round più pesanti sull'intero stato. Nel software AES di solito è più veloce grazie alle istruzioni hardware (AES-NI); SM4 ha raggiunto una posizione comparabile con estensioni CPU dedicate nelle piattaforme cinesi. Nessuno dei due ha un attacco pratico; la chiave a 128 bit resta una chiave a 128 bit.

Perché dovrei usare SM4 invece di AES?

Conformità e interoperabilità, non robustezza: le norme cinesi sulla crittografia commerciale (商用密码) richiedono la suite SM nei settori certificati, e protocolli come TLCP e TLS 1.3 con le suite dell'RFC 8998 negoziano SM4. Se la sua controparte, il regolatore o l'hardware parlano solo SM4, usi SM4. Se è libero di scegliere, AES-256 nella pagina AES di questo sito resta il default globale.

Errori comuni
  • ECB su dati strutturati. Blocchi di testo in chiaro identici producono blocchi di ciphertext identici — il classico pinguino. Usi CBC (il default di questa pagina) con un IV nuovo ogni volta che i dati sono più lunghi di un blocco.
  • Una chiave è esattamente di 16 byte. Diversamente da AES, SM4 non ha varianti a 192/256 bit. Una frase come «password» non è una chiave — ne ricavi una con una KDF prima (veda il Generatore di hash per password).
  • Presumere che il padding sia facoltativo. Questa pagina — come enc di OpenSSL — applica sempre PKCS#7, quindi un testo in chiaro di 16 byte si cifra in 32 byte. SM4 grezzo senza padding non è offerto di proposito.
  • Riusare un IV in CBC. Una coppia chiave+IV ripetuta in CBC rivela l'uguaglianza dei prefissi dei messaggi. Generi un IV casuale per ogni messaggio e lo invii insieme al ciphertext.
FAQ

È compatibile con OpenSSL? Sì — byte per byte. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) produce esattamente il ciphertext che questa pagina stampa per la stessa chiave, IV e input; GmSSL è uguale.

Perché qui non c'è SM4-GCM? L'ecosistema di librerie vicino agli standard espone SM4-GCM soprattutto dentro gli stack TLS; la convenzione a riga di comando orientata ai file che questa pagina segue (enc) copre ECB/CBC. SM4 autenticato appartiene al livello di protocollo.

SM4 è in WebCrypto? No — nessun browser lo implementa. Per questo questa pagina esegue un'implementazione scritta da zero in JavaScript, con i vettori di test dello standard collegati all'autotest qui sopra.

Posso decifrare qualcosa cifrato altrove? Sì, se conosce modalità, chiave, IV e che è stato usato PKCS#7 — incolli il ciphertext in esadecimale o Base64, passi a Decifra e proceda.