SM2 Cifrar / Decifrar / Assinar

A caixa de ferramentas pública SM2 completa na curva recomendada sm2p256v1 (GB/T 32918.5): gere um par de chaves, assine e verifique com o esquema ZA baseado em SM3 (GB/T 32918.2), e cifre ou decifre na ordem padrão C1C3C2, na ordem antiga C1C2C3, ou em ASN.1 DER. Tudo corre no seu navegador; nada é enviado.
Chave privada (hexadecimal, 64 dígitos — trate como uma palavra-passe)
Chave pública (hexadecimal, 130 dígitos com prefixo 04 ou 128 dígitos x||y)
A chave privada é usada por Assinar e Decifrar; a chave pública por Verificar e Cifrar. As chaves nunca saem desta página.
ID de utilizador(o "identificador distintivo" misturado no ZA; o predefinido é o padrão de facto)
Ler a mensagem como: k fixo (avançado):
r (hexadecimal)
s (hexadecimal)
Assinatura, ASN.1 DER (SEQUENCE { r INTEGER, s INTEGER } - o formato que o OpenSSL/GmSSL usam)
Sobre a caixa de k fixo: toda a assinatura real tem de usar um k novo e imprevisível — reutilizar ou adivinhar k fuga a chave privada (a lição do ECDSA da Sony). Esta página gera um k aleatório a partir de crypto.getRandomValues sempre que a caixa estiver vazia. Preencha a caixa apenas para reproduzir um vetor conhecido para ensino ou testes.
ID de utilizador(tem de coincidir com o do signatário)
Ler a mensagem como: Formato da assinatura:
r (hexadecimal)
s (hexadecimal)
✓ A assinatura é VÁLIDA
✗ A assinatura é INVÁLIDA
Ler a mensagem como: Formato do texto cifrado: Saída:
k fixo (avançado):
Lembrete de cifragem híbrida: a cifragem SM2 destina-se a segredos curtos (chaves de sessão, PIN), não a dados volumosos — cada mensagem paga 96 bytes de sobrecarga de C1+C3 e uma multiplicação de ponto em curva elíptica. Cifre uma chave SM4/AES aleatória com SM2, depois os dados com a cifra simétrica (página SM4 / página AES).
Ler o texto cifrado como: Ordem: Escrever o texto limpo como:
Verificação cruzada com OpenSSL — o hexadecimal C1C3C2 desta página coincide com openssl pkeyutl -sm2encrypt -pubin -inkey pub.pem (OpenSSL 3.x com -pkeyopt ec_scheme:c1c3c2, o padrão), e as ferramentas do GmSSL gmssl sm2randkey / sm2encrypt; as assinaturas coincidem com openssl dgst -sm3 -sign com o mesmo ID de utilizador através de -pkeyopt sm2_userid:1234567812345678. Um byte 04 inicial antes de C1 (como produzem várias bibliotecas) é aceite na decifragem.
Nota de conformidade: o SM2 é uma escolha de algoritmo motivada pela conformidade da criptografia comercial chinesa e pela interoperabilidade, com segurança comparável à ECC de 256 bits (NIST P-256). Em produção, emparelhe-o com um sistema real de gestão de chaves ou com chaves de hardware — uma página de navegador é uma calculadora, não um cofre.
Autoteste
Repete os vetores de derivação de chave, assinatura com k fixo e cifragem produzidos por uma implementação de referência independente em Python (e verificados cruzadamente com o gmssl), os ciclos de assinatura DER e texto cifrado DER, os ciclos de assinar/verificar e cifrar/decifrar com k aleatório, e os caminhos negativos (C3 adulterado, texto cifrado truncado, chave pública fora da curva, r = 0).
O que é o SM2?
Em resumo: o SM2 é o sistema criptográfico de chave pública da norma nacional chinesa — um esquema de assinatura e cifragem de curva elíptica sobre a curva fixa sm2p256v1, publicado como GB/T 32918-2016 (antes GM/T 0003-2012), desempenhando no conjunto "SM" chinês o papel que o ECDSA/ECDH (P-256) desempenha no mundo NIST.
ECC num parágrafo (a intuição)

Toda a criptografia de curva elíptica assenta num truque: dado o ponto base G numa curva sobre um primo grande e o múltiplo P = d·G, calcular d a partir de P significa resolver o problema do logaritmo discreto em curvas elípticas, para o qual não se conhece nenhum algoritmo rápido. A chave privada d é apenas um número de 256 bits; a chave pública é o ponto d·G. O SM2 não é uma nova aritmética de curva — é uma forma específica de assinar (como o ECDSA) e cifrar (como um ECIES em miniatura) numa curva específica, com hash SM3 em vez de SHA.

sm2p256v1 vs NIST P-256
Aspetosm2p256v1NIST P-256 (secp256r1)
Tamanho do corpoprimo de 256 bitsprimo de 256 bits
Forma da curvay² = x³ + ax + by² = x³ − 3x + b (a = −3)
Nível de segurança≈ 128 bits≈ 128 bits
AssinaturaSM2 (GB/T 32918.2), com base em SM3, ID de utilizador vinculado ao ZAECDSA com SHA-256
CifragemSM2 (GB/T 32918.4), C1C3C2ECIES (ANSI X9.63, não normalizado pelo NIST)
HashSM3 (GB/T 32905)família SHA-2
Publicadodesenho de 2010, GM/T 0003-2012, GB/T 32918-2016; na ISO/IEC 14888-31999 (SEC 2 / NIST)
Suporte TLSTLCP (GM/T 386) e suítes TLS 1.3 RFC 8998em toda a parte

As duas curvas oferecem a mesma segurança concreta; nenhuma tem um ataque prático. A escolha entre elas é regulamentar e de interoperabilidade, não de força.

O ID de utilizador e o ZA — o que o SM2 assina e o ECDSA não

Antes de calcular o hash, o SM2 incorpora a identidade do signatário no resumo: ZA = SM3(ENTL ‖ ID ‖ a ‖ b ‖ xG ‖ yG ‖ xA ‖ yA), em que ENTLa é o comprimento em bits do ID, os quatro campos do meio fixam a curva exata, e os dois últimos são a chave pública do signatário. A mensagem é submetida a hash como SM3(ZA ‖ M). Duas consequências: uma assinatura fica vinculada à identidade declarada (uma funcionalidade), e o verificador tem de ser informado do ID do signatário e usar o mesmo (uma armadilha clássica de interoperabilidade). Quase todo o ecossistema se fixou no ID predefinido de 16 dígitos 1234567812345678 — não pelo texto da norma, mas pelos exemplos do anexo da GM/T 0003; o predefinido do OpenSSL coincide, e também esta página.

Formatos de texto cifrado: C1C3C2, C1C2C3 e DER

Um texto cifrado SM2 tem três partes: C1 = o ponto efémero kG (64 bytes, x‖y), C3 = SM3(x2 ‖ M ‖ y2) (32 bytes, integridade), C2 = M ⊕ KDF(x2 ‖ y2) (a mensagem mascarada). O texto de 2012 GM/T 0003 concatenava-os C1 ‖ C2 ‖ C3; a norma GB/T 32918.4 de 2016 reordenou para C1 ‖ C3 ‖ C2, e o OpenSSL 1.1.1+ seguiu. Sistemas bancários e governamentais antigos ainda falam a ordem antiga — por isso esta página tem ambas, mais a forma ASN.1 (SEQUENCE de INTEGER x1, INTEGER y1, OCTET STRING C3, OCTET STRING C2) que algumas bibliotecas emitem. Quando a decifragem falha com a ferramenta da outra parte, a ordem dos bytes é a primeira coisa a verificar.

Erros comuns
  • Reutilizar ou poupar em k. O nonce k, tanto na assinatura como na cifragem, tem de ser novo e imprevisível em cada operação. Um k repetido em duas assinaturas entrega a chave privada a quem vir as duas. Esta página tira o k do CSPRNG do navegador; as caixas de k fixo existem apenas para reproduzir vetores conhecidos.
  • IDs de utilizador diferentes. Assinar com o ID predefinido e verificar com um personalizado (ou o contrário) faz falhar toda a assinatura válida. O ID faz parte dos dados assinados.
  • Presumir C1C3C2 em toda a parte. Sistemas da era GM/T 0003, alguns cartões inteligentes e builds antigos do GmSSL usam C1C2C3 por omissão; várias ferramentas também acrescentam um byte 04 de ponto não comprimido. Esta página aceita todos estes na decifragem.
  • Cifrar dados volumosos com SM2. Cada texto cifrado transporta 96 bytes de sobrecarga e custa duas multiplicações de ponto. Use o SM2 numa chave, SM4/AES nos dados.
  • Tratar uma chave pública com prefixo 04 como 65 bytes brutos de chave. O 04 é um marcador de codificação: a chave em si é x ‖ y, 128 dígitos hexadecimais. Esta página aceita ambas as grafias.
FAQ

Isto é compatível com OpenSSL / GmSSL? Sim. A saída hexadecimal C1C3C2 coincide com openssl pkeyutl -sm2encrypt para a mesma chave pública, mensagem e k; as assinaturas DER coincidem com a saída de openssl dgst -sm3 -sign byte a byte (defina o ID de utilizador com -pkeyopt sm2_userid:...). As execuções com k aleatório naturalmente diferem — compare por decifragem/verificação, não por igualdade.

Porque é que não há aqui troca de chaves SM2? A GB/T 32918.3 define um protocolo interativo de troca de chaves autenticada; não faz sentido como calculadora de uma só página. Assinar e cifrar cobrem as utilizações não interativas.

O SM2 está no WebCrypto? Não — nenhum navegador o implementa (o Chrome só o inclui atrás de flags não padronizadas, se é que inclui). Esta página corre uma implementação JavaScript escrita de raiz, com os vetores do próprio anexo da norma ligados ao autoteste acima.

Posso usar uma chave PEM do OpenSSL? Exporte antes o hexadecimal bruto: openssl ec -in key.pem -text imprime o escalar privado e o ponto público. Esta página aceita apenas chaves em hexadecimal, de propósito — a maquinaria PEM/SEC1 vive na página RSA, onde pertence.

Então o que é o SM9? Um animal diferente: criptografia baseada na identidade, onde qualquer cadeia (um endereço de email) é a chave pública e um KGC emite as chaves privadas. Veja a página de visão geral do SM9.