Tamanho da chave SM4
16 bytes Exatamente 128 bits: 16 bytes, escritos como 32 dígitos hex ou 16 caracteres ASCII. Não existem chaves SM4 de 192 ou 256 bits.
Criptografe e descriptografe SM4 online. Se a descriptografia falhar, aponta se o erro é de modo, padding, IV ou codificação e dá a correção. Roda no navegador, sem upload. ECB, CBC, CTR, CFB, OFB; PKCS#7, zero ou sem padding.
O ECB transforma blocos iguais em texto cifrado igual e vaza padrões — use-o só para conversar com um sistema que o exige.
CTR, CFB e OFB são modos de fluxo: sem padding, e o texto cifrado tem o mesmo tamanho do texto simples.
Diagnóstico automático
—
Requer OpenSSL 3. O comando contém a chave que você informou.
| Chave | 0123456789abcdeffedcba9876543210 |
|---|---|
| Texto simples | 0123456789abcdeffedcba9876543210 |
| Texto cifrado, 1 criptografia | 681edf34d206965e86b3e94f536e4246 |
| Texto cifrado, 1.000.000 de criptografias | 595298c7c6fd271f0402f804c33d3f66 |
Escrito e revisado por desenvolvedores que constroem ferramentas de criptografia. Cada texto cifrado e cada contagem de bytes citados nesta página são calculados pelo motor da ferramenta e verificados por testes.
16 bytes Exatamente 128 bits: 16 bytes, escritos como 32 dígitos hex ou 16 caracteres ASCII. Não existem chaves SM4 de 192 ou 256 bits.
681edf34d206965e86b3e94f536e4246 Com chave e texto simples 0123456789abcdeffedcba9876543210, uma criptografia dá 681edf34d206965e86b3e94f536e4246.
32 rodadas Blocos de 16 bytes (128 bits), criptografados em 32 rodadas.
primeiros 16 bytes Não. Só os primeiros 16 bytes descriptografam errado, e o padding do último bloco continua sendo validado.
SM4 é a cifra de bloco dos padrões chineses de criptografia comercial. Foi publicada como GM/T 0002-2012, tornou-se o padrão nacional GB/T 32907-2016 (em vigor desde 1º de março de 2017) e foi incluída no padrão internacional ISO/IEC 18033-3 por uma emenda em 2021. É uma cifra simétrica: a mesma chave de 128 bits criptografa e descriptografa, e ela trabalha com blocos de 128 bits, 16 bytes por vez — o mesmo tamanho de bloco do AES.
Internamente, cada bloco é dividido em quatro palavras de 32 bits e passa por 32 rodadas. Cada rodada combina três das palavras com uma chave de rodada, passa o resultado por uma S-box de 8 bits e por uma transformação linear, e o incorpora à quarta palavra. As 32 chaves de rodada são derivadas da chave com dois conjuntos fixos de constantes, e a descriptografia é o mesmo cálculo com as chaves de rodada em ordem inversa.
A cifra de bloco sozinha só processa exatamente 16 bytes, então dados reais sempre passam por um modo de operação. Esta ferramenta oferece os cinco clássicos: ECB e CBC, que trabalham com blocos inteiros e precisam de padding, e CTR, CFB e OFB, que transformam o SM4 em uma cifra de fluxo sem padding nenhum. A maioria das descriptografias que falham não tem nada a ver com o SM4 em si — elas vêm de os dois lados discordarem sobre o modo, o padding, o IV, a codificação do texto ou a forma como a string da chave vira bytes, e as bibliotecas não concordam nem sobre o que um "SM4" sozinho significa.
A Web Crypto API embutida nos navegadores não inclui SM4, então esta página traz sua própria implementação e a executa localmente. Ela é testada com os dois vetores de teste da GB/T 32907 e comparada com o OpenSSL 3 em todos os modos.
// 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 a descriptografia falha, a página testa de novo a codificação do texto cifrado, o formato da chave, o modo, o IV, o padding e a codificação do texto, e mostra as configurações que produzem texto legível.
Um clique aplica os padrões do OpenSSL, Hutool, sm-crypto, gm-crypt ou tjfoc/gmsm — bibliotecas que não concordam nem sobre se um "SM4" simples significa ECB ou CBC.
ECB, CBC, CTR, CFB e OFB com PKCS#7, zero padding ou sem padding. O texto simples pode ser UTF-8 ou GBK, a codificação que código Java antigo produz no Windows em chinês. GCM não é suportado.
Gere uma chave ou um IV aleatório de 16 bytes com um clique, ou informe-o do jeito que seu código o escreve. Um contador de bytes ao vivo confirma que você tem exatamente 16 bytes antes de sair atrás de outras causas.
Os dois resultados do Anexo A aparecem em uma tabela e podem ser carregados com um clique, para você conferir qualquer implementação de SM4 com o padrão.
Cada resultado vem com o comando openssl enc que o reproduz, para você confirmar no terminal ou repassar a um colega.
O motor SM4 roda localmente. Chaves e dados nunca saem da página, e a ferramenta continua funcionando offline.
openssl enc)-sm4 = CBC -sm4 é um alias de -sm4-cbc. -K e -iv recebem hex, o PKCS#7 fica ligado a menos que você passe -nopad, e a saída sai em bytes brutos a menos que você adicione -base64 -A. Um -K com tamanho errado é truncado ou completado com zeros com apenas um aviso.
SmUtil.sm4(key)O Hutool passa só SM4, que o BouncyCastle executa como ECB com PKCS#7 (o JCE chama esse padding de PKCS5Padding). Os métodos de string usam UTF-8 e encryptHex imprime hex minúsculo. Para CBC, use new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).
Cipher.getInstance("SM4")Em um modo que precisa de IV mas não recebe nenhum, a criptografia gera silenciosamente um IV aleatório e a descriptografia lança no IV set when one expected — então um texto cifrado criptografado sem guardar esse IV não pode ser descriptografado em lugar nenhum.
sm4.encrypt(data, key) usa por padrão ECB com PKCS#7, espera a chave como string hex de 32 dígitos e devolve hex minúsculo. Só mode: 'cbc' muda o modo; qualquer outro valor continua silenciosamente em ECB. O sm-crypto-v2 se comporta igual, mas usa um IV todo zerado quando o CBC não recebe iv.
Usa CBC por padrão, recebe a chave e o IV como strings UTF-8 de 16 caracteres e devolve Base64. Uma chave cujos bytes não são UTF-8 válido simplesmente não pode ser passada para ele.
CryptSM4Você escolhe o modo chamando crypt_ecb ou crypt_cbc. set_key lê só os primeiros 16 bytes, então uma chave mais longa é cortada silenciosamente, e uma chave errada normalmente devolve bytes vazios em vez de um erro.
sm4Sm4Cbc usa um IV no nível do pacote que fica todo zerado até SetIV ser chamado, aplica padding PKCS#7 mesmo em CFB e OFB e descarta erros na remoção do padding — uma chave errada devolve nil sem erro.
Chave 0123456789abcdeffedcba9876543210, texto simples (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246
Este é o exemplo 1 do Anexo A da GB/T 32907-2016: a chave e o texto simples são o mesmo valor de 128 bits, e uma criptografia dá 681edf34d206965e86b3e94f536e4246. Criptografando essa saída de novo, um milhão de vezes no total, chega-se a 595298c7c6fd271f0402f804c33d3f66. Os dois valores aparecem na tabela de vetores de teste desta página, calculados pelo mesmo motor que você está usando. O botão Vetor de teste GB/T 32907 carrega o primeiro.
Chave 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, texto simples: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y
O texto simples tem 37 bytes em UTF-8. O PKCS#7 o completa até 48 bytes, três blocos de 16 bytes, que o Base64 escreve com 64 caracteres. O botão Carregar exemplo preenche exatamente esses valores, e o painel do OpenSSL mostra um comando que reproduz a mesma string Base64 no terminal.
O texto cifrado acima, descriptografado com o IV 00000000000000000000000000000000
16 bytes de lixo, depois ": order 20260911-0042"
O CBC mistura o IV apenas no primeiro bloco, e o padding PKCS#7 fica no último bloco, então a verificação de padding continua passando e o OpenSSL não gera nenhum erro. Esta página percebe que o primeiro bloco está ilegível e avisa que a chave e o modo estão certos e o problema é o IV — ou que os primeiros 16 bytes do texto cifrado são, eles mesmos, o IV.
Se você conhece a biblioteca do outro lado, selecione-a em “Usar os padrões de”. Caso contrário, selecione “Criptografar” ou “Descriptografar” e ajuste o modo e o padding. Os modos de fluxo (CTR, CFB, OFB) não têm padding, então o seletor de padding fica desativado para eles.
Os dois têm exatamente 16 bytes. Escolha o formato em que a string está escrita — hex, texto ou Base64 — e veja o contador de bytes ficar verde. Os botões “Aleatório” geram valores novos.
Para criptografar, digite texto (UTF-8 ou GBK) ou cole bytes em hex. Para descriptografar, cole o texto cifrado e indique se ele está em Base64 ou hex. O resultado é atualizado enquanto você digita.
Copie a saída, ou clique em “Descriptografar este texto cifrado” para levá-la à aba de descriptografia com a mesma chave e o mesmo IV. O painel do OpenSSL mostra um comando que reproduz o resultado.
O diagnóstico lista as configurações com as quais suas entradas resultam em texto legível. Aplique uma com um clique, ou leia a nota se só os primeiros 16 bytes falharem — isso aponta para o IV.
Uma string hex de 32 caracteres só tem 16 bytes quando é decodificada como hex. Lida como texto, ela tem 32 bytes, o que o SM4 rejeita — ou, em código que corta ou completa chaves silenciosamente, vira outra chave completamente diferente.
Chave (texto): 0123456789abcdeffedcba9876543210 -> 32 bytes, rejeitada
Chave (hex): 0123456789abcdeffedcba9876543210 -> 16 bytes
Os dois lados precisam usar o mesmo modo. Texto cifrado CBC descriptografado como ECB dá lixo em todos os blocos e normalmente falha na verificação de padding no final.
criptografar: SM4/CBC/PKCS5Padding descriptografar: SM4/ECB/PKCS5Padding -> bad decrypt
criptografar: SM4/CBC/PKCS5Padding descriptografar: SM4/CBC/PKCS5Padding, mesmo IV
No CBC, um IV errado não gera erro: os primeiros 16 bytes saem embaralhados e o resto descriptografa normalmente. Se só o começo do seu texto simples está quebrado, compare os IVs.
IV na descriptografia 00000000000000000000000000000000 -> 16 bytes de lixo + ": order 20260911-0042"
IV na descriptografia fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
Base64 e hex são duas formas de escrever os mesmos bytes. Ler um como se fosse o outro entrega à cifra a entrada errada desde o início.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y lido como hex -> inválido
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y lido como Base64 -> 48 bytes
O zero padding não distingue padding de dados, então um texto simples que realmente termina em 0x00 perde esses bytes. Use PKCS#7 para qualquer coisa que não seja texto puro.
zero padding: 61 62 00 -> descriptografa para 61 62
PKCS#7: 61 62 00 -> descriptografa para 61 62 00
O OpenSSL trata sm4 como CBC. O BouncyCastle — e, portanto, o SmUtil.sm4(key) do Hutool — trata SM4 como ECB com PKCS#7. Dois sistemas que "só usam SM4" podem discordar sobre o modo.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc O getBytes() do Java sem charset usa o padrão da plataforma, que é GBK em um JDK 17 ou anterior no Windows em chinês. O mesmo texto em chinês então vira um texto cifrado diferente, e o outro lado o descriptografa como caracteres corrompidos (mojibake).
"国密SM4 test".getBytes() // GBK em JDK <= 17 no Windows em chinês -> texto cifrado ECB 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> texto cifrado ECB d830308b0ae4fa7b9a2b5d59f7f65ca5
pay=100.00 em pay=900.00 e a descriptografia continua dando certo. Calcule um MAC sobre o IV e o texto cifrado e verifique-o antes de descriptografar, por exemplo com o gerador de HMAC.0123456789abcdeffedcba9876543210 lida como hex tem 16 bytes, mas a mesma string lida como texto tem 32 bytes e é rejeitada. O seletor de formato e o contador de bytes ao lado do campo da chave existem justamente para pegar isso. PKCS5Padding do Java é o mesmo padding — o BouncyCastle manda os dois nomes para o mesmo trecho de código. O zero padding acrescenta 0x00 só até o próximo limite de bloco. Na descriptografia, o Hutool e o BouncyCastle removem todos os 0x00 do final, inclusive bytes zero que faziam parte dos dados, enquanto o gmssl do Python remove só um. Sem padding, a entrada precisa ser um número inteiro de blocos de 16 bytes. CTR, CFB e OFB são modos de fluxo e nunca usam padding. Se o texto descriptografado termina com espaços estranhos, quadradinhos ou quebras de linha, o padding não foi removido: dados com PKCS#7 descriptografados sem padding mantêm n bytes de valor n no final (0x09, 0x0A e 0x0D aparecem como tabulações e quebras de linha); mude a saída para Hex e olhe o último bloco. getBytes() em um Windows em chinês — e como o resultado é impresso: Base64, hex minúsculo ou hex maiúsculo. Com configurações idênticas e IV fixo, duas implementações corretas produzem saídas idênticas. Se você desconfia de uma das ferramentas, confira as duas primeiro com o vetor de teste GB/T 32907. 0123456789abcdeffedcba9876543210, uma criptografia deve dar 681edf34d206965e86b3e94f536e4246, e um milhão de criptografias encadeadas, 595298c7c6fd271f0402f804c33d3f66. Esses vetores testam só a cifra de bloco; em seguida, criptografe algum texto em CBC com chave e IV fixos e compare com esta página ou com o comando OpenSSL que ela mostra. O motor por trás desta página é testado com os dois vetores e contra o OpenSSL 3 nos cinco modos. openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K recebe a chave bruta em hex, então nenhuma senha entra em jogo, -nopad desliga o PKCS#7 e -base64 -A lê ou escreve Base64 em uma única linha. Fique atento a duas coisas: -sm4 sozinho significa CBC, e um valor de -K com tamanho errado é truncado ou completado com zeros com apenas um aviso. O painel do OpenSSL nesta página monta o comando a partir das suas configurações atuais; o openssl enc não tem zero padding, então o painel avisa isso em vez de imprimir um comando que não daria o mesmo resultado. SmUtil.sm4(key) do Hutool passa só o nome SM4, e o BouncyCastle completa com ECB com PKCS#7 (o PKCS5Padding do Java); só uma string completa como SM4/CBC/PKCS5Padding significa CBC. No JavaScript, o sm-crypto também usa ECB por padrão, recebe a chave como string hex de 32 dígitos e imprime hex minúsculo, enquanto o gm-crypt usa CBC por padrão, recebe uma chave em texto de 16 caracteres e imprime Base64. Depois, confira o charset do texto simples: os métodos de string do Hutool sempre usam UTF-8, mas um getBytes() sem argumento no JDK 17 ou anterior, em um Windows em chinês, pode significar GBK, o que muda o texto cifrado. Escolha a biblioteca em Usar os padrões de para definir tudo isso com um clique, ou informe os valores você mesmo; se algum deles for incerto, cole o texto cifrado assim mesmo e o diagnóstico automático testa as combinações de modo, padding, IV e codificação. Ferramentas de Segurança
Descriptografe AES online — GCM/CBC/CTR, frase-senha ou chave bruta, detecta automaticamente o formato "U2FsdGVkX1" do OpenSSL e CryptoJS. 100% no navegador, as chaves nunca saem da página.
Ferramentas de Segurança
Criptografia AES online e gratuita — AES-128/192/256, GCM/CBC/CTR, frase-senha (PBKDF2) ou chave bruta. Roda 100% no navegador; nada é enviado a um servidor.
Ferramentas de Segurança
Gere e verifique hashes bcrypt de senha online — custo ajustável, prefixos $2b$/$2a$/$2y$. 100% no seu navegador; sua senha nunca é enviada.
Ferramentas de Segurança
Cole hex ou texto e veja de uma vez as 63 variantes de CRC-8, CRC-16 e CRC-32. Checksum que não bate? Digite o valor e a ferramenta diz qual é a variante — MODBUS, CCITT-FALSE, XMODEM, KERMIT. Tudo roda no seu navegador.
Ferramentas de Segurança
Gerador e verificador de HMAC online e gratuito. Calcule HMAC-SHA256/SHA1/SHA384/SHA512 com chaves em Texto, Hex ou Base64 e saída Hex/Base64/Base64URL. 100% no seu navegador — as chaves nunca saem da página.
Ferramentas de Segurança
Decodifique tokens JWT online com nosso decodificador JWT grátis. Inspecione cabeçalho, carga útil, assinatura, expiração e reivindicações. 100% navegador — seu token nunca sai do dispositivo. Sem cadastro, sem rastreio.