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.
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.
ECB cifra bloques iguales en texto cifrado igual y filtra patrones: úsalo solo para comunicarte con un sistema que lo exija.
CTR, CFB y OFB son modos de flujo: no llevan relleno y el texto cifrado mide lo mismo que el texto plano.
Diagnóstico automático
—
Requiere OpenSSL 3. El comando contiene la clave que introdujiste.
| Clave | 0123456789abcdeffedcba9876543210 |
|---|---|
| Texto plano | 0123456789abcdeffedcba9876543210 |
| Texto cifrado, 1 cifrado | 681edf34d206965e86b3e94f536e4246 |
| Texto cifrado, 1.000.000 de cifrados | 595298c7c6fd271f0402f804c33d3f66 |
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.
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.
681edf34d206965e86b3e94f536e4246 Con clave y texto plano 0123456789abcdeffedcba9876543210, un cifrado da 681edf34d206965e86b3e94f536e4246.
32 rondas Bloques de 16 bytes (128 bits), cifrados en 32 rondas.
primeros 16 bytes No. Solo los primeros 16 bytes se descifran mal, y el relleno del último bloque se sigue verificando sin problemas.
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 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.
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.
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.
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.
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.
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.
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.
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.
SmUtil.sm4(key)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).
Cipher.getInstance("SM4")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.
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.
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.
CryptSM4El 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.
sm4Sm4Cbc 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Clave (texto): 0123456789abcdeffedcba9876543210 -> 32 bytes, rechazada
Clave (hex): 0123456789abcdeffedcba9876543210 -> 16 bytes
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.
cifrar: SM4/CBC/PKCS5Padding descifrar: SM4/ECB/PKCS5Padding -> bad decrypt
cifrar: SM4/CBC/PKCS5Padding descifrar: SM4/CBC/PKCS5Padding, mismo IV
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.
IV de descifrado 00000000000000000000000000000000 -> 16 bytes ilegibles + ": order 20260911-0042"
IV de descifrado fedcba98765432100123456789abcdef -> "SM4 interop test: order 20260911-0042"
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.
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y leído como hex -> no válido
Wi6BuLpov8RndEfedUyLXFvDRnLMoo7T6O04Q83IzKDuDvPQ2S5clq+cEQXMvy/y leído como Base64 -> 48 bytes
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.
relleno con ceros: 61 62 00 -> se descifra como 61 62
PKCS#7: 61 62 00 -> se descifra como 61 62 00
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.
Java: Cipher.getInstance("SM4") -> ECB + PKCS#7
OpenSSL: openssl enc -sm4 -> CBC Java: Cipher.getInstance("SM4/CBC/PKCS5Padding")
OpenSSL: openssl enc -sm4-cbc 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).
"国密SM4 test".getBytes() // GBK en un JDK <= 17 sobre Windows en chino -> texto cifrado ECB 3188d06cf28db70092f8753cbd5ee518
"国密SM4 test".getBytes(StandardCharsets.UTF_8) -> texto cifrado ECB d830308b0ae4fa7b9a2b5d59f7f65ca5
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.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. 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. 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. 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 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. 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. 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.
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.
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.
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.
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.
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.