Lunghezza della chiave SM4
16 byte Esattamente 128 bit: 16 byte, scritti come 32 cifre hex o 16 caratteri ASCII. Non esistono chiavi SM4 a 192 o 256 bit.
Cifra e decifra SM4 online. Se la decifratura fallisce, individua se sono errati modalità, padding, IV o codifica e propone la correzione. Gira nel browser, nessun upload. ECB, CBC, CTR, CFB, OFB; PKCS#7, zero o nessun padding.
ECB cifra blocchi uguali in blocchi cifrati uguali e lascia trapelare schemi ripetuti: usalo solo per dialogare con un sistema che lo richiede.
CTR, CFB e OFB sono modalità a flusso: niente padding, e il testo cifrato è lungo quanto il testo in chiaro.
Diagnosi automatica
—
Richiede OpenSSL 3. Il comando contiene la chiave che hai inserito.
| Chiave | 0123456789abcdeffedcba9876543210 |
|---|---|
| Testo in chiaro | 0123456789abcdeffedcba9876543210 |
| Testo cifrato, 1 cifratura | 681edf34d206965e86b3e94f536e4246 |
| Testo cifrato, 1.000.000 di cifrature | 595298c7c6fd271f0402f804c33d3f66 |
Scritto e revisionato da sviluppatori che realizzano strumenti crittografici. Ogni testo cifrato e ogni conteggio di byte citati in questa pagina sono calcolati dal motore dello strumento e verificati da test automatici.
16 byte Esattamente 128 bit: 16 byte, scritti come 32 cifre hex o 16 caratteri ASCII. Non esistono chiavi SM4 a 192 o 256 bit.
681edf34d206965e86b3e94f536e4246 Con chiave e testo in chiaro 0123456789abcdeffedcba9876543210, una cifratura dà 681edf34d206965e86b3e94f536e4246.
32 round Blocchi da 16 byte (128 bit), cifrati in 32 round.
primi 16 byte No. Si decifrano male solo i primi 16 byte, e il padding nell'ultimo blocco risulta comunque valido.
SM4 è il cifrario a blocchi degli standard cinesi di crittografia commerciale. È stato pubblicato come GM/T 0002-2012, è diventato lo standard nazionale GB/T 32907-2016 (in vigore dal 1° marzo 2017) ed è stato aggiunto allo standard internazionale ISO/IEC 18033-3 con un emendamento nel 2021. È un cifrario simmetrico: la stessa chiave a 128 bit cifra e decifra, e lavora su blocchi da 128 bit, 16 byte alla volta, la stessa dimensione di blocco di AES.
All'interno, ogni blocco viene diviso in quattro parole da 32 bit e attraversa 32 round. Ogni round combina tre delle parole con una chiave di round, passa il risultato attraverso una S-box a 8 bit e una trasformazione lineare, e lo combina con la quarta parola. Le 32 chiavi di round si ricavano dalla chiave con due insiemi fissi di costanti, e la decifratura è lo stesso calcolo con le chiavi di round in ordine inverso.
Il cifrario a blocchi da solo sa gestire soltanto blocchi di esattamente 16 byte, quindi i dati reali passano sempre attraverso una modalità operativa. Questo strumento offre le cinque classiche: ECB e CBC, che lavorano su blocchi interi e richiedono padding, e CTR, CFB e OFB, che trasformano SM4 in un cifrario a flusso senza alcun padding. La maggior parte delle decifrature fallite non ha niente a che fare con SM4 in sé: nasce dal disaccordo tra le due parti su modalità, padding, IV, codifica del testo o sul modo in cui la stringa della chiave diventa byte, e le librerie non concordano nemmeno su cosa significhi "SM4" scritto da solo.
La Web Crypto API integrata nei browser non include SM4, quindi questa pagina porta con sé una propria implementazione e la esegue in locale. È testata sui due vettori di test di GB/T 32907 e confrontata con OpenSSL 3 in ogni modalità.
// SM4-CBC with PKCS#7 padding using Node.js and its bundled OpenSSL 3.
// Key and IV are both exactly 16 bytes (32 hex digits).
const crypto = require('node:crypto');
const key = Buffer.from('0123456789abcdeffedcba9876543210', 'hex');
const iv = Buffer.from('fedcba98765432100123456789abcdef', 'hex');
const cipher = crypto.createCipheriv('sm4-cbc', key, iv);
const ciphertext = Buffer.concat([cipher.update('hello', 'utf8'), cipher.final()]);
console.log(ciphertext.toString('base64')); // fUQPRg2HAXHGz5ZslzCpSQ==
const decipher = crypto.createDecipheriv('sm4-cbc', key, iv);
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
console.log(plaintext.toString('utf8')); // hello Quando la decifratura fallisce, la pagina riprova codifica del testo cifrato, formato della chiave, modalità, IV, padding e codifica del testo, e mostra le impostazioni che producono testo leggibile.
Un clic imposta i valori predefiniti di OpenSSL, Hutool, sm-crypto, gm-crypt o tjfoc/gmsm, librerie che non concordano nemmeno sul fatto che "SM4" da solo significhi ECB o CBC.
ECB, CBC, CTR, CFB e OFB con PKCS#7, zero padding o nessun padding. Il testo in chiaro può essere UTF-8 o GBK, la codifica che il vecchio codice Java produce su Windows in cinese. GCM non è supportato.
Genera con un clic una chiave o un IV casuale da 16 byte, oppure inseriscilo così come lo scrive il tuo codice. Un contatore di byte in tempo reale conferma che hai esattamente 16 byte, prima di andare a caccia di altre cause.
Entrambi i risultati dell'Appendice A sono riportati in una tabella e si caricano con un clic, così puoi verificare qualsiasi implementazione di SM4 rispetto allo standard.
Ogni risultato è accompagnato dal comando openssl enc che lo riproduce, così puoi confermarlo in un terminale o passarlo a un collega.
Il motore SM4 gira in locale. Chiavi e dati non lasciano mai la pagina, e lo strumento continua a funzionare anche offline.
openssl enc)-sm4 = CBC -sm4 è un alias di -sm4-cbc. -K e -iv accettano hex, PKCS#7 resta attivo a meno che tu non passi -nopad, e l'output è in byte grezzi a meno che tu non aggiunga -base64 -A. Un -K della lunghezza sbagliata viene troncato o completato con zeri, con un semplice avviso.
SmUtil.sm4(key)Hutool passa un SM4 senza altre indicazioni, che BouncyCastle esegue come ECB con PKCS#7 (JCE lo chiama PKCS5Padding). I metodi stringa usano UTF-8 e encryptHex stampa hex minuscolo. Per CBC, usa new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")In una modalità che richiede un IV ma non lo riceve, la cifratura genera in silenzio un IV casuale e la decifratura lancia no IV set when one expected: un testo cifrato prodotto senza salvare quell'IV non si può più decifrare da nessuna parte.
sm4.encrypt(data, key) usa come predefinito ECB con PKCS#7, si aspetta la chiave come stringa hex di 32 cifre e restituisce hex minuscolo. Solo mode: 'cbc' cambia la modalità; qualsiasi altro valore resta ECB senza avvisi. sm-crypto-v2 si comporta allo stesso modo, ma usa un IV tutto a zero quando CBC non riceve iv.
Usa CBC come predefinito, accetta chiave e IV come stringhe UTF-8 di 16 caratteri e restituisce Base64. Una chiave i cui byte non formano UTF-8 valido non gli si può proprio passare.
CryptSM4Scegli la modalità chiamando crypt_ecb o crypt_cbc. set_key legge solo i primi 16 byte, quindi una chiave più lunga viene troncata in silenzio, e una chiave sbagliata di solito restituisce byte vuoti invece di un errore.
sm4Sm4Cbc usa un IV a livello di package che resta tutto a zero finché non si chiama SetIV, applica il padding PKCS#7 anche in CFB e OFB e scarta gli errori di rimozione del padding: una chiave sbagliata restituisce nil senza alcun errore.
Chiave 0123456789abcdeffedcba9876543210, testo in chiaro (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
È l'esempio 1 dell'Appendice A di GB/T 32907-2016: chiave e testo in chiaro sono lo stesso valore a 128 bit, e una cifratura dà 681edf34d206965e86b3e94f536e4246. Cifrando di nuovo quel risultato, per un milione di volte in totale, si ottiene 595298c7c6fd271f0402f804c33d3f66. Entrambi i valori compaiono nella tabella dei vettori di test di questa pagina, calcolati dallo stesso motore che stai usando. Il pulsante Vettore di test GB/T 32907 carica il primo.
Chiave 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, testo in chiaro: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
Il testo in chiaro occupa 37 byte in UTF-8. PKCS#7 lo porta a 48 byte, cioè tre blocchi da 16 byte, che in Base64 diventano 64 caratteri. Il pulsante Carica esempio inserisce esattamente questi valori, e il pannello OpenSSL mostra un comando che riproduce la stessa stringa Base64 in un terminale.
Il testo cifrato qui sopra, decifrato con IV 00000000000000000000000000000000
16 byte illeggibili, poi ": order 20260911-0042"
CBC mescola l'IV solo nel primo blocco, mentre il padding PKCS#7 si trova nell'ultimo: il controllo del padding passa comunque e OpenSSL non segnala alcun errore. Questa pagina si accorge che il primo blocco è illeggibile e ti dice che chiave e modalità sono giuste e il problema è l'IV, oppure che i primi 16 byte del testo cifrato sono essi stessi l'IV.
Se conosci la libreria dall'altra parte, selezionala in Usa i valori predefiniti di. Altrimenti scegli Cifra o Decifra e imposta la stessa modalità e lo stesso padding. Le modalità a flusso (CTR, CFB, OFB) non hanno padding, quindi per loro il selettore del padding è disattivato.
Entrambi sono di esattamente 16 byte. Scegli il formato in cui è scritta la stringa (hex, testo o Base64) e controlla che il contatore di byte diventi verde. I pulsanti Casuale generano valori nuovi.
Per cifrare, digita del testo (UTF-8 o GBK) o incolla dei byte in hex. Per decifrare, incolla il testo cifrato e indica se è Base64 o hex. Il risultato si aggiorna mentre scrivi.
Copia l'output, oppure fai clic su Decifra questo testo cifrato per portarlo nella scheda di decifratura con la stessa chiave e lo stesso IV. Il pannello OpenSSL mostra un comando che riproduce il risultato.
La diagnosi elenca le impostazioni con cui i tuoi input si decifrano in testo leggibile. Applicane una con un clic, oppure leggi la nota se falliscono solo i primi 16 byte: indica che il problema è l'IV.
Una stringa hex di 32 caratteri vale 16 byte solo se viene decodificata come hex. Letta come testo vale 32 byte, che SM4 rifiuta, oppure, nel codice che tronca o completa le chiavi in silenzio, diventa una chiave del tutto diversa.
Chiave (testo): 0123456789abcdeffedcba9876543210 -> 32 byte, rifiutata
Chiave (hex): 0123456789abcdeffedcba9876543210 -> 16 byte
Le due parti devono usare la stessa modalità. Un testo cifrato CBC decifrato come ECB dà caratteri illeggibili in ogni blocco e di solito fallisce il controllo del padding alla fine.
cifra: SM4/CBC/PKCS5Padding decifra: SM4/ECB/PKCS5Padding -> bad decrypt
cifra: SM4/CBC/PKCS5Padding decifra: SM4/CBC/PKCS5Padding, stesso IV
In CBC un IV sbagliato non genera errori: i primi 16 byte escono illeggibili e il resto si decifra normalmente. Se è rovinato solo l'inizio del testo in chiaro, confronta gli IV.
IV di decifratura 00000000000000000000000000000000 -> 16 byte illeggibili + ": order 20260911-0042"
IV di decifratura fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 e hex sono due modi di scrivere gli stessi byte. Leggere l'uno al posto dell'altro dà al cifrario l'input sbagliato fin dall'inizio.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y letto come hex -> non valido
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y letto come Base64 -> 48 byte
Lo zero padding non distingue il padding dai dati, quindi un testo in chiaro che termina davvero con 0x00 perde quei byte. Usa PKCS#7 per tutto ciò che non è testo semplice.
zero padding: 61 62 00 -> si decifra in 61 62
PKCS#7: 61 62 00 -> si decifra in 61 62 00
OpenSSL tratta sm4 come CBC. BouncyCastle, e quindi SmUtil.sm4(key) di Hutool, tratta SM4 come ECB con PKCS#7. Due sistemi che "usano semplicemente SM4" possono non concordare sulla modalità.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc getBytes() di Java senza charset usa il valore predefinito della piattaforma, che è GBK su un JDK 17 o precedente con Windows in cinese. Lo stesso testo cinese produce allora un testo cifrato diverso, e l'altra parte lo decifra in mojibake.
"国密SM4 test".getBytes() // GBK su JDK <= 17 con Windows in cinese -> testo cifrato ECB 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> testo cifrato ECB d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 in pay=900.00 e la decifratura riesce comunque. Calcola un MAC su IV e testo cifrato e verificalo prima di decifrare, per esempio con il generatore HMAC.0123456789abcdeffedcba9876543210 letta come hex vale 16 byte, ma la stessa stringa letta come testo vale 32 byte e viene rifiutata. Il selettore di formato e il contatore di byte accanto al campo della chiave servono proprio a intercettare questo errore. PKCS5Padding di Java è lo stesso padding: BouncyCastle fa passare entrambi i nomi per lo stesso codice. Lo zero padding aggiunge 0x00 solo fino al confine del blocco successivo. In decifratura Hutool e BouncyCastle rimuovono tutti gli 0x00 finali, compresi i byte a zero che facevano davvero parte dei dati, mentre gmssl per Python ne rimuove solo uno. Senza padding l'input deve essere un numero intero di blocchi da 16 byte. CTR, CFB e OFB sono modalità a flusso e non usano mai padding. Se il testo decifrato termina con spazi, quadratini o a capo di troppo, il padding non è stato rimosso: dati PKCS#7 decifrati senza padding conservano alla fine n byte di valore n (0x09, 0x0A e 0x0D compaiono come tabulazioni e a capo); passa l'output a Hex e guarda l'ultimo blocco. getBytes() su un sistema Windows in cinese) e come viene stampato il risultato: Base64, hex minuscolo o hex maiuscolo. Con impostazioni identiche e un IV fisso, due implementazioni corrette producono lo stesso output. Se sospetti di uno dei due strumenti, verifica prima entrambi con il vettore di test GB/T 32907. 0123456789abcdeffedcba9876543210, una cifratura deve dare 681edf34d206965e86b3e94f536e4246 e un milione di cifrature concatenate 595298c7c6fd271f0402f804c33d3f66. Questi vettori verificano solo il cifrario a blocchi, quindi come passo successivo cifra un testo in CBC con chiave e IV fissi e confronta il risultato con questa pagina o con il comando OpenSSL che mostra. Il motore di questa pagina è testato su entrambi i vettori e confrontato con OpenSSL 3 in tutte e cinque le modalità. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K accetta la chiave grezza in hex, quindi non c'è di mezzo nessuna password, -nopad disattiva PKCS#7 e -base64 -A legge o scrive Base64 su una sola riga. Fai attenzione a due cose: -sm4 da solo significa CBC, e un valore di -K della lunghezza sbagliata viene troncato o completato con zeri, con un semplice avviso. Il pannello OpenSSL di questa pagina costruisce il comando dalle impostazioni correnti; openssl enc non ha lo zero padding, quindi in quel caso il pannello lo segnala invece di stampare un comando che darebbe un risultato diverso. SmUtil.sm4(key) di Hutool passa solo il nome SM4, e BouncyCastle lo completa con ECB con PKCS#7 (il PKCS5Padding di Java); solo una stringa completa come SM4/CBC/PKCS5Padding significa CBC. In JavaScript anche sm-crypto usa ECB come predefinito, vuole la chiave come stringa hex di 32 cifre e stampa hex minuscolo, mentre gm-crypt usa CBC come predefinito, vuole una chiave testuale di 16 caratteri e stampa Base64. Poi controlla il set di caratteri del testo in chiaro: i metodi stringa di Hutool usano sempre UTF-8, ma un getBytes() senza argomenti su JDK 17 o precedenti con Windows in cinese può significare GBK, e questo cambia il testo cifrato. Scegli la libreria in Usa i valori predefiniti di per impostare tutto con un clic, oppure inserisci i valori a mano; se uno di questi è incerto, incolla comunque il testo cifrato e la diagnosi automatica prova le combinazioni di modalità, padding, IV e codifica. Strumenti di sicurezza
Decifra AES online — GCM/CBC/CTR, passphrase o chiave grezza, rileva "U2FsdGVkX1" (OpenSSL/CryptoJS). 100% nel browser, le chiavi restano sul dispositivo.
Strumenti di sicurezza
Crittografia AES online gratuita — AES-128/192/256, GCM/CBC/CTR, passphrase (PBKDF2) o chiave grezza. Funziona al 100% nel browser; nulla viene caricato.
Strumenti di sicurezza
Genera e verifica hash bcrypt delle password online: costo regolabile, prefissi $2b$/$2a$/$2y$. 100% nel tuo browser; la password non viene mai caricata.
Strumenti di sicurezza
Incolla esadecimale o testo e ottieni tutte le 63 varianti CRC-8, CRC-16 e CRC-32 in una volta. Hai un checksum che non torna? Inseriscilo e lo strumento nomina la variante: MODBUS, CCITT-FALSE, XMODEM, KERMIT. Tutto in locale.
Strumenti di sicurezza
Generatore e verificatore HMAC online e gratuito. Calcola HMAC-SHA256/SHA1/SHA384/SHA512 con chiavi in Testo, Hex o Base64 e output Hex/Base64/Base64URL. 100% nel tuo browser — le chiavi non lasciano mai la pagina.
Strumenti di sicurezza
Decodifica token JWT online con il nostro decodificatore JWT gratis. Ispeziona intestazione, payload, firma, scadenza e attestazioni. 100% browser — token mai fuori dal dispositivo. Nessuna registrazione, nessun tracciamento.