Cifrar / descifrar / firmar SM2

La caja de herramientas completa de clave pública SM2 sobre la curva recomendada sm2p256v1 (GB/T 32918.5): genere un par de claves, firme y verifique con el esquema ZA basado en SM3 (GB/T 32918.2), y cifre o descifre en el orden estándar C1C3C2, en el orden heredado C1C2C3 o en ASN.1 DER. Todo se ejecuta en su navegador; no se sube nada.
Clave privada (hex, 64 dígitos — trátela como una contraseña)
Clave pública (hex, 130 dígitos con prefijo 04 o 128 dígitos x||y)
La clave privada la usan Firmar y Descifrar; la clave pública, Verificar y Cifrar. Las claves nunca salen de esta página.
ID de usuario(el «identificador distintivo» que se mezcla en ZA; el predeterminado es el estándar de facto)
Leer el mensaje como: k fijo (avanzado):
r (hex)
s (hex)
Firma, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } - el formato que usan OpenSSL/GmSSL)
Sobre el cuadro de k fija: toda firma real debe usar una k nueva e impredecible — reutilizar o adivinar k filtra la clave privada (la lección de ECDSA de Sony). Esta página genera una k aleatoria con crypto.getRandomValues siempre que el cuadro esté vacío. Rellene el cuadro solo para reproducir un vector conocido con fines didácticos o de prueba.
ID de usuario(debe coincidir con el del firmante)
Leer el mensaje como: Formato de la firma:
r (hex)
s (hex)
✓ La firma es VÁLIDA
✗ La firma NO es VÁLIDA
Leer el mensaje como: Formato del cifrado: Salida:
k fijo (avanzado):
Recordatorio sobre el cifrado híbrido: el cifrado SM2 está pensado para secretos cortos (claves de sesión, PIN), no para datos masivos — cada mensaje paga 96 bytes de sobrecarga de C1+C3 y una multiplicación de punto de curva elíptica. Cifre una clave SM4/AES aleatoria con SM2 y después los datos con el cifrado simétrico (página de SM4 / página de AES).
Leer el cifrado como: Orden: Escribir el texto plano como:
Comprobación cruzada con OpenSSL — el hex C1C3C2 de esta página coincide con openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x con -pkeyopt ec_scheme:c1c3c2, el valor predeterminado), y con las herramientas de GmSSL gmssl sm2randkey / sm2encrypt; las firmas coinciden con openssl dgst -sm3 -sign con el mismo ID de usuario mediante -pkeyopt sm2_userid:1234567812345678. Al descifrar se acepta un byte 04 inicial antes de C1 (como producen varias bibliotecas).
Nota de cumplimiento: SM2 es una elección de algoritmo impulsada por el cumplimiento normativo de la criptografía comercial china y la interoperabilidad, con una seguridad comparable a la ECC de 256 bits (NIST P-256). En producción, combínelo con un sistema real de gestión de claves o con claves hardware — una página del navegador es una calculadora, no una cámara acorazada.
Autocomprobación
Repite los vectores de derivación de claves, de firma con k fija y de cifrado producidos por una implementación de referencia independiente en Python (y verificados de forma cruzada con gmssl), los viajes de ida y vuelta de firma DER y cifrado DER, los viajes de ida y vuelta de firma/verificación y cifrado/descifrado con k aleatoria, y las rutas negativas (C3 alterado, cifrado truncado, clave pública fuera de la curva, r = 0).
¿Qué es SM2?
En una frase: SM2 es el criptosistema de clave pública del estándar nacional chino — un esquema de firma y cifrado de curva elíptica sobre la curva fija sm2p256v1, publicado como GB/T 32918-2016 (antes GM/T 0003-2012), y que desempeña en el conjunto «SM» chino el papel que ECDSA/ECDH (P-256) desempeñan en el mundo NIST.
ECC en un párrafo (la intuición)

Toda la criptografía de curva elíptica se basa en un truco: dado el punto base G sobre una curva en un cuerpo primo grande y el múltiplo P = d·G, calcular d a partir de P exige resolver el problema del logaritmo discreto en curvas elípticas, para el que no se conoce ningún algoritmo rápido. La clave privada d es solo un número de 256 bits; la clave pública es el punto d·G. SM2 no es una aritmética de curva nueva — es una forma concreta de firmar (como ECDSA) y de cifrar (como un ECIES en miniatura) sobre una curva específica, con hash SM3 en lugar de SHA.

sm2p256v1 frente a NIST P-256
Aspectosm2p256v1NIST P-256 (secp256r1)
Tamaño del cuerpoprimo de 256 bitsprimo de 256 bits
Forma de la curvay² = x³ + ax + by² = x³ − 3x + b (a = −3)
Nivel de seguridad≈ 128 bits≈ 128 bits
FirmaSM2 (GB/T 32918.2), basado en SM3, ID de usuario vinculado en ZAECDSA con SHA-256
CifradoSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, no estandarizado por el NIST)
HashSM3 (GB/T 32905)familia SHA-2
Publicadodiseño de 2010, GM/T 0003-2012, GB/T 32918-2016; en ISO/IEC 14888-31999 (SEC 2 / NIST)
Soporte en TLSTLCP (GM/T 386) y conjuntos de TLS 1.3 de la RFC 8998en todas partes

Ambas curvas ofrecen la misma seguridad concreta; ninguna tiene un ataque práctico. La elección entre ellas es normativa y de interoperabilidad, no de fortaleza.

El ID de usuario y ZA — lo que SM2 firma y ECDSA no

Antes de hashear, SM2 incorpora la identidad del firmante en el resumen: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), donde ENTLa es la longitud en bits del ID, los cuatro campos intermedios fijan la curva exacta y los dos últimos son la clave pública del firmante. El mensaje se hashea como SM3(ZA ‖ M). Dos consecuencias: una firma queda vinculada a la identidad declarada (una característica), y el verificador debe conocer el ID del firmante y usar el mismo (una trampa clásica de interoperabilidad). Casi todo el ecosistema se asentó en el ID predeterminado de 16 dígitos 1234567812345678 — no por el texto del estándar, sino por los ejemplos del anexo de GM/T 0003; el valor predeterminado de OpenSSL coincide, y también esta página.

Formatos de cifrado: C1C3C2, C1C2C3 y DER

Un cifrado SM2 tiene tres partes: C1 = el punto efímero kG (64 bytes, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 bytes, integridad), C2 = M ⊕ KDF(x2 ‖ y2) (el mensaje enmascarado). El texto de GM/T 0003 de 2012 los concatenaba como C1 ‖ C2 ‖ C3; el estándar GB/T 32918.4 de 2016 reordenó a C1 ‖ C3 ‖ C2, y OpenSSL 1.1.1+ lo siguió. Los sistemas bancarios y gubernamentales antiguos siguen hablando el orden antiguo — por eso esta página incluye ambos, además de la forma ASN.1 (SEQUENCE de INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2) que emiten algunas bibliotecas. Cuando el descifrado falla con la herramienta de la otra parte, el orden de bytes es lo primero que hay que comprobar.

Errores habituales
  • Reutilizar o escatimar en k. El nonce k, tanto al firmar como al cifrar, debe ser nuevo e impredecible en cada operación. Una k repetida en dos firmas entrega la clave privada a cualquiera que vea ambas. Esta página extrae k del CSPRNG del navegador; los cuadros de k fija existen solo para reproducir vectores conocidos.
  • ID de usuario que no coinciden. Firmar con el ID predeterminado y verificar con uno personalizado (o al revés) hace que fallen todas las firmas válidas. El ID forma parte de los datos firmados.
  • Suponer C1C3C2 en todas partes. Los sistemas de la época GM/T 0003, algunas tarjetas inteligentes y las versiones antiguas de GmSSL usan C1C2C3 por defecto; varias herramientas además anteponen un byte 04 de punto sin comprimir. Esta página acepta todos estos formatos al descifrar.
  • Cifrar datos masivos con SM2. Cada cifrado lleva 96 bytes de sobrecarga y cuesta dos multiplicaciones de punto. Use SM2 sobre una clave, y SM4/AES sobre los datos.
  • Tratar una clave pública con prefijo 04 como 65 bytes de clave sin procesar. El 04 es un marcador de codificación: la clave en sí es x ‖ y, 128 dígitos hex. Esta página acepta ambas formas.
Preguntas frecuentes

¿Es compatible con OpenSSL / GmSSL? Sí. La salida hex C1C3C2 coincide con openssl pkeyutl -sm2encrypt para la misma clave pública, mensaje y k; las firmas DER coinciden byte a byte con la salida de openssl dgst -sm3 -sign (defina el ID de usuario con -pkeyopt sm2_userid:...). Las ejecuciones con k aleatoria, por supuesto, difieren — compare descifrando o verificando, no por igualdad.

¿Por qué no hay aquí un intercambio de claves SM2? GB/T 32918.3 define un protocolo interactivo de intercambio de claves autenticado; no tiene sentido como calculadora de una página. Firmar y cifrar cubren los usos no interactivos.

¿Está SM2 en WebCrypto? No — ningún navegador lo implementa (Chrome lo incluye solo tras marcas no estándar, si es que lo hace). Esta página ejecuta una implementación en JavaScript escrita desde cero, con los propios vectores del anexo del estándar conectados a la autocomprobación de arriba.

¿Puedo usar una clave PEM de OpenSSL? Exporte el hex sin procesar en su lugar: openssl ec -in key.pem -text imprime el escalar privado y el punto público. Esta página acepta solo claves hex, a propósito — la maquinaria PEM/SEC1 vive en la página de RSA, donde corresponde.

Entonces, ¿qué es SM9? Un animal distinto: criptografía basada en identidad, donde cualquier cadena (una dirección de correo) es la clave pública y un KGC emite las claves privadas. Vea la página de resumen de SM9.