Capítulo 14 — Segurança quântica e pós-quântica: métodos I
Mapa da aula
Aula 14 publicada. Mapa, exemplo, EX027.
flowchart TD
N0["14.1 Combinando os segredos"]
N1["14.2 Atividade prática — Laboratório C"]
N2["14.3 O X25519MLKEM768 no TLS 1.3"]
N3["14.4 Configurando um servidor de laboratório"]
N4["14.5 Caso resolvido"]
N5["14.7 Configuração do lado do cliente"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX027"]
Desenho lógico
flowchart LR
N0["14.1 Combinando os segredos"]
N1["14.2 Atividade prática — Laboratório C"]
N2["14.3 O X25519MLKEM768 no TLS 1.3"]
N3["14.4 Configurando um servidor de laboratório"]
N4["14.5 Caso resolvido"]
N5["14.7 Configuração do lado do cliente"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX027"]
[14.1 Combinando os segredos]
|
v
[14.2 Atividade prática — Laboratório C]
|
v
[14.3 O X25519MLKEM768 no TLS 1.3]
|
v
[14.4 Configurando um servidor de laboratório]
|
v
[14.5 Caso resolvido]
|
v
[14.7 Configuração do lado do cliente]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX027]
Objetivos de aprendizagem
Você vai (1) explicar como a troca de chaves híbrida combina os segredos; (2) executar um combinador de brinquedo e interpretá-lo; (3) descrever como o TLS 1.3 integra o X25519MLKEM768; e (4) configurar grupos híbridos num servidor de laboratório.
14.1 Combinando os segredos
Num híbrido, os dois componentes produzem segredos compartilhados; uma etapa de derivação de chaves os combina com o contexto, de modo que o resultado é seguro se qualquer um dos componentes for. A SP 800-227 discute a combinação de KEMs; o TLS concatena os segredos e os alimenta na sua programação de chaves baseada no HKDF.
O Laboratório C torna a propriedade visível: mude qualquer um dos segredos sozinho e a saída muda por completo, então um atacante que quebra só o X25519 ou só o ML-KEM continua sem a chave. Vincular o transcript impede que os mesmos segredos produzam a mesma chave em outro handshake.
14.2 Atividade prática — Laboratório C
# Lab C (ch 14): a hybrid key combiner. The session key depends on BOTH shared secrets.
import hashlib, hmac
def hkdf_extract(salt, ikm): return hmac.new(salt, ikm, hashlib.sha256).digest()
def combine(ss_pq, ss_trad, context):
# Concatenate secrets (PQ first, as in X25519MLKEM768), bind the transcript/context, then extract.
return hkdf_extract(b"\x00" * 32, ss_pq + ss_trad + context).hex()[:16]
pq, trad, ctx = b"P" * 32, b"T" * 32, b"handshake-transcript-hash"
print("baseline ", combine(pq, trad, ctx))
print("PQ secret changed ", combine(b"Q" * 32, trad, ctx))
print("traditional changed ", combine(pq, b"U" * 32, ctx))
print("context changed ", combine(pq, trad, b"other-transcript"))
Saída esperada:
baseline d48e982e8c06ca60
PQ secret changed d4c36ea2d90b2e9c
traditional changed 8dcefa12ded3d99c
context changed af06eca8abcd45a9
Leia as quatro linhas como um teste das três entradas do combinador. A chave de referência d48e982e8c06ca60 muda quando muda o segredo pós-quântico, quando muda o segredo tradicional e quando muda apenas o contexto, e nenhuma das saídas alteradas se parece com a de referência. É isso que "seguro se qualquer um dos componentes for" exige: um atacante que recupera o segredo do X25519 ainda enfrenta um segredo ML-KEM desconhecido, e a saída não dá nenhuma pista de qual entrada foi alterada. O truncamento em 16 dígitos hexadecimais do laboratório serve apenas para exibição; o TLS usa a saída completa do HKDF.
14.3 O X25519MLKEM768 no TLS 1.3
A RFC 10024 define o grupo: o cliente envia uma chave de encapsulamento ML-KEM-768 seguida de uma chave pública X25519 (1.216 bytes); o servidor devolve um texto cifrado ML-KEM seguido do seu key share X25519 (1.120 bytes); o segredo compartilhado é o segredo do ML-KEM concatenado com o segredo do X25519. Se um cliente envia apenas key shares clássicos, um servidor que prefere o híbrido pode responder com um HelloRetryRequest pedindo o key share híbrido, acrescentando uma ida e volta; ajuste as previsões de key share dos clientes de acordo.
A ordem dentro do key share importa para os implementadores que leem capturas: a parte ML-KEM vem primeiro nos dois sentidos, ao contrário de alguns híbridos de rascunhos anteriores. O analisador de laboratório da KLS verifica o comprimento do key share, 1.216 ou 1.120 bytes, para classificar um handshake capturado como híbrido.
14.4 Configurando um servidor de laboratório
Nos servidores baseados no OpenSSL, a lista de grupos é configurável, por exemplo Groups = X25519MLKEM768:X25519:secp256r1 num arquivo de configuração do OpenSSL ou uma diretiva no estilo de ssl_ecdh_curve num servidor web. A ordem importa: a preferência do servidor decide o resultado quando o cliente oferece vários. Os key shares padrão do OpenSSL 3.5 incluem o X25519MLKEM768 (NEWS do OpenSSL 3.5). Consulte a documentação do seu produto para a sintaxe exata.
Para o ingress NGINX da KLS, a configuração é ssl_ecdh_curve X25519MLKEM768:X25519;, que só funciona se o OpenSSL da imagem conhecer o nome do grupo; numa biblioteca mais antiga, o NGINX se recusa a iniciar, o que é uma falha útil em homologação. A sintaxe varia por produto, então a KLS mantém um trecho testado por produto no repositório central de perfis.
14.5 Caso resolvido
Ingress de homologação da KLS: grupos definidos como X25519MLKEM768:X25519. O cliente de teste A (OpenSSL 3.5) negocia o híbrido; o cliente de teste B (biblioteca mais antiga) negocia o X25519. Uma lista mal ordenada, X25519:X25519MLKEM768, fez os dois escolherem o X25519 — oferecido, nunca selecionado.
O caso mal ordenado é o instrutivo. Os dois clientes suportavam o grupo híbrido, o servidor o listava e nada falhou; a preferência do servidor simplesmente escolheu o X25519. Só uma verificação do grupo negociado, e não da lista configurada, o revelou. A regra "híbrido oferecido mas não preferido" do Laboratório T da KLS existe por causa dessa execução.
14.6 Erros comuns e limites
- Híbrido listado, mas não preferido.
- Esquecer a latência do HelloRetryRequest.
- Copiar a sintaxe de posts de blog sem conferir as versões.
O primeiro erro é o caso do portal que o Laboratório T, no Capítulo 17, detecta: híbrido presente, nunca escolhido. O segundo aparece como latência: um cliente que prevê apenas o X25519 encontra um servidor que prefere o híbrido e paga uma ida e volta a mais, visível no percentil 99 dos caminhos móveis. O terceiro atingiu a KLS quando o nome de grupo de um híbrido de rascunho, tirado de um blog, foi copiado para um perfil de produção; a biblioteca o rejeitou e o ingress não iniciou em homologação. Cada um é apanhado verificando a negociação, o tempo e a versão, não lendo a configuração.
14.7 Configuração do lado do cliente
Os servidores são só metade da negociação. Os clientes escolhem quais key shares enviar primeiro, e uma previsão errada custa a ida e volta a mais descrita na Seção 14.3. Os navegadores modernos e as bibliotecas atuais enviam o key share híbrido por padrão. Para os SDKs próprios e os clientes internos da KLS, defina a lista de grupos explicitamente no código ou na configuração, teste contra o gateway de homologação e registre a versão da biblioteca nas notas de versão, para que os clientes saibam quais versões do SDK negociam a troca de chaves híbrida. O SDK em Go da KLS, por exemplo, define a lista de grupos na sua própria configuração TLS, de modo que um cliente que atualiza o SDK recebe o key share híbrido sem mudar nenhuma linha de código.
Exercícios
- EX027 — Raciocínio sobre o combinador. Usando o Laboratório C, explique por que mudar apenas o contexto muda a chave e por que isso importa. Rubrica: 3 = vinculação ao transcript, impede a reutilização entre sessões.
- EX028 — Defeito de ordem. Explique como um servidor pode listar um grupo híbrido e, ainda assim, nunca negociá-lo. Rubrica: 3 = ordem de preferência ou suporte do cliente.
Síntese
A troca de chaves híbrida concatena e deriva os segredos para que qualquer um dos componentes proteja a sessão. No TLS 1.3, ela é um único grupo configurável; a ordem e o suporte do cliente decidem se ela é usada.
Continue estudando — capítulo 14 de 30
← Capítulo 13 · Índice de capítulos do curso · Capítulo 15 →
Siga para a próxima lição escrita.