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
- Reutilizar chaves de uso único ou com estado (o retrocesso do estado após a restauração de um backup é uma falha clássica).
- Migrar os certificados finais e deixar uma raiz de vida longa vulnerável.
- Citar o FN-DSA como norma final.
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
- EX037 — Reutilização no Lamport. Explique, a partir do Laboratório L, por que assinar duas mensagens com uma chave permite a falsificação. Rubrica: 3 = argumento dos segredos revelados correto.
- EX038 — Seleção de esquema. Escolha um esquema de assinatura para (a) certificados de servidores TLS, (b) firmware dos guindastes, (c) uma raiz offline usada duas vezes por ano. Rubrica: 3 = ML-DSA; LMS/XMSS ou ML-DSA, com razões; SLH-DSA ou ML-DSA, com razões.
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.