Cifrar / descifrar SM4

Cifre o descifre con SM4 — GB/T 32907-2016, el cifrado de bloque de 128 bits del estándar nacional chino — en modos ECB y CBC con relleno PKCS#7. La salida es compatible byte a byte con openssl enc -sm4-ecb / -sm4-cbc. Todo se ejecuta en su navegador; no se sube nada.
El relleno PKCS#7 se aplica siempre, exactamente como enc de OpenSSL.
Leer la entrada como:
Escribir la salida como:
Comprobación cruzada con OpenSSL — cifre aquí y después ejecute openssl enc -d -sm4-cbc -K <clavehex> -iv <ivhex> -in archivo.sm4 -out archivo.txt (o -sm4-ecb sin -iv): los bytes coinciden exactamente, porque esta página aplica el mismo relleno PKCS#7 que OpenSSL.
Autocomprobación
Repite el vector de respuesta conocida del anexo A.1 de GB/T 32907-2016, seis vectores cruzados ECB/CBC deterministas producidos por una implementación de referencia independiente en Python, los cuatro conjuntos de muestras y las rutas negativas (tamaño de clave incorrecto, cifrado que no es múltiplo del bloque, un relleno alterado debe rechazarse).
¿Qué es SM4?
En una frase: SM4 es el cifrado de bloque del estándar nacional chino — un cifrado de bloque de 128 bits, clave de 128 bits y 32 rondas con estructura de Feistel no equilibrada, publicado como GB/T 32907-2016 (antes GM/T 0002-2012), y que desempeña en el conjunto «SM» chino el papel que AES desempeña en el mundo NIST.
SM4 frente a AES de un vistazo
AspectoSM4AES
Tamaño de bloque128 bits128 bits
Tamaños de clavesolo 128 bits128 / 192 / 256 bits
Rondas3210 / 12 / 14
EstructuraFeistel no equilibrada (se actualiza una palabra de 32 bits por ronda)red de sustitución–permutación (todo el estado en cada ronda)
Caja Suna caja de 8×8, usada 4× por rondauna caja de 8×8, 16× por ronda + MixColumns
Modos estándarECB, CBC (esta página); GCM/CTR en conjuntos de TLS (RFC 8998)ECB, CBC, CTR, GCM, ...
Publicado2012 (GM/T 0002-2012; GB/T 32907-2016); en ISO/IEC 18033-3:20102001 (FIPS 197)

Mismo trabajo, diseño distinto: ambos son cifrados de bloque de 128 bits con una caja S pública de 8×8, pero SM4 itera 32 rondas de Feistel ligeras, mientras que AES aplica entre 10 y 14 rondas más pesadas sobre todo el estado. En software, AES suele ser más rápido gracias a las instrucciones de hardware (AES-NI); SM4 alcanzó una posición comparable con extensiones dedicadas de CPU en plataformas chinas. Ninguno tiene un ataque práctico; la clave de 128 bits es la clave de 128 bits.

¿Por qué usar SM4 en lugar de AES?

Cumplimiento e interoperabilidad, no fortaleza: la normativa china de criptografía comercial (商用密码) exige el conjunto SM en sectores certificados, y protocolos como TLCP y TLS 1.3 con los conjuntos de la RFC 8998 negocian SM4. Si su contraparte, su regulador o su hardware solo hablan SM4, use SM4. Si puede elegir libremente, AES-256 en la página de AES de este sitio sigue siendo el valor predeterminado mundial.

Errores habituales
  • ECB con datos estructurados. Los bloques de texto plano idénticos producen bloques de cifrado idénticos — el clásico pingüino. Use CBC (el valor predeterminado de esta página) con un IV nuevo siempre que los datos superen un bloque.
  • Una clave son exactamente 16 bytes. A diferencia de AES, SM4 no tiene variantes de 192 ni de 256 bits. Una frase como «password» no es una clave — derive una primero con una KDF (vea el Generador de hash de contraseñas).
  • Suponer que el relleno es opcional. Esta página — como enc de OpenSSL — aplica siempre PKCS#7, así que un texto plano de 16 bytes se cifra en 32 bytes. El SM4 crudo sin relleno no se ofrece a propósito.
  • Reutilizar un IV en CBC. Un par clave+IV repetido en CBC filtra la igualdad de los prefijos de los mensajes. Genere un IV aleatorio por mensaje y envíelo junto con el cifrado.
Preguntas frecuentes

¿Es compatible con OpenSSL? Sí — byte a byte. openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4 (OpenSSL 1.1.1+) produce exactamente el cifrado que imprime esta página para la misma clave, IV y entrada; GmSSL es igual.

¿Por qué no hay SM4-GCM aquí? El ecosistema de bibliotecas afín a los estándares expone SM4-GCM sobre todo dentro de las pilas TLS; la convención de línea de comandos orientada a archivos que sigue esta página (enc) cubre ECB/CBC. El SM4 autenticado pertenece a la capa de protocolo.

¿Está SM4 en WebCrypto? No — ningún navegador lo implementa. Por eso esta página ejecuta una implementación escrita desde cero en JavaScript, con los propios vectores de prueba del estándar conectados a la autocomprobación de arriba.

¿Puedo descifrar algo cifrado en otro lugar? Sí, si conoce el modo, la clave, el IV y que se usó PKCS#7 — pegue el cifrado en hex o Base64, cambie a Descifrar y adelante.