◇ OpenCyber Academy
Engenharia · Capítulo 19 · Português

Capítulo 19 — Identidade e criptografia

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 19 — Identidade e criptografia

Mapa da aula

Aula 19 publicada. Mapa, exemplo, EX037.

flowchart TD
  N0["19.1 Assinaturas e PKI"]
  N1["19.2 Assinaturas baseadas em hash a partir dos princ"]
  N2["19.3 Atividade prática — Laboratório L"]
  N3["19.4 As opções padronizadas"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4
  N4 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX037"]

Desenho lógico

flowchart LR
  N0["19.1 Assinaturas e PKI"]
  N1["19.2 Assinaturas baseadas em hash a partir dos princ"]
  N2["19.3 Atividade prática — Laboratório L"]
  N3["19.4 As opções padronizadas"]
  N4["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> Q["EX037"]
[19.1 Assinaturas e PKI]
    |
    v
[19.2 Assinaturas baseadas em hash a partir dos princ]
    |
    v
[19.3 Atividade prática — Laboratório L]
    |
    v
[19.4 As opções padronizadas]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX037]

Objetivos de aprendizagem

Você vai (1) explicar assinaturas digitais, certificados e hierarquias de PKI; (2) entender as assinaturas baseadas em hash de uso único e de muitos usos; (3) comparar ML-DSA, SLH-DSA, LMS/XMSS e o futuro FN-DSA; e (4) planejar a migração da PKI, incluindo raízes e assinaturas de vida longa. O capítulo fecha a etapa de fundamentos.

19.1 Assinaturas e PKI

Uma assinatura liga uma mensagem a uma chave; um certificado liga uma chave a uma identidade e é assinado por uma autoridade certificadora (AC); uma cadeia leva a uma raiz em que as partes confiantes confiam. As raízes muitas vezes vivem mais de 20 anos, então uma chave raiz que um futuro CRQC pudesse falsificar compromete todos os certificados abaixo dela.

Os certificados finais duram cerca de um ano e são substituídos rotineiramente, então o seu algoritmo pode mudar na próxima renovação. A raiz é diferente: as partes confiantes precisam receber uma nova raiz e confiar nela antes que qualquer certificado emitido por ela seja aceito, o que leva anos para parceiros e dispositivos. É por isso que a BPA cria primeiro a sua raiz pós-quântica.

19.2 Assinaturas baseadas em hash a partir dos princípios

Uma assinatura de uso único de Lamport publica os hashes de dois segredos aleatórios por bit do resumo da mensagem e revela um segredo por bit ao assinar. A segurança precisa apenas de um hash de mão única. Usar uma chave duas vezes revela os dois segredos em muitas posições, reduzindo bruscamente o trabalho do falsificador; mais alguns usos tornam a falsificação prática. As árvores de Merkle combinam muitas chaves de uso único sob uma só chave pública; o LMS e o XMSS (RFC 8554, RFC 8391, SP 800-208) fazem isso com estado; o SLH-DSA (FIPS 205) evita o estado usando uma hiperárvore com assinaturas de poucos usos nas folhas, ao custo de assinaturas maiores.

19.3 Atividade prática — Laboratório L

# Lab L (ch 19): Lamport one-time signatures from SHA-256 - the idea under SLH-DSA, LMS and XMSS.
import hashlib, secrets
H = lambda b: hashlib.sha256(b).digest()
def keygen(bits=256):
    sk = [(secrets.token_bytes(32), secrets.token_bytes(32)) for _ in range(bits)]
    pk = [(H(a), H(b)) for a, b in sk]
    return sk, pk
def bits_of(msg):
    d = int.from_bytes(H(msg), "big"); return [(d >> (255 - i)) & 1 for i in range(256)]
def sign(sk, msg): return [sk[i][b] for i, b in enumerate(bits_of(msg))]
def verify(pk, msg, sig): return all(H(s) == pk[i][b] for i, (s, b) in enumerate(zip(sig, bits_of(msg))))
sk, pk = keygen()
s1 = sign(sk, b"firmware v1.0")
print("valid signature verifies:", verify(pk, b"firmware v1.0", s1))
print("tampered message rejected:", not verify(pk, b"firmware v1.1", s1))
s2 = sign(sk, b"firmware v1.1")          # KEY REUSE: never do this
revealed = sum(1 for i in range(256) if bits_of(b"firmware v1.0")[i] != bits_of(b"firmware v1.1")[i])
print(f"after one reuse, both secrets revealed at {revealed}/256 positions -> forging needs ~2^{256 - revealed} hashes, not 2^256")
print("signature size:", 256 * 32, "bytes; public key:", 2 * 256 * 32, "bytes")

Saída esperada:

valid signature verifies: True
tampered message rejected: True
after one reuse, both secrets revealed at 118/256 positions -> forging needs ~2^138 hashes, not 2^256
signature size: 8192 bytes; public key: 16384 bytes

A saída mostra tanto a força do esquema quanto a sua fragilidade. Uma assinatura válida é verificada e uma mensagem alterada falha, usando apenas o SHA-256. Depois de uma reutilização, os dois resumos diferem em 118 posições, onde os dois segredos agora são públicos; um falsificador precisa de uma mensagem cujo resumo coincida nas 138 posições restantes, cerca de 2^138 hashes. Cada nova reutilização reduz à metade, em média, as posições desconhecidas, então, depois de três assinaturas, restam cerca de 64, ao alcance de grandes computações. Os tamanhos, 8 KB por assinatura, explicam por que os esquemas práticos comprimem as chaves de Lamport com cadeias de Winternitz e árvores de Merkle.

19.4 As opções padronizadas

Esquema Base Chave pública / assinatura (bytes) Notas
ML-DSA-44/65/87 (FIPS 204) Reticulados modulares 1.312/2.420 · 1.952/3.309 · 2.592/4.627 Uso geral
SLH-DSA (FIPS 205) Hashes, sem estado 32–64 / 7.856–49.856 Conservador, grande
LMS, XMSS (SP 800-208) Hashes, com estado Pequena / ~1–3 kB típico O estado nunca pode se repetir; firmware
FN-DSA (Falcon) Reticulados NTRU ~900 / ~666 no nível 1 Norma (FIPS 206) em desenvolvimento

Para a BPA, a tabela aponta o ML-DSA para a assinatura geral, o LMS para o firmware onde o estado pode ser gerenciado e o SLH-DSA onde o tamanho da assinatura importa menos do que pressupostos conservadores. O FN-DSA fica anotado para uso futuro, quando a FIPS 206 for final, já que as suas assinaturas pequenas se adequam a enlaces restritos. A escolha para cada uso é registrada com os números de tamanho da tabela, para que revisores posteriores possam conferi-los.

19.5 Exemplo resolvido

O plano de PKI da BPA: uma nova raiz ML-DSA-87 (ou uma raiz composta tradicional+PQC, conforme o suporte das partes confiantes) criada agora e distribuída; intermediárias migradas no próximo ciclo de certificados; LMS para a assinatura de firmware, com estado protegido por HSM; SLH-DSA considerado para uma raiz offline raramente usada, por causa do seu pressuposto conservador.

Distribuir a nova raiz leva tempo, então ela é criada antes que as intermediárias precisem dela; uma raiz criada no primeiro ano pode estar nos repositórios de confiança dos parceiros quando os certificados finais migrarem. A raiz offline assina raramente, então as assinaturas grandes do SLH-DSA pouco importam, enquanto a sua dependência exclusiva de hashes dá garantia caso os esquemas de reticulados sejam enfraquecidos.

19.6 Erros comuns e limites

Restaurar um servidor de assinatura a partir de um backup pode reiniciar o contador do LMS, de modo que a mesma chave de uso único assina duas mensagens, exatamente a reutilização que o Laboratório L mostra; o HSM da BPA guarda o estado e se recusa a retroceder. Um certificado final pós-quântico sob uma raiz RSA continua falhando se a raiz puder ser falsificada. O FN-DSA deve ser planejado, não implantado, até que a sua norma seja final.

Exercícios

Síntese

As assinaturas e a PKI carregam confiança de vida longa; os esquemas baseados em hash são conservadores e ou têm estado ou são grandes; o ML-DSA é a escolha de uso geral; as raízes precisam migrar primeiro.

Continue estudando — capítulo 19 de 50

← Capítulo 18 · Índice de capítulos do curso · Capítulo 20 →

Siga para a próxima lição escrita.