Mapa da aula
Aula 17 publicada. Mapa, exemplo, EX033.
flowchart TD
N0["17.1 A caixa de ferramentas"]
N1["17.2 As normas do NIST"]
N2["17.3 Atividade prática — Laboratório L"]
N3["Síntese"]
N0 --> N1 --> N2 --> N3
N3 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX033"]
Desenho lógico
flowchart LR
N0["17.1 A caixa de ferramentas"]
N1["17.2 As normas do NIST"]
N2["17.3 Atividade prática — Laboratório L"]
N3["Síntese"]
N0 --> N1 --> N2 --> N3 --> Q["EX033"]
[17.1 A caixa de ferramentas]
|
v
[17.2 As normas do NIST]
|
v
[17.3 Atividade prática — Laboratório L]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX033]
Objetivos de aprendizagem
Você vai (1) distinguir cifração simétrica, funções de hash, MACs, troca de chaves, KEMs e assinaturas; (2) explicar os níveis de segurança e as categorias pós-quânticas do NIST; (3) construir e quebrar uma assinatura de uso único de Lamport; e (4) nomear as três normas pós-quânticas finais do NIST.
17.1 A caixa de ferramentas
A cifração simétrica (AES) usa uma única chave compartilhada; as funções de hash (SHA-2, SHA-3) comprimem os dados numa impressão digital; os MACs (HMAC) provam a integridade com uma chave compartilhada; a troca de chaves (Diffie–Hellman) permite que duas partes derivem um segredo compartilhado por um canal público; um mecanismo de encapsulamento de chaves (KEM) permite que uma parte encapsule um segredo novo para a chave pública da outra; as assinaturas permitem que qualquer um verifique que o detentor de uma chave privada aprovou uma mensagem. Os computadores quânticos ameaçam a troca de chaves, a cifração de chave pública e as assinaturas baseadas em fatoração e logaritmos discretos; as primitivas simétricas e os hashes precisam, no máximo, de parâmetros maiores.
17.2 As normas do NIST
Em agosto de 2024, o NIST publicou três normas pós-quânticas: a FIPS 203, ML-KEM, um KEM baseado em reticulados com os conjuntos de parâmetros ML-KEM-512, -768 e -1024; a FIPS 204, ML-DSA, uma assinatura baseada em reticulados; e a FIPS 205, SLH-DSA, uma assinatura baseada em hash sem estado. Antes disso, a SP 800-208 havia aprovado as assinaturas baseadas em hash com estado LMS e XMSS. O NIST define as categorias de segurança 1–5 por comparação com a quebra do AES-128, do SHA-256, do AES-192, do SHA-384 e do AES-256; o ML-KEM-768 visa a categoria 3.
Para a HCU, os conjuntos de parâmetros da categoria três são o ponto de partida comum, já que oferecem uma margem confortável com tamanho moderado.
17.3 Atividade prática — Laboratório L
O esquema de Lamport assina uma mensagem revelando, para cada bit do seu hash, um de dois valores secretos cujos hashes formam a chave pública.
# Lab L (ch 17): 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 segurança se apoia apenas na função de hash, e é por isso que as assinaturas baseadas em hash são consideradas conservadoras. A reutilização é fatal: duas assinaturas revelam os dois segredos em muitas posições. O SLH-DSA constrói árvores de assinaturas de uso único e de poucos usos, para que uma única chave possa assinar muitas mensagens sem estado; o LMS e o XMSS o fazem com um estado que o signatário nunca pode repetir.
17.4 Exemplo resolvido
O arquiteto da HCU pergunta qual primitiva atende a cada necessidade: a cifração do arquivo (AES-256, manter), o transporte de chaves para o arquivo (KEM: ML-KEM-768 num híbrido), a assinatura dos extratos (ML-DSA-65 quando houver suporte, ou híbrido com ECDSA durante a transição), a assinatura do firmware dos caixas eletrônicos (LMS pela SP 800-208 ou SLH-DSA, porque o volume de assinaturas é baixo e o conservadorismo é valorizado).
Cada escolha decorre da necessidade, e não do algoritmo mais novo. A cifração simétrica fica porque a busca de Grover deixa o AES-256 forte. O transporte de chaves precisa de um KEM. As assinaturas precisam ser verificáveis enquanto a declaração assinada importar. A assinatura de firmware favorece os esquemas baseados em hash porque a sua segurança se apoia apenas nas funções de hash, e o baixo volume de assinaturas torna prático o gerenciamento do estado.
17.5 Erros comuns e limites
- Chamar o ML-KEM de "cifração"; ele é um KEM que produz um segredo compartilhado.
- Reutilizar chaves de assinatura de uso único ou com estado.
- Tratar o laboratório de Lamport de brinquedo como código utilizável.
Um KEM dá aos dois lados um segredo compartilhado; os próprios dados são então cifrados com um algoritmo simétrico. As chaves de assinatura com estado nunca podem assinar duas vezes com a mesma chave de uso único, o que significa que o signatário precisa acompanhar o estado de forma confiável, inclusive entre backups e falhas. O esquema de Lamport do laboratório existe para mostrar a ideia das assinaturas baseadas em hash; ele é inseguro na prática e nunca deve ser usado fora da sala de aula.
Exercícios
- EX033 — Escolha a primitiva. Para o armazenamento de senhas, a integridade das mensagens entre dois servidores da HCU, o acordo de chave de sessão e a aprovação de documentos, nomeie a primitiva e um algoritmo padronizado. Rubrica: 3 = quatro escolhas corretas.
- EX034 — Reutilização. Usando a saída do Laboratório L, explique por que a segunda assinatura de Lamport permite a falsificação. Rubrica: 3 = os dois segredos em muitas posições, combinados para assinar novas mensagens.
Síntese
Os computadores quânticos quebram a troca de chaves e as assinaturas de chave pública baseadas em fatoração e logaritmos discretos. As FIPS 203, 204 e 205 e a SP 800-208 do NIST fornecem os substitutos; as primitivas simétricas e de hash permanecem, com tamanhos adequados.