SM4 Cifrar / Decifrar

Cifre ou decifre com SM4 — GB/T 32907-2016, a cifra de blocos nacional chinesa de 128 bits — nos modos ECB e CBC com preenchimento PKCS#7. A saída é compatível byte a byte com openssl enc -sm4-ecb / -sm4-cbc. Tudo corre no seu navegador; nada é enviado.
O preenchimento PKCS#7 é sempre aplicado, exatamente como o enc do OpenSSL.
Ler a entrada como:
Escrever a saída como:
Verificação cruzada com OpenSSL — cifre aqui e depois execute openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in ficheiro.sm4 -out ficheiro.txt (ou -sm4-ecb sem -iv): os bytes coincidem exatamente, porque esta página aplica o mesmo preenchimento PKCS#7 que o OpenSSL.
Autoteste
Repete o vetor de resposta conhecida do anexo A.1 da GB/T 32907-2016, seis vetores cruzados ECB/CBC determinísticos produzidos por uma implementação de referência Python independente, todos os quatro conjuntos de amostras, e os caminhos negativos (tamanho de chave errado, texto cifrado que não é múltiplo do bloco, preenchimento adulterado têm de ser rejeitados).
O que é o SM4?
Em resumo: o SM4 é a cifra de blocos da norma nacional chinesa — um bloco de 128 bits, chave de 128 bits, cifra de 32 rondas com estrutura Feistel não equilibrada, publicada como GB/T 32907-2016 (antes GM/T 0002-2012), desempenhando no conjunto "SM" chinês o papel que o AES desempenha no mundo NIST.
SM4 vs AES num relance
AspetoSM4AES
Tamanho do bloco128 bits128 bits
Tamanhos de chaveapenas 128 bits128 / 192 / 256 bits
Rondas3210 / 12 / 14
EstruturaFeistel não equilibrada (uma palavra de 32 bits atualizada por ronda)rede de substituição-permutação (estado inteiro a cada ronda)
S-boxuma caixa 8×8, usada 4× por rondauma caixa 8×8, 16× por ronda + MixColumns
Modos padrãoECB, CBC (esta página); GCM/CTR em suítes TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Publicado2012 (GM/T 0002-2012; GB/T 32907-2016); na ISO/IEC 18033-3:20102001 (FIPS 197)

Mesmo trabalho, desenho diferente: ambas são cifras de blocos de 128 bits com uma S-box pública 8×8, mas o SM4 itera 32 rondas Feistel leves enquanto o AES aplica 10–14 rondas mais pesadas sobre todo o estado. Em software o AES costuma ser mais rápido graças às instruções de hardware (AES-NI); o SM4 atingiu uma posição comparável com extensões dedicadas de CPU nas plataformas chinesas. Nenhuma tem um ataque prático; a chave de 128 bits é a chave de 128 bits.

Porque usaria o SM4 em vez do AES?

Conformidade e interoperabilidade, não força: as regras chinesas de criptografia comercial (商用密码) exigem o conjunto SM em setores certificados, e protocolos como o TLCP e o TLS 1.3 com as suítes da RFC 8998 negoceiam SM4. Se a sua contraparte, o regulador ou o hardware só falarem SM4, use SM4. Se for livre de escolher, o AES-256 na página AES deste site continua a ser a predefinição mundial.

Erros comuns
  • ECB com dados estruturados. Blocos de texto limpo idênticos produzem blocos de texto cifrado idênticos — o clássico pinguim. Use CBC (a predefinição desta página) com um IV novo sempre que os dados tiverem mais de um bloco.
  • Uma chave tem exatamente 16 bytes. Ao contrário do AES, o SM4 não tem variantes de 192/256 bits. Uma frase-passe como "password" não é uma chave — derive uma primeiro com uma KDF (veja o Gerador de hash de palavras-passe).
  • Presumir que o preenchimento é opcional. Esta página — tal como o enc do OpenSSL — aplica sempre o PKCS#7, por isso um texto limpo de 16 bytes cifra-se em 32 bytes. O SM4 bruto sem preenchimento não é oferecido de propósito.
  • Reutilizar um IV no CBC. Um par chave+IV repetido no CBC deixa ver a igualdade dos prefixos das mensagens. Gere um IV aleatório por mensagem e envie-o junto com o texto cifrado.
FAQ

Isto é compatível com o OpenSSL? Sim — byte a byte. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) produz exatamente o texto cifrado que esta página imprime para a mesma chave, IV e entrada; o GmSSL é o mesmo.

Porque não há SM4-GCM aqui? O ecossistema de bibliotecas próximo das normas expõe o SM4-GCM sobretudo dentro de pilhas TLS; a convenção de linha de comandos orientada a ficheiros que esta página segue (enc) cobre ECB/CBC. O SM4 autenticado pertence à camada de protocolo.

O SM4 está no WebCrypto? Não — nenhum navegador o implementa. Por isso esta página corre uma implementação escrita de raiz em JavaScript, com os vetores de teste da própria norma ligados ao autoteste acima.

Posso decifrar algo cifrado noutro lado? Sim, se conhecer o modo, a chave, o IV e que foi usado PKCS#7 — cole o texto cifrado em hexadecimal ou Base64, mude para Decifrar e avance.