OpenCyber Academy
Graduação · Capítulo 17 · Português
Código do curso: OCA-113Capítulo 17: OCA-113-C017

Capítulo 17 — Conceitos de criptografia

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

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

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

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.

Respostas comentadas

EX033. Armazenamento de senhas: função de hash de senhas (por exemplo, PBKDF2 ou uma função que exige muita memória). Integridade entre servidores: HMAC-SHA-256. Acordo de chave de sessão: X25519MLKEM768 híbrido (FIPS 203 + RFC 10024). Aprovação de documentos: ML-DSA-65 (FIPS 204) ou híbrido com ECDSA durante a transição.

EX034. Cada assinatura revela um segredo por posição de bit. Os hashes de duas mensagens diferentes diferem em ~metade das posições, revelando ali os dois segredos (118/256 no Laboratório L). Um atacante pode assinar qualquer mensagem nova cujos bits de hash nas 138 posições restantes coincidam com o que foi revelado, o que exige cerca de 2^138 tentativas de hash; cada reutilização adicional reduz aproximadamente à metade as posições não coincidentes, então, depois de algumas reutilizações, as falsificações se tornam fáceis.