PQC Status
Guia

ML-KEM vs Kyber: o que mudou entre o rascunho e o FIPS 203

Os grupos Kyber pré-padrão não interoperam com o ML-KEM. Veja exatamente o que verificar nas suas bibliotecas, na sua configuração TLS e no seu parque SSH.

· 7 min

CRYSTALS-Kyber e ML-KEM não são dois algoritmos. O ML-KEM é a forma padronizada do CRYSTALS-Kyber, publicada pelo NIST como FIPS 203 em 13 de agosto de 2024. A mudança não é cosmética: o FIPS 203 é uma especificação com seus próprios nomes de conjuntos de parâmetros, seus próprios formatos de chave e suas próprias regras de validação, e uma implementação da submissão original da competição não interopera com uma implementação de ML-KEM. No TLS, é por isso que o grupo pré-padrão X25519Kyber768Draft00 (codepoint 0x6399) está obsoleto e precisa ser substituído pelos grupos ML-KEM.

Um design, dois nomes, uma especificação aprovada

Um KEM (key encapsulation mechanism, mecanismo de encapsulamento de chave) é o componente de um handshake que permite a duas partes acordar um segredo compartilhado. CRYSTALS-Kyber era o nome do KEM baseado em reticulados submetido ao processo de padronização pós-quântica do NIST. Quando o NIST publicou o padrão final, o algoritmo foi renomeado ML-KEM, abreviação de Module-Lattice-Based Key-Encapsulation Mechanism, e especificado no FIPS 203. Ele foi publicado no mesmo dia que o FIPS 204 (ML-DSA, assinaturas) e o FIPS 205 (SLH-DSA, assinaturas baseadas em hash sem estado).

Em uma conversa, Kyber e ML-KEM se referem à mesma família de designs. Em código, em uma lista de grupos ou em um documento de conformidade, eles não são intercambiáveis. Somente o ML-KEM conforme especificado no FIPS 203 é um padrão aprovado. Tudo o que ainda está rotulado como Kyber, Kyber768 ou Draft00 é anterior a ele. Nossa página de referência sobre ML-KEM acompanha o padrão e seu status, e a página sobre o rascunho Kyber acompanha os grupos pré-padrão que agora devem ser removidos das configurações.

O que a passagem do rascunho ao padrão final mudou

O FIPS 203 foi divulgado como rascunho público inicial para comentários antes de o NIST publicar o texto final. Três categorias de mudança importam para um engenheiro ou um arquiteto.

Nomes e conjuntos de parâmetros

Kyber512, Kyber768 e Kyber1024 tornaram-se ML-KEM-512, ML-KEM-768 e ML-KEM-1024. O FIPS 203 especifica exatamente esses três conjuntos de parâmetros. Uma opção de build, uma constante ou um vetor de teste que ainda traz um nome Kyber é um sinal de que o código não foi atualizado, e não simplesmente de que alguém manteve um rótulo antigo.

Detalhes de especificação que quebram a interoperabilidade

O padrão final difere da submissão original da competição em detalhes de especificação que incluem a geração de chaves, a codificação de chaves e a derivação do segredo compartilhado. Esses detalhes são normativos no FIPS 203 e devem ser lidos diretamente nele, e não em resumos de segunda mão. A consequência prática é simples e absoluta: um par que executa Kyber pré-padrão e um par que executa ML-KEM não derivarão o mesmo segredo compartilhado. Não há negociação entre eles, nem caminho de downgrade, nem compatibilidade parcial. O handshake falha, ou o grupo simplesmente nunca é selecionado.

Regras que uma implementação precisa seguir

O FIPS 203 também especifica verificações que uma implementação realiza sobre o material de chave recebido antes de usá-lo, e define o comportamento do desencapsulamento quando a entrada não é válida (rejeição implícita, que retorna um segredo compartilhado pseudoaleatório em vez de um erro). Os autores de bibliotecas carregam a maior parte desse peso. Para quem consome uma biblioteca, a lição é preferir uma implementação mantida que declare conformidade com o FIPS 203 a uma cópia do código de referência do período da competição, e verificar as notas de versão em vez do nome do algoritmo.

Os três conjuntos de parâmetros: 512, 768 e 1024

O FIPS 203 define os três conjuntos de parâmetros em relação às categorias de segurança do NIST. O número não é um tamanho de chave em bits: é um rótulo do conjunto de parâmetros.

Conjunto de parâmetrosCategoria de segurança NISTOnde aparece na prática
ML-KEM-512Categoria 1Registrado como grupo TLS puro (codepoint 512). Raramente implantado isoladamente para tráfego web público.
ML-KEM-768Categoria 3A escolha de facto do ecossistema: X25519MLKEM768 nos navegadores, mlkem768x25519-sha256 no OpenSSH.
ML-KEM-1024Categoria 5Exigido pelo NSA CNSA 2.0 para os National Security Systems dos EUA. Combinado com P-384 em SecP384r1MLKEM1024.

Para TLS e SSH de uso geral, o ML-KEM-768 dentro de uma construção híbrida é onde o ecossistema convergiu. Se você opera sistemas no escopo do NSA CNSA 2.0, a suíte especifica ML-KEM-1024 junto com ML-DSA-87, LMS ou XMSS, AES-256 e SHA-384 ou SHA-512, com uso exclusivo esperado até o fim de 2030 para assinatura de software e firmware e equipamentos de rede tradicionais, e até o fim de 2033 para navegadores e servidores web, serviços em nuvem e sistemas operacionais. Outras autoridades apresentam suas posições como recomendações: a BSI TR-02102-1 recomenda o acordo de chaves pós-quântico híbrido, e a ANSSI torna a hibridização obrigatória dentro do seu escopo regulado, ao mesmo tempo em que afirma que suas recomendações pós-quânticas ainda não são obrigações regulatórias fora dele. Este artigo é informativo e não constitui aconselhamento jurídico.

Grupos TLS: o que é atual, o que é obsoleto

O grupo nomeado é a parte visível de tudo isso. Somente os codepoints abaixo existem no registro da IANA para ML-KEM, e apenas um deles é a entrada pré-padrão obsoleta.

GrupoCodepointStatus
X25519Kyber768Draft000x6399Kyber pré-padrão. Obsoleto. Remova-o.
X25519MLKEM7680x11EC (4588)Híbrido. Oferecido por padrão pelas versões atuais do Chrome, Edge e Firefox.
SecP256r1MLKEM7680x11EB (4587)Híbrido, para stacks padronizadas em curvas NIST.
SecP384r1MLKEM10240x11ED (4589)Híbrido, perfil de categoria 5.
MLKEM512 / MLKEM768 / MLKEM1024512 / 513 / 514ML-KEM puro, sem componente clássico. Não é um padrão para servidores web públicos hoje.

Os grupos híbridos combinam um acordo de chaves clássico com o ML-KEM, de modo que a sessão permanece pelo menos tão forte quanto a parte clássica caso uma fraqueza seja encontrada na construção em reticulados, e ganha proteção pós-quântica contra tráfego gravado. Essa combinação é descrita para o TLS 1.3 no RFC 10024 (agosto de 2026). O tráfego gravado é protegido apenas pela troca de chaves, e é por isso que o acordo de chaves migra primeiro e os certificados podem vir depois. A página sobre X25519MLKEM768 detalha o grupo que a maioria dos servidores deve habilitar primeiro.

O que verificar em bibliotecas, servidores e SSH

Execute primeiro verificações somente leitura, em um host de homologação, antes de tocar em uma configuração de produção.

OpenSSL

O OpenSSL 3.5 ou posterior é necessário para os grupos TLS ML-KEM. Um branch mais antigo ainda pode anunciar um grupo de rascunho Kyber por meio de um provider ou de um patch da distribuição: é esse o caso a encontrar e remover.

openssl version
openssl list -tls-groups | grep -i mlkem
openssl s_client -connect example.com:443 -groups X25519MLKEM768

Na saída do s_client, leia o grupo negociado. Se a conexão falhar com um erro de handshake enquanto um grupo clássico funciona, o servidor ainda não oferece suporte ao ML-KEM.

Configuração do servidor

Mantenha sempre um fallback clássico após o grupo híbrido para que clientes mais antigos continuem se conectando. No nginx compilado com OpenSSL 3.5 ou posterior:

ssl_ecdh_curve X25519MLKEM768:X25519:secp256r1;

A sintaxe e os valores suportados variam entre servidores e entre builds de distribuições, portanto verifique na sua própria versão. Nosso guia para habilitar o ML-KEM no nginx, Apache, HAProxy e Caddy apresenta a diretiva de cada um.

SSH

O OpenSSH 9.9 (19 de setembro de 2024) adicionou mlkem768x25519-sha256, disponível por padrão. O OpenSSH 10.0 (9 de abril de 2025) o tornou o acordo de chaves padrão, e o OpenSSH 10.1 (6 de outubro de 2025) emite um aviso quando uma conexão negocia um acordo de chaves que não é pós-quântico, por meio da opção WarnWeakCrypto, habilitada por padrão. Versões anteriores, a partir do OpenSSH 9.0, usam por padrão o híbrido sntrup761x25519-sha512@openssh.com, que é pós-quântico, mas não é ML-KEM.

ssh -V
ssh -Q kex | grep mlkem

Código da aplicação e dependências

Verifique o que seus servidores realmente negociam

A forma mais rápida de saber se um domínio está no padrão ou ainda em um grupo de rascunho é observar o que ele oferece na rede. Você pode escanear seu domínio com o PQC Status gratuitamente: o scanner informa os grupos ML-KEM híbridos que um servidor aceita, as versões de TLS e as cipher suites, além da cadeia de certificados. Um scan descreve apenas a configuração TLS visível externamente. Não é uma certificação nem um atestado de conformidade. O próximo passo concreto para este tema: confirme que cada endpoint público oferece X25519MLKEM768 com um fallback clássico e, em seguida, remova qualquer referência restante ao grupo Kyber pré-padrão da sua configuração e do seu inventário.

Perguntas frequentes

Kyber é a mesma coisa que ML-KEM?

O ML-KEM é a forma padronizada do CRYSTALS-Kyber, especificada pelo NIST no FIPS 203 e publicada em 13 de agosto de 2024. Ambos descrevem o mesmo design subjacente baseado em reticulados, mas somente o ML-KEM conforme definido no FIPS 203 é o padrão aprovado. Em código e em configuração, trate os dois nomes como coisas diferentes: um rótulo Kyber geralmente indica código pré-padrão.

Uma implementação Kyber pré-padrão consegue se comunicar com uma implementação ML-KEM?

Não. A especificação final do FIPS 203 difere da submissão original da competição em detalhes que incluem a codificação de chaves e a derivação do segredo compartilhado, portanto os dois lados não derivarão o mesmo segredo compartilhado. Não há caminho de downgrade nem compatibilidade parcial entre eles. No TLS, isso aparece como um grupo que simplesmente nunca é selecionado, ou como um handshake que falha.

Qual conjunto de parâmetros do ML-KEM devemos implantar?

Para TLS e SSH de uso geral, o ML-KEM-768 dentro de um grupo híbrido é onde o ecossistema convergiu: X25519MLKEM768 nos navegadores e mlkem768x25519-sha256 no OpenSSH. Para sistemas no escopo do NSA CNSA 2.0, a suíte especifica ML-KEM-1024. Registre o conjunto de parâmetros exato no seu inventário criptográfico, e não apenas o nome do algoritmo.

Precisamos remover X25519Kyber768Draft00 da nossa configuração?

Sim. É o grupo Kyber pré-padrão, codepoint 0x6399, e está obsoleto. Os navegadores atuais oferecem X25519MLKEM768 em seu lugar, portanto manter o grupo de rascunho não oferece nenhuma proteção pós-quântica para clientes modernos e ainda deixa evidências enganosas no seu inventário. Substitua-o pelos grupos ML-KEM e mantenha um grupo clássico, como X25519, como fallback.