Skip to content

Cifrar y Descifrar SM4 Online

Cifra y descifra SM4 online. Si el descifrado falla, detecta qué no coincide (modo, relleno, IV o codificación) y te da la solución. Funciona en tu navegador sin subir nada. ECB, CBC, CTR, CFB, OFB; PKCS#7, ceros o sin relleno.

Sin rastreo Se ejecuta en el navegador Gratis
El cifrado se ejecuta íntegramente en tu navegador: la clave y los datos que introduces nunca salen de este dispositivo.
Texto cifrado
Comando OpenSSL equivalente

Requiere OpenSSL 3. El comando contiene la clave que introdujiste.

Vectores de prueba SM4 de GB/T 32907-2016

Calculados durante la compilación por el mismo motor que ejecuta esta página: comprueba con ellos tu propia implementación de SM4.
Clave 0123456789abcdeffedcba9876543210
Texto plano 0123456789abcdeffedcba9876543210
Texto cifrado, 1 cifrado 681edf34d206965e86b3e94f536e4246
Texto cifrado, 1.000.000 de cifrados 595298c7c6fd271f0402f804c33d3f66
El motor SM4 está probado con los dos vectores del apéndice A de GB/T 32907-2016 y contrastado con OpenSSL 3 en ECB, CBC, CTR, CFB y OFB. Los valores predeterminados de las bibliotecas se comprobaron ejecutando OpenSSL, Node.js, sm-crypto, gm-crypt, gmssl y dos bibliotecas de Go, y leyendo el código fuente de Hutool y BouncyCastle. — Equipo de Seguridad de Go-Tools · Sep 11, 2026

Escrito y revisado por desarrolladores que crean herramientas criptográficas. Cada texto cifrado y cada recuento de bytes citados en esta página los calcula el motor de la herramienta y los verifican pruebas automatizadas.

Respuestas rápidas sobre SM4

Longitud de la clave SM4

16 bytes Exactamente 128 bits: 16 bytes, escritos como 32 dígitos hex o 16 caracteres ASCII. No existen claves SM4 de 192 ni de 256 bits.

Vector de prueba GB/T 32907

681edf34d206965e86b3e94f536e4246 Con clave y texto plano 0123456789abcdeffedcba9876543210, un cifrado da 681edf34d206965e86b3e94f536e4246.

Tamaño de bloque y rondas de SM4

32 rondas Bloques de 16 bytes (128 bits), cifrados en 32 rondas.

¿Un IV incorrecto siempre provoca un error en CBC?

primeros 16 bytes No. Solo los primeros 16 bytes se descifran mal, y el relleno del último bloque se sigue verificando sin problemas.

¿Qué es SM4?

SM4 es el cifrado por bloques de los estándares chinos de criptografía comercial. Se publicó como GM/T 0002-2012, pasó a ser el estándar nacional GB/T 32907-2016 (en vigor desde el 1 de marzo de 2017) y se incorporó al estándar internacional ISO/IEC 18033-3 mediante una enmienda en 2021. Es un cifrado simétrico: la misma clave de 128 bits cifra y descifra, y trabaja con bloques de 128 bits, 16 bytes cada vez, el mismo tamaño de bloque que AES.

Por dentro, cada bloque se divide en cuatro palabras de 32 bits que pasan por 32 rondas. En cada ronda, tres de las palabras se combinan con una clave de ronda, el resultado pasa por una S-box de 8 bits y una transformación lineal, y se incorpora a la cuarta palabra. Las 32 claves de ronda se derivan de la clave con dos conjuntos fijos de constantes, y el descifrado es el mismo cálculo con las claves de ronda en orden inverso.

Por sí mismo, el cifrado por bloques solo procesa exactamente 16 bytes, así que los datos reales siempre pasan por un modo de operación. Esta herramienta ofrece los cinco clásicos: ECB y CBC, que trabajan con bloques completos y necesitan relleno, y CTR, CFB y OFB, que convierten SM4 en un cifrado de flujo sin ningún relleno. La mayoría de los descifrados fallidos no tienen nada que ver con SM4 en sí: se deben a que los dos lados no coinciden en el modo, el relleno, el IV, la codificación del texto o la forma en que la cadena de la clave se convierte en bytes, y las bibliotecas ni siquiera se ponen de acuerdo en qué significa un "SM4" a secas.

La API Web Crypto integrada en los navegadores no incluye SM4, así que esta página trae su propia implementación y la ejecuta localmente. Está probada con los dos vectores de prueba de GB/T 32907 y contrastada con OpenSSL 3 en todos los 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

Funciones de la herramienta SM4

Te dice por qué falló el descifrado

Cuando el descifrado falla, la página vuelve a probar la codificación del texto cifrado, el formato de la clave, el modo, el IV, el relleno y la codificación del texto, y muestra los ajustes que producen texto legible.

Valores predefinidos para los sospechosos habituales

Con un clic se aplican los valores predeterminados de OpenSSL, Hutool, sm-crypto, gm-crypt o tjfoc/gmsm, bibliotecas que ni siquiera coinciden en si un "SM4" a secas significa ECB o CBC.

Cinco modos, tres rellenos, UTF-8 o GBK

ECB, CBC, CTR, CFB y OFB con PKCS#7, relleno con ceros o sin relleno. El texto plano puede estar en UTF-8 o en GBK, la codificación que produce el código Java antiguo en Windows en chino. GCM no está disponible.

Clave e IV de SM4: aleatorios, o en hex, texto o Base64

Genera con un clic una clave o un IV aleatorio de 16 bytes, o introdúcelo tal como lo escribe tu código. Un contador de bytes en vivo confirma que tienes exactamente 16 bytes antes de que te pongas a buscar otras causas.

Vectores de prueba GB/T 32907 en la página

Los dos resultados del apéndice A aparecen en una tabla y se cargan con un clic, para que puedas comprobar cualquier implementación de SM4 con el estándar.

Comando OpenSSL equivalente

Cada resultado viene con el comando openssl enc que lo reproduce, para que puedas confirmarlo en una terminal o pasárselo a un compañero.

Funciona íntegramente en tu navegador

El motor SM4 se ejecuta localmente. Las claves y los datos nunca salen de la página, y la herramienta sigue funcionando sin conexión.

Valores predeterminados de SM4 en bibliotecas comunes

OpenSSL 3 (openssl enc)

-sm4 = CBC

-sm4 es un alias de -sm4-cbc. -K y -iv reciben hex, PKCS#7 queda activado salvo que pases -nopad, y la salida son bytes en bruto salvo que añadas -base64 -A. Un -K con la longitud incorrecta se trunca o se rellena con ceros con apenas una advertencia.

Java: Hutool SmUtil.sm4(key)

ECB · PKCS#7

Hutool pasa un SM4 a secas, que BouncyCastle ejecuta como ECB con PKCS#7 (JCE lo llama PKCS5Padding). Los métodos de cadena usan UTF-8 y encryptHex imprime hex en minúsculas. Para CBC, usa new SM4(Mode.CBC, Padding.PKCS5Padding, key, iv).

Java: BouncyCastle Cipher.getInstance("SM4")

ECB · PKCS#7

En un modo que necesita IV pero no lo recibe, el cifrado genera en silencio un IV aleatorio y el descifrado lanza no IV set when one expected, así que un texto cifrado generado sin guardar ese IV no se puede descifrar en ningún sitio.

JavaScript: sm-crypto

ECB · clave hex

sm4.encrypt(data, key) usa por defecto ECB con PKCS#7, espera la clave como una cadena hex de 32 dígitos y devuelve hex en minúsculas. Solo mode: 'cbc' cambia el modo; cualquier otro valor se queda en ECB sin avisar. sm-crypto-v2 se comporta igual, pero usa un IV de ceros cuando CBC no recibe iv.

JavaScript: gm-crypt

CBC · clave de texto · Base64

Usa CBC por defecto, recibe la clave y el IV como cadenas UTF-8 de 16 caracteres y devuelve Base64. Una clave cuyos bytes no son UTF-8 válido no se le puede pasar de ninguna manera.

Python: gmssl CryptSM4

PKCS#7 · clave recortada a 16 bytes

El modo se elige llamando a crypt_ecb o a crypt_cbc. set_key lee solo los primeros 16 bytes, así que una clave más larga se recorta sin avisar, y una clave incorrecta suele devolver bytes vacíos en lugar de un error.

Go: tjfoc/gmsm sm4

IV de ceros por defecto

Sm4Cbc usa un IV a nivel de paquete que sigue siendo todo ceros hasta que se llama a SetIV, rellena con PKCS#7 incluso en CFB y OFB, y descarta los errores al quitar el relleno: una clave incorrecta devuelve nil sin ningún error.

Ejemplos de cifrado y descifrado SM4

Vector de prueba GB/T 32907 (ECB, sin relleno)

Clave 0123456789abcdeffedcba9876543210, texto plano (hex) 0123456789abcdeffedcba9876543210
681edf34d206965e86b3e94f536e4246

Es el ejemplo 1 del apéndice A de GB/T 32907-2016: la clave y el texto plano son el mismo valor de 128 bits, y un solo cifrado da 681edf34d206965e86b3e94f536e4246. Si vuelves a cifrar cada resultado hasta sumar un millón de cifrados, obtienes 595298c7c6fd271f0402f804c33d3f66. Los dos valores aparecen en la tabla de vectores de prueba de esta página, calculados por el mismo motor que estás usando. El botón Vector de prueba GB/T 32907 carga el primero.

CBC con PKCS#7: texto de entrada, Base64 de salida

Clave 0123456789abcdeffedcba9876543210, IV fedcba98765432100123456789abcdef, texto plano: SM4 interop test: order 20260911-0042
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y

El texto plano ocupa 37 bytes en UTF-8. PKCS#7 lo rellena hasta 48 bytes, tres bloques de 16 bytes, que en Base64 se escriben con 64 caracteres. El botón Cargar ejemplo rellena exactamente estos valores, y el panel de OpenSSL muestra un comando que reproduce la misma cadena Base64 en una terminal.

IV incorrecto en CBC: solo se rompen los primeros 16 bytes

El texto cifrado anterior, descifrado con el IV 00000000000000000000000000000000
16 bytes ilegibles y después ": order 20260911-0042"

CBC solo mezcla el IV en el primer bloque, y el relleno PKCS#7 está en el último, así que la comprobación del relleno sigue pasando y OpenSSL no da ningún error. Esta página detecta que el primer bloque es ilegible y te dice que la clave y el modo son correctos y que el problema es el IV, o bien que los primeros 16 bytes del texto cifrado son en realidad el IV.

Cómo usar la herramienta de cifrado y descifrado SM4

  1. 1

    Elige los valores de una biblioteca, o el modo y el relleno

    Si conoces la biblioteca del otro lado, elígela en Usar los valores predeterminados de. Si no, selecciona Cifrar o Descifrar y ajusta el modo y el relleno. Los modos de flujo (CTR, CFB, OFB) no llevan relleno, así que con ellos el selector de relleno se desactiva.

  2. 2

    Introduce la clave y el IV

    Ambos tienen exactamente 16 bytes. Elige el formato en que está escrita la cadena —hex, texto o Base64— y comprueba que el contador de bytes se pone en verde. Los botones Aleatorio generan valores nuevos.

  3. 3

    Pega la entrada

    Para cifrar, escribe texto (UTF-8 o GBK) o pega bytes en hex. Para descifrar, pega el texto cifrado e indica si está en Base64 o en hex. El resultado se actualiza mientras escribes.

  4. 4

    Copia el resultado o comprueba el ciclo completo

    Copia la salida, o haz clic en Descifrar este texto cifrado para llevarla a la pestaña de descifrado con la misma clave y el mismo IV. El panel de OpenSSL muestra un comando que reproduce el resultado.

  5. 5

    Si el descifrado falla, lee el diagnóstico

    El diagnóstico lista los ajustes con los que tus entradas se descifran a texto legible. Aplica uno con un clic, o lee la nota si solo fallan los primeros 16 bytes: eso apunta al IV.

Por qué falla el descifrado SM4

Leer una clave hex como texto

Una cadena hex de 32 caracteres solo son 16 bytes si se decodifica como hex. Leída como texto son 32 bytes, que SM4 rechaza; o, en código que recorta o rellena las claves en silencio, una clave completamente distinta.

✗ Incorrecto
Clave (texto): 0123456789abcdeffedcba9876543210  -> 32 bytes, rechazada
✓ Correcto
Clave (hex):   0123456789abcdeffedcba9876543210  -> 16 bytes

Descifrar texto cifrado CBC como ECB

Los dos lados deben usar el mismo modo. Un texto cifrado CBC descifrado como ECB da basura en todos los bloques y normalmente no supera la comprobación del relleno al final.

✗ Incorrecto
cifrar:    SM4/CBC/PKCS5Padding
descifrar: SM4/ECB/PKCS5Padding  -> bad decrypt
✓ Correcto
cifrar:    SM4/CBC/PKCS5Padding
descifrar: SM4/CBC/PKCS5Padding, mismo IV

Usar un IV distinto

En CBC, un IV incorrecto no provoca ningún error: los primeros 16 bytes salen corruptos y el resto se descifra con normalidad. Si solo está roto el principio del texto plano, compara los IV.

✗ Incorrecto
IV de descifrado 00000000000000000000000000000000
-> 16 bytes ilegibles + ": order 20260911-0042"
✓ Correcto
IV de descifrado fedcba98765432100123456789abcdef
-> "SM4 interop test: order 20260911-0042"

Tratar texto cifrado Base64 como hex

Base64 y hex son dos formas de escribir los mismos bytes. Leer uno como si fuera el otro le da al cifrado una entrada equivocada desde el principio.

✗ Incorrecto
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y  leído como hex -> no válido
✓ Correcto
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y  leído como Base64 -> 48 bytes

El relleno con ceros borra ceros finales reales

El relleno con ceros no distingue el relleno de los datos, así que un texto plano que de verdad termina en 0x00 pierde esos bytes. Usa PKCS#7 para cualquier dato que no sea texto.

✗ Incorrecto
relleno con ceros: 61 62 00  -> se descifra como 61 62
✓ Correcto
PKCS#7:            61 62 00  -> se descifra como 61 62 00

Suponer que "SM4" significa el mismo modo en todas partes

OpenSSL trata sm4 como CBC. BouncyCastle —y, por tanto, SmUtil.sm4(key) de Hutool— trata SM4 como ECB con PKCS#7. Dos sistemas que "simplemente usan SM4" pueden no coincidir en el modo.

✗ Incorrecto
Java:    Cipher.getInstance("SM4")  -> ECB + PKCS#7
OpenSSL: openssl enc -sm4           -> CBC
✓ Correcto
Java:    Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc

Cifrar bytes GBK en un lado y UTF-8 en el otro

getBytes() de Java sin juego de caracteres usa el predeterminado de la plataforma, que es GBK en un JDK 17 o anterior sobre Windows en chino. El mismo texto en chino se cifra entonces en un texto cifrado distinto, y el otro lado lo descifra como mojibake (caracteres corruptos).

✗ Incorrecto
"国密SM4 test".getBytes()  // GBK en un JDK <= 17 sobre Windows en chino
-> texto cifrado ECB 3188d06cf28db70092f8753cbd5ee518
✓ Correcto
"国密SM4 test".getBytes(StandardCharsets.UTF_8)
-> texto cifrado ECB d830308b0ae4fa7b9a2b5d59f7f65ca5

Cuándo necesitas cifrado SM4 online

Haz coincidir la salida SM4 entre backend y frontend
Tu servicio Java y tu cliente web producen textos cifrados distintos para el mismo texto. Reproduce aquí cada lado con los valores predeterminados de su biblioteca y comprueba qué parámetro difiere.
Depura un descifrado fallido de un sistema de terceros
Un socio te envía texto cifrado SM4 que no hay manera de descifrar. Pégalo con la clave y el IV acordados y deja que el diagnóstico encuentre el modo, el relleno o la codificación que usaron en realidad.
Verifica una implementación de SM4
Prueba tu código con los vectores GB/T 32907 de esta página y compara después un ciclo completo en CBC, antes de que la implementación se acerque siquiera a datos de producción.
Prepara datos de prueba para una migración a SM4
Cuando un sistema pasa de AES a SM4, genera aquí tríos conocidos de clave, IV y texto cifrado para usarlos como fixtures en las nuevas pruebas.
Observa cómo se comportan los modos de cifrado por bloques
Cifra dos bloques idénticos en ECB y en CBC, o descifra con un IV incorrecto, y observa qué cambia en el texto cifrado y en la salida.

Cómo funcionan SM4 y sus modos

Tamaño de bloque, tamaño de clave y rondas
SM4 cifra bloques de 128 bits con una clave de 128 bits en 32 rondas. Cada ronda aplica una S-box de 8 bits a una palabra de 32 bits y después una transformación lineal que hace XOR de la palabra con cuatro rotaciones de sí misma. El descifrado ejecuta las mismas 32 rondas con las claves de ronda en orden inverso.
ECB: cada bloque por su cuenta
ECB cifra cada bloque de 16 bytes de forma independiente. No necesita IV, pero los bloques de texto plano iguales se convierten en bloques de texto cifrado iguales, así que los patrones de los datos siguen siendo visibles. Necesita relleno salvo que la entrada sea múltiplo de 16 bytes.
CBC: bloques encadenados y un IV
CBC combina con XOR cada bloque de texto plano con el bloque de texto cifrado anterior antes de cifrarlo, y usa el IV para el primer bloque. Como el IV solo interviene en el primer bloque, un IV incorrecto corrompe exactamente los primeros 16 bytes del texto plano y deja intacto el relleno del último bloque, así que muchas veces no aparece ningún error.
CTR, CFB y OFB: SM4 como cifrado de flujo
Estos modos cifran un contador o un valor de realimentación y combinan el resultado con los datos mediante XOR, así que el texto cifrado mide lo mismo que el texto plano y no hay relleno. En CTR, el IV completo de 16 bytes se incrementa como un único contador big-endian de 128 bits, igual que en OpenSSL. Un IV incorrecto corrompe el mensaje entero en CTR y OFB, pero solo el primer bloque en CFB.
Reglas de relleno
PKCS#7 añade de 1 a 16 bytes de valor n, así que un mensaje que ya ocupa un número entero de bloques recibe igualmente un bloque completo de relleno. El relleno con ceros añade bytes 0x00 solo cuando hace falta y, al descifrar, elimina todos los ceros finales. Sin relleno, los datos quedan tal cual y se rechaza la entrada que no completa bloques enteros.

Buenas prácticas de cifrado SM4

No elijas ECB en diseños nuevos
ECB revela qué bloques son iguales. Usa CBC o CTR, salvo que tengas que coincidir con un sistema existente que ya use ECB.
Usa un IV aleatorio nuevo para cada mensaje
El IV no es secreto, pero no debe repetirse con la misma clave. Genéralo al azar para cada mensaje y guárdalo o envíalo junto al texto cifrado.
Autentica el texto cifrado
GB/T 17964-2021, el estándar chino sobre modos de operación de cifrados por bloques, establece que los modos que describe protegen la confidencialidad, no la integridad. En CBC, cambiar un byte del IV convierte pay=100.00 en pay=900.00 y el descifrado sigue funcionando. Calcula un MAC sobre el IV y el texto cifrado y verifícalo antes de descifrar, por ejemplo con el generador HMAC.
Escribe cada parámetro en la especificación de la interfaz
"Cifrado con SM4" no es una especificación. Deja por escrito el modo, el relleno, cómo se codifican la clave y el IV, el juego de caracteres del texto plano y si el texto cifrado va en hex o en Base64.
Mantén las claves reales fuera de las páginas web y del código fuente
Usa esta página con claves de prueba. Las claves de producción deben estar en un sistema de gestión de claves o en un módulo de seguridad de hardware, y cargarse en tiempo de ejecución en lugar de pegarse o subirse al repositorio.

Preguntas frecuentes sobre cifrado SM4

¿Por qué falla mi descifrado SM4 con un error de relleno o texto ilegible?
El descifrado solo funciona si todo coincide con el lado que cifró: los bytes de la clave, el modo, el IV, el relleno y la forma en que se escribió el texto cifrado (hex o Base64). El error que recibes —"bad decrypt", una excepción de relleno o una pantalla llena de basura— no dice cuál de ellos falla, y algunas bibliotecas devuelven una salida vacía en lugar de un error. Aun así, pega aquí el texto cifrado, la clave y el IV. Cuando el descifrado falla, la página vuelve a probar todas las combinaciones de codificación del texto cifrado, formato de clave, modo, IV y relleno —incluidas las claves que una biblioteca recortó en silencio a 16 bytes y el texto plano codificado en GBK— y lista las lecturas que producen texto legible, marcando aquellas cuyo relleno PKCS#7 se verificó. Si solo salen mal los primeros 16 bytes, la clave y el modo son correctos y el IV no.
¿Qué longitud tiene una clave SM4? ¿Puede ser de 256 bits?
Una clave SM4 tiene exactamente 128 bits, es decir, 16 bytes: el mismo tamaño que el bloque. GB/T 32907 define solo esta longitud de clave; no existe SM4 de 192 ni de 256 bits. Si alguien te pide una clave SM4 de 256 bits, comprueba si una cadena hex de 32 dígitos se contó como 32 caracteres de 8 bits cada uno. Dieciséis bytes se pueden escribir como 32 dígitos hex o como 16 caracteres ASCII, y confundir ambas cosas es el error de clave más común: 0123456789abcdeffedcba9876543210 leída como hex son 16 bytes, pero la misma cadena leída como texto son 32 bytes y se rechaza. El selector de formato y el contador de bytes junto al campo de la clave están ahí precisamente para detectarlo.
¿Qué es el IV de SM4 y qué longitud debe tener?
El IV (vector de inicialización) es un valor de 16 bytes que se mezcla en el primer bloque en CBC, CTR, CFB y OFB; ECB no lo usa. Debe tener exactamente 16 bytes —32 dígitos hex o 16 caracteres ASCII—, así que si recibes un error de longitud del IV, comprueba si una cadena hex de 32 dígitos se leyó como 32 bytes de texto. El IV no es secreto, pero no debe repetirse con la misma clave: genéralo al azar y envíalo con el texto cifrado, a menudo delante de él. Un IV incorrecto en CBC normalmente no provoca ningún error y solo corrompe los primeros 16 bytes. Algunas bibliotecas usan en silencio un IV de ceros cuando no se indica ninguno (sm-crypto-v2 y tjfoc/gmsm en Go), mientras que BouncyCastle en Java genera uno aleatorio: si ese IV no se guarda junto al texto cifrado, nadie podrá descifrarlo.
¿Qué diferencia hay entre SM4 ECB y CBC, y cuál debo usar?
Usa CBC (o CTR) con un IV aleatorio nuevo para cada mensaje. ECB cifra bloques iguales de 16 bytes en bloques de texto cifrado iguales, así que la estructura repetida de los datos se nota en el texto cifrado. Elige ECB solo para comunicarte con un sistema que ya lo use. Ten en cuenta que ninguno de los dos modos detecta manipulaciones: si eso te importa, envía también un MAC calculado sobre el IV y el texto cifrado, por ejemplo con el generador HMAC.
¿Qué relleno SM4 debo usar: PKCS5Padding, PKCS#7, relleno con ceros o sin relleno?
PKCS#7 siempre añade de 1 a 16 bytes, y cada uno contiene el número de bytes añadidos, de modo que el receptor puede quitarlo sin ambigüedad. En un cifrado por bloques de 16 bytes como SM4, el PKCS5Padding de Java es exactamente el mismo relleno: BouncyCastle envía ambos nombres por la misma ruta de código. El relleno con ceros añade 0x00 solo hasta el siguiente límite de bloque. Al descifrar, Hutool y BouncyCastle eliminan todos los 0x00 finales, incluidos los bytes cero que en realidad formaban parte de los datos, mientras que gmssl en Python elimina solo uno. Sin relleno, la entrada tiene que ser un número entero de bloques de 16 bytes. CTR, CFB y OFB son modos de flujo y nunca rellenan. Si el texto descifrado termina con espacios sueltos, recuadros o saltos de línea, el relleno no se eliminó: los datos con PKCS#7 descifrados sin relleno conservan al final n bytes de valor n (0x09, 0x0A y 0x0D aparecen como tabuladores y saltos de línea); cambia la salida a Hex y mira el último bloque.
¿Qué longitud tiene el texto cifrado SM4 y se puede deducir el modo a partir de él?
Cuenta en bytes. Con PKCS#7 en ECB o CBC, el texto plano se redondea al siguiente múltiplo de 16, y un mensaje que ya es múltiplo de 16 recibe un bloque completo más: 5 o 15 bytes pasan a ser 16, y 16 bytes pasan a ser 32. El relleno con ceros solo completa hasta el siguiente múltiplo de 16, sin relleno la longitud no cambia, y en CTR, CFB y OFB el texto cifrado mide exactamente lo mismo que el texto plano. Hex duplica el número de bytes; Base64 ocupa 4 × ⌈bytes / 3⌉ caracteres, así que 16 bytes son 24 caracteres, 32 son 44 y 64 son 88. Suma 16 bytes si el IV va delante. El texto cifrado por sí solo no revela el modo, pero hay dos pistas: una longitud que no es múltiplo de 16 prácticamente descarta ECB o CBC con relleno, y dos bloques idénticos de 16 bytes apuntan a ECB. Si tienes dudas, pégalo en la pestaña de descifrado y el diagnóstico automático probará los modos por ti.
¿SM4 da siempre el mismo texto cifrado? ¿Por qué el de otra herramienta es distinto?
ECB —o cualquier modo con un IV fijo— da siempre el mismo texto cifrado para la misma clave y el mismo texto plano; con un IV aleatorio nuevo en cada ejecución, la salida cambia cada vez, como debe ser. Más allá de eso, compara el modo, el relleno, si la clave se leyó como hex o como texto, cómo se codificó el texto plano —UTF-8 en la mayoría del código, pero GBK cuando código Java antiguo llama a getBytes() en un Windows en chino— y cómo se imprime el resultado: Base64, hex en minúsculas o hex en mayúsculas. Con los mismos ajustes y un IV fijo, dos implementaciones correctas producen una salida idéntica. Si sospechas de una de las herramientas, comprueba primero las dos con el vector de prueba GB/T 32907.
¿Cómo compruebo que mi propia implementación de SM4 es correcta?
Empieza por los dos vectores del apéndice A de GB/T 32907-2016. Con la clave y el texto plano ambos iguales a 0123456789abcdeffedcba9876543210, un cifrado debe dar 681edf34d206965e86b3e94f536e4246 y un millón de cifrados encadenados, 595298c7c6fd271f0402f804c33d3f66. Solo prueban el cifrado por bloques, así que después cifra un texto en CBC con una clave y un IV fijos y compáralo con esta página o con el comando de OpenSSL que muestra. El motor de esta página está probado con ambos vectores y contra OpenSSL 3 en los cinco modos.
¿OpenSSL puede cifrar y descifrar SM4?
Sí. OpenSSL 3 incluye SM4 en ECB, CBC, CFB, OFB y CTR. Usa openssl enc -sm4-cbc -K <32 hex digits> -iv <32 hex digits>: -K recibe la clave en bruto en hex, así que no interviene ninguna contraseña, -nopad desactiva PKCS#7, y -base64 -A lee o escribe Base64 en una sola línea. Vigila dos cosas: -sm4 a secas significa CBC, y un valor de -K con la longitud incorrecta se trunca o se rellena con ceros con apenas una advertencia. El panel de OpenSSL de esta página construye el comando con tus ajustes actuales; openssl enc no tiene relleno con ceros, así que el panel lo indica en lugar de imprimir un comando que no coincidiría.
¿Cómo descifro texto cifrado SM4 de Java (Hutool) o de JavaScript (sm-crypto)?
Primero averigua qué modo y qué relleno usa realmente el otro lado; a menudo el código nunca lo dice. SmUtil.sm4(key) de Hutool solo pasa el nombre SM4, y BouncyCastle lo completa con ECB con PKCS#7 (el PKCS5Padding de Java); solo una cadena completa como SM4/CBC/PKCS5Padding significa CBC. En JavaScript, sm-crypto también usa ECB por defecto, recibe la clave como una cadena hex de 32 dígitos e imprime hex en minúsculas, mientras que gm-crypt usa CBC por defecto, recibe una clave de texto de 16 caracteres e imprime Base64. Después comprueba el juego de caracteres del texto plano: los métodos de cadena de Hutool siempre usan UTF-8, pero un getBytes() sin argumentos en JDK 17 o anterior sobre un Windows en chino puede significar GBK, lo que cambia el texto cifrado. Elige la biblioteca en Usar los valores predeterminados de para configurar todo esto con un clic, o introdúcelo tú mismo; si algún dato es dudoso, pega igualmente el texto cifrado y el diagnóstico automático probará las combinaciones de modo, relleno, IV y codificación.
¿Es seguro SM4? ¿Se suben mis datos?
Como algoritmo, SM4 usa una clave de 128 bits y 32 rondas; el RFC 8998 (2021) indica que, en el momento de su redacción, no se conocían claves débiles ni problemas de seguridad en SM4. Los riesgos prácticos vienen de cómo se usa: ECB filtra patrones y CBC no detecta manipulaciones. En cuanto a esta página, no se sube nada. Los navegadores no traen SM4 de serie, así que esta página incluye su propia implementación de SM4 y la ejecuta localmente; puedes abrir el panel de red y comprobar que no sale ninguna petición, o desconectarte y seguir usando la herramienta. Eso la hace adecuada para datos de prueba, depuración y aprendizaje. Pero no convierte una página web en el lugar adecuado para claves de producción: esas deben estar en un sistema de gestión de claves o en un módulo de hardware, no en un cuadro de texto de ningún sitio web.
¿Qué diferencia hay entre SM4 y AES?
Ambos son cifrados por bloques con bloques de 128 bits, y los modos y el relleno funcionan igual en los dos; por eso los fallos de interoperabilidad de SM4 son idénticos a los de AES. SM4 ejecuta 32 rondas y tiene un único tamaño de clave, de 128 bits; AES-128 ejecuta 10 rondas, y AES también admite claves de 192 y 256 bits. SM4 es el estándar nacional chino GB/T 32907-2016 y, desde 2021, forma parte del estándar internacional ISO/IEC 18033-3 junto a AES; se usa allí donde se exige criptografía comercial china. AES es el estándar FIPS 197 del NIST. Para AES, usa la herramienta de cifrado AES.

Herramientas relacionadas

Ver todas las herramientas →

Descifrado AES — Compatible con OpenSSL y CryptoJS

Herramientas de Seguridad

Descifra AES en línea — GCM/CBC/CTR, frase de contraseña o clave sin procesar, detecta automáticamente el formato "U2FsdGVkX1" de OpenSSL y CryptoJS. 100 % en el navegador, las claves nunca salen de la página.

Herramienta de Cifrado AES — GCM, CBC y CTR

Herramientas de Seguridad

Cifrado AES online y gratuito — AES-128/192/256, GCM/CBC/CTR, frase de contraseña (PBKDF2) o clave sin procesar. Se ejecuta 100 % en tu navegador; nada se sube a un servidor.

Generador y verificador de hash bcrypt

Herramientas de Seguridad

Genera y verifica hashes bcrypt de contraseñas online — coste ajustable, prefijos $2b$/$2a$/$2y$. 100 % en tu navegador; tu contraseña nunca se sube.

Calculadora de suma de verificación CRC

Herramientas de Seguridad

Pega hexadecimal o texto y obtén las 63 variantes de CRC-8, CRC-16 y CRC-32. ¿Tienes una suma que no logras reproducir? Escríbela y la herramienta nombra la variante: MODBUS, CCITT-FALSE, XMODEM, KERMIT. Todo en tu navegador.

Generador HMAC y verificador de firmas

Herramientas de Seguridad

Generador y verificador HMAC en línea gratis. Calcula HMAC-SHA256/SHA1/SHA384/SHA512 con claves en texto, hex o Base64 y salida Hex/Base64/Base64URL. 100 % en tu navegador: las claves nunca salen de la página.

Decodificador JWT

Herramientas de Seguridad

Decodifica tokens JWT online con nuestro decodificador JWT gratis. Inspecciona encabezado, carga útil, firma, expiración y reclamaciones al instante. 100% navegador — tu token nunca sale del dispositivo. Sin registro ni rastreo.