Capítulo 10 — Segurança quântica e pós-quântica: orientação
Mapa da aula
Aula 10 publicada. Mapa, exemplo, EX019.
flowchart TD
N0["10.1 Normas"]
N1["10.2 A ideia por baixo do ML-KEM"]
N2["10.3 Interface e parâmetros"]
N3["10.4 Regras para implementadores"]
N4["10.5 Caso resolvido"]
N5["10.7 Assinaturas em um parágrafo"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX019"]
Desenho lógico
flowchart LR
N0["10.1 Normas"]
N1["10.2 A ideia por baixo do ML-KEM"]
N2["10.3 Interface e parâmetros"]
N3["10.4 Regras para implementadores"]
N4["10.5 Caso resolvido"]
N5["10.7 Assinaturas em um parágrafo"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX019"]
[10.1 Normas]
|
v
[10.2 A ideia por baixo do ML-KEM]
|
v
[10.3 Interface e parâmetros]
|
v
[10.4 Regras para implementadores]
|
v
[10.5 Caso resolvido]
|
v
[10.7 Assinaturas em um parágrafo]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX019]
Objetivos de aprendizagem
Você vai (1) resumir as normas pós-quânticas do NIST e a sua situação; (2) explicar o LWE com um laboratório de brinquedo; (3) descrever a interface e os conjuntos de parâmetros do ML-KEM; e (4) dizer o que os implementadores devem e não devem fazer com a PQC.
10.1 Normas
O NIST publicou a FIPS 203 (ML-KEM), a FIPS 204 (ML-DSA) e a FIPS 205 (SLH-DSA) em agosto de 2024; a SP 800-208 trata do LMS e do XMSS; a SP 800-227 dá recomendações sobre KEMs. O rascunho IR 8547 do NIST propõe tornar obsoletos os algoritmos vulneráveis ao quântico após 2030 e proibi-los após 2035. O FN-DSA e um KEM baseado no HQC estavam em desenvolvimento.
Para os implementadores da KLS, a leitura prática é: ML-KEM para o estabelecimento de chaves desde já, ML-DSA para as assinaturas conforme as ferramentas permitirem, assinaturas baseadas em hash para o firmware, e as datas do rascunho IR 8547 como premissas de planejamento até a versão final.
10.2 A ideia por baixo do ML-KEM
O Learning With Errors (Regev, 2009) esconde um segredo em equações lineares com ruído.
# Lab W (ch 10): a TOY Regev-style LWE encryption of one bit. Deliberately insecure parameters.
import random
rng = random.Random(5)
n, q, m = 16, 3329, 64
def small(): return rng.choice([-2, -1, 0, 1, 2])
s = [rng.randrange(q) for _ in range(n)]
A = [[rng.randrange(q) for _ in range(n)] for _ in range(m)]
b = [(sum(A[i][j] * s[j] for j in range(n)) + small()) % q for i in range(m)] # b = A s + e
def enc(bit):
r = [rng.randrange(2) for _ in range(m)] # random subset
u = [sum(r[i] * A[i][j] for i in range(m)) % q for j in range(n)]
v = (sum(r[i] * b[i] for i in range(m)) + bit * (q // 2)) % q
return u, v
def dec(u, v):
d = (v - sum(u[j] * s[j] for j in range(n))) % q # = bit*q/2 + small noise
return 1 if q // 4 < d < 3 * q // 4 else 0
ok = sum(dec(*enc(bit)) == bit for bit in [rng.randrange(2) for _ in range(2000)])
print(f"toy LWE: {ok}/2000 bits decrypted correctly (noise stays below q/4)")
Saída esperada:
toy LWE: 2000/2000 bits decrypted correctly (noise stays below q/4)
O brinquedo usa 16 dimensões e é trivialmente quebrável; o ML-KEM usa reticulados de módulo estruturados, com polinômios de 256 coeficientes, e uma transformação que protege contra ataques de texto cifrado escolhido.
O desenho do laboratório torna visível a regra de decifragem. O valor v do texto cifrado transporta o bit como 0 ou q/2, cerca de 1.664, mais o ruído acumulado da soma de até 64 pequenos erros escolhidos em {−2,…,2}. A decifragem subtrai u·s e pergunta se o resto está mais perto de 0 ou de q/2. Como o ruído fica muito abaixo de q/4, todos os 2.000 bits são decifrados corretamente. Faixas de erro maiores ou mais linhas somadas empurrariam o ruído para além desse limite e a decifragem começaria a falhar, o mesmo compromisso que os parâmetros do ML-KEM são escolhidos para administrar.
10.3 Interface e parâmetros
O ML-KEM é um KEM: KeyGen → (chave de encapsulamento, chave de desencapsulamento); Encaps(ek) → (texto cifrado, segredo compartilhado de 32 bytes); Decaps(dk, ct) → segredo compartilhado. O ML-KEM-512/768/1024 visa as categorias 1/3/5 do NIST, com chaves de encapsulamento de 800/1.184/1.568 bytes e textos cifrados de 768/1.088/1.568 bytes. O X25519MLKEM768 no TLS usa o ML-KEM-768.
Para os implementadores, a interface importa mais do que a matemática. O cliente gera um par de chaves e envia a chave de encapsulamento; o servidor encapsula e devolve o texto cifrado; os dois obtêm o mesmo segredo de 32 bytes. Não há etapa de cifragem de mensagens, então o ML-KEM é sempre combinado com uma cifra simétrica.
10.4 Regras para implementadores
Use bibliotecas verificadas e provedores da plataforma; nunca escreva a sua própria. Mantenha as bibliotecas atualizadas (o KyberSlash mostrou vazamentos de tempo em algumas implementações; Bernstein et al., 2024). Prefira híbridos durante a transição. Verifique os comprimentos e trate os erros sem vazar detalhes. Registre o algoritmo e as versões das bibliotecas no inventário.
Na KLS, essas regras viram perguntas de revisão em todo pull request que mexe com criptografia: qual biblioteca e versão, se ela está na lista aprovada, se o conjunto de parâmetros é explícito e o que acontece com entradas malformadas. Um pull request que responde "nós mesmos escrevemos" é fechado sem mais revisão.
10.5 Caso resolvido
Um desenvolvedor da KLS propõe um ML-KEM caseiro em Python "para os leitores". Resposta: rejeitado — a biblioteca padrão não tem o ML-KEM, o código de brinquedo é inseguro, e a imagem do fornecedor ou uma biblioteca verificada é o único caminho aceitável; enquanto isso, os fluxos de dados dos leitores são minimizados.
A etapa de minimização é concreta: os leitores enviam os manifestos num único lote diário, em vez de a cada leitura, o que reduz o volume de sessões que podem ser colhidas enquanto a imagem do fornecedor está pendente. A rejeição e o controle provisório são ambos registrados na linha do leitor no inventário, com o número do chamado do fornecedor.
10.6 Erros comuns e limites
- Tratar o laboratório de brinquedo como utilizável.
- Usar o ML-KEM como se ele cifrasse mensagens arbitrárias.
- Ignorar os avisos de atualização das bibliotecas.
Cada erro tem um sintoma reconhecível. Alguém que cola o código de 16 dimensões do Laboratório W num serviço, acreditando que é "criptografia de reticulados", entregou algo que se quebra em segundos. Alguém que chama o ML-KEM para "cifrar o manifesto" leu errado a interface: ele só produz um segredo compartilhado para uma cifra simétrica. E uma equipe que ignora avisos como o KyberSlash mantém um vazamento de tempo que uma atualização de biblioteca teria removido. A orientação aqui é propositalmente rasa; a autoridade são as próprias normas.
10.7 Assinaturas em um parágrafo
O ML-DSA (FIPS 204) é a assinatura de reticulados de uso geral, com assinaturas ML-DSA-44/65/87 de 2.420/3.309/4.627 bytes. O SLH-DSA (FIPS 205) depende apenas de funções de hash; as suas chaves públicas são minúsculas, mas as suas assinaturas vão de 7.856 a 49.856 bytes. O LMS e o XMSS (SP 800-208) são assinaturas compactas baseadas em hash que exigem que o signatário acompanhe o estado e nunca reutilize um índice. Os implementadores vão encontrar o ML-DSA primeiro nos certificados e na assinatura de código, e os esquemas baseados em hash na assinatura de firmware.
Para a KLS, isso significa ML-DSA para a AC interna e a assinatura de versões, e LMS para o firmware dos leitores somente se o HSM do fornecedor gerenciar o estado.
Exercícios
- EX019 — Tamanhos. Dê os tamanhos da chave de encapsulamento e do texto cifrado do ML-KEM-768 e o comprimento do segredo compartilhado. Rubrica: 3 = 1.184, 1.088 e 32 bytes.
- EX020 — Regras. Liste quatro regras para implementadores de PQC. Rubrica: 3 = bibliotecas verificadas, atualizações, híbridos, tratamento de comprimentos/erros.
Síntese
As normas do NIST definem as substituições; o ML-KEM é um KEM sobre reticulados de módulo, com três conjuntos de parâmetros. Os implementadores configuram implementações verificadas, nunca constroem as suas próprias.
Continue estudando — capítulo 10 de 30
← Capítulo 09 · Índice de capítulos do curso · Capítulo 11 →
Siga para a próxima lição escrita.