Como Usar Criptografia Pós-Quântica: CRYSTALS-Kyber, CRYSTALS-Dilithium e NIST PQC em Produção Já leu

O Futuro da Criptografia: A Ameaça Quântica e a Transição PQC A criptografia que protege a internet atualmente — RSA, ECDSA, ECDH — repousa em problemas matemáticos que são computacionalmente difíceis para computadores clássicos: fatoração de números grandes e logaritmo discreto. Porém, um computador quântico suficientemente poderoso, utilizando o algoritmo de Shor, poderia quebrar esses esquemas em tempo polinomial. Isso significa que todas as comunicações criptografadas hoje, se forem armazenadas, podem ser descriptografadas no futuro por um adversário com acesso a um computador quântico — uma ameaça conhecida como "harvest now, decrypt later". O National Institute of Standards and Technology (NIST) reconheceu essa vulnerabilidade crítica e, desde 2016, conduz um processo de padronização aberto para selecionar algoritmos criptográficos resistentes a ataques quânticos. Em agosto de 2022, após seis anos de análise rigorosa, o NIST anunciou os primeiros algoritmos pós-quânticos (PQC) como candidatos a padronização. Entre eles, dois algoritmos da família CRYSTALS se destacam: Kyber para encriptação e Dilithium para assinatura

O Futuro da Criptografia: A Ameaça Quântica e a Transição PQC

A criptografia que protege a internet atualmente — RSA, ECDSA, ECDH — repousa em problemas matemáticos que são computacionalmente difíceis para computadores clássicos: fatoração de números grandes e logaritmo discreto. Porém, um computador quântico suficientemente poderoso, utilizando o algoritmo de Shor, poderia quebrar esses esquemas em tempo polinomial. Isso significa que todas as comunicações criptografadas hoje, se forem armazenadas, podem ser descriptografadas no futuro por um adversário com acesso a um computador quântico — uma ameaça conhecida como "harvest now, decrypt later".

O National Institute of Standards and Technology (NIST) reconheceu essa vulnerabilidade crítica e, desde 2016, conduz um processo de padronização aberto para selecionar algoritmos criptográficos resistentes a ataques quânticos. Em agosto de 2022, após seis anos de análise rigorosa, o NIST anunciou os primeiros algoritmos pós-quânticos (PQC) como candidatos a padronização. Entre eles, dois algoritmos da família CRYSTALS se destacam: Kyber para encriptação e Dilithium para assinatura digital. Compreender esses algoritmos é essencial para profissionais que desejam construir sistemas seguros para o futuro.

Fundamentos da Criptografia Pós-Quântica

Por que Lattice-Based Cryptography?

A criptografia baseada em retículos (lattice-based cryptography) emergiu como a abordagem mais promissora para resistir a ataques quânticos. Um retículo é um conjunto discreto de pontos no espaço euclidiano que pode ser gerado por combinações lineares inteiras de vetores base. O problema fundamental é o Shortest Vector Problem (SVP): dados vetores base de um retículo, encontrar o vetor não-nulo mais curto é computacionalmente intratável mesmo para computadores quânticos, pelo menos com os algoritmos conhecidos atualmente.

A vantagem dos retículos é dupla: oferecem resistência teórica contra ataques quânticos e, simultaneamente, permitem operações eficientes no domínio clássico. Diferentemente de outros candidatos PQC (como criptografia multivariada ou baseada em código), os retículos possuem uma teoria matemática consolidada e já têm sido estudados há décadas em criptologia. Além disso, as operações envolvem multiplicações de matrizes e vetores — operações que são extremamente rápidas em processadores modernos.

O Processo NIST PQC

O NIST PQC é um projeto colaborativo internacional que seguiu um processo rigoroso de três rodadas. Na primeira rodada (2017), foram submetidos 69 candidatos. A segunda rodada (2019) estreitou para 26 candidatos. Finalmente, em 2022, o NIST selecionou Kyber e Dilithium como algoritmos principais, com Sphincs+ para assinatura baseada em hash como alternativa.

A seleção não foi arbitrária. Cada algoritmo passou por análise de segurança intensiva da comunidade criptográfica, implementações em diferentes plataformas, avaliação de desempenho, consumo de energia, tamanhos de chave e assinatura. O NIST continua aceitando submissões para outras categorias, mas Kyber e Dilithium representam os algoritmos mais maduros e com maior consenso da comunidade.

CRYSTALS-Kyber: Encriptação Resistente a Quânticos

Conceitos Fundamentais do Kyber

O Kyber é um mecanismo de encapsulamento de chave (KEM — Key Encapsulation Mechanism) baseado no problema de aprendizagem com erro (LWE — Learning With Errors). A ideia central é simples mas elegante: dados uma matriz A e um vetor b = As + e (onde s é um segredo e e é um ruído pequeno), é computacionalmente difícil recuperar s mesmo conhecendo A e b.

O Kyber define três níveis de segurança: Kyber512, Kyber768 e Kyber1024, que correspondem respectivamente a segurança equivalente a AES-128, AES-192 e AES-256. Um KEM não funciona como encriptação tradicional (plaintext → ciphertext); em vez disso, encapsula uma chave compartilhada: uma parte pública gera uma chave aleatória junto com um ciphertext encapsulado, e apenas o detentor da chave privada pode desencapsular e recuperar a chave compartilhada.

Operação do Kyber: Geração, Encapsulação e Desencapsulação

O protocolo Kyber segue três etapas essenciais:

1. Geração de chaves: Uma matriz A é amostrada aleatoriamente, junto com vetores secretos s e e. A chave pública é pk = (A, b) onde b = As + e. A chave privada é sk = s.

2. Encapsulação: Quem deseja encapsular uma chave aleatória K gera novo ruído e' e e'', calcula um ciphertext c e retorna (K, c).

3. Desencapsulação: O detentor da chave privada usa s para recuperar a mesma chave K a partir de c.

A segurança reside em dois pontos: (1) o problema LWE é resistente a ataques quânticos conhecidos, e (2) a quantidade de ruído é cuidadosamente calibrada para impedir recuperação exata do segredo.

Implementação Prática em Python

Aqui está uma implementação funcional do Kyber usando a biblioteca crystals-kyber disponível via pip:

from crystals_kyber import Kyber512

# Instanciar Kyber512
kem = Kyber512()

# Gerar par de chaves
public_key, secret_key = kem.keygen()

print(f"Tamanho da chave pública: {len(public_key)} bytes")
print(f"Tamanho da chave secreta: {len(secret_key)} bytes")

# Encapsular uma chave compartilhada
ciphertext, shared_secret_sender = kem.encaps(public_key)

print(f"Tamanho do ciphertext: {len(ciphertext)} bytes")
print(f"Tamanho da chave compartilhada: {len(shared_secret_sender)} bytes")

# Desencapsular (apenas o receptor pode fazer isso)
shared_secret_receiver = kem.decaps(secret_key, ciphertext)

# Verificar se as chaves compartilhadas são idênticas
assert shared_secret_sender == shared_secret_receiver, "Chaves não correspondem!"
print("✓ Encapsulação/Desencapsulação bem-sucedida!")

Para instalar a biblioteca:

pip install crystals-kyber

Neste exemplo, note que encaps() retorna tanto o ciphertext quanto a chave compartilhada (do lado do remetente), enquanto decaps() recupera a mesma chave usando a chave secreta. Tamanhos típicos no Kyber512: chave pública ~800 bytes, chave secreta ~1632 bytes, ciphertext ~768 bytes, chave compartilhada 32 bytes.

Aplicações Práticas do Kyber

O Kyber é ideal para estabelecer chaves compartilhadas em protocolos como TLS, VPN e sistemas de criptografia de dados em repouso (data at rest). Ao contrário de Diffie-Hellman ou ECDH, Kyber não requer interação contínua — é um mecanismo de "encapsule-and-forget" perfeito para comunicação assimétrica. Muitos provedores de nuvem já estão testando híbridos Kyber + ECDH em seus ambientes de produção, garantindo que sistemas funcionem tanto com tecnologia clássica quanto futura.

CRYSTALS-Dilithium: Assinatura Digital Pós-Quântica

Conceitos Fundamentais do Dilithium

Enquanto Kyber resolve o problema de estabelecer chaves compartilhadas, Dilithium fornece assinatura digital criptográfica. Uma assinatura digital deve satisfazer três propriedades: autenticidade (apenas o detentor da chave privada pode assinar), integridade (qualquer modificação na mensagem invalida a assinatura) e não-rejeição (o signatário não pode negar ter assinado).

Dilithium é baseado no problema de aprendizagem com erro no anel (Ring-LWE), uma variante que opera em estruturas algébricas mais eficientes. A assinatura usa uma estratégia de "rejeição": o signatário tenta gerar uma assinatura, mas se um teste de segurança falhar, rejeita e tenta novamente com novo ruído aleatório. Isso adiciona um elemento probabilístico que impede que um adversário extraia informação sobre a chave privada mesmo vendo múltiplas tentativas de assinatura.

Operação do Dilithium: Geração, Assinatura e Verificação

O protocolo Dilithium também segue três etapas:

1. Geração de chaves: Matrizes e vetores aleatórios são amostrados. A chave pública é um vetor resultado de operações sobre esses componentes. A chave privada consiste nos vetores secretos.

2. Assinatura: Dado uma mensagem m, o signatário executa um protocolo probabilístico que gera um vetor resposta z. Se z satisfaz certas condições (relacionadas ao tamanho e à norma), a assinatura é aceita; caso contrário, o processo é repetido com novo ruído.

3. Verificação: Qualquer pessoa com a chave pública pode verificar se a assinatura é válida realizando cálculos determinísticos sem conhecer a chave privada.

A elegância do Dilithium reside no fato de que cada tentativa de assinatura consome tempo pouco previsível (devido à rejeição), dificultando análises de timing por um adversário. Dilithium também oferece três níveis: Dilithium2 (AES-128), Dilithium3 (AES-192) e Dilithium5 (AES-256).

Implementação Prática em Python

Aqui está uma implementação do Dilithium usando a biblioteca crystals-dilithium:

from crystals_dilithium import Dilithium2

# Instanciar Dilithium2
sig_scheme = Dilithium2()

# Gerar par de chaves
signing_key, verifying_key = sig_scheme.keygen()

print(f"Tamanho da chave de assinatura: {len(signing_key)} bytes")
print(f"Tamanho da chave de verificação: {len(verifying_key)} bytes")

# Mensagem a assinar
message = b"Este eh um documento importante que nao pode ser alterado."

# Assinar a mensagem
signature = sig_scheme.sign(signing_key, message)

print(f"Tamanho da assinatura: {len(signature)} bytes")

# Verificar a assinatura
try:
    sig_scheme.verify(verifying_key, message, signature)
    print("✓ Assinatura verificada com sucesso!")
except AssertionError:
    print("✗ Assinatura inválida!")

# Teste de integridade: modificar a mensagem
tampered_message = b"Este eh um documento importante que FOI alterado."

try:
    sig_scheme.verify(verifying_key, tampered_message, signature)
    print("✗ Erro: assinatura não deveria ser válida para mensagem alterada!")
except AssertionError:
    print("✓ Corretamente rejeitada: mensagem foi tampered!")

Instalar:

pip install crystals-dilithium

Neste exemplo, a assinatura é especificamente ligada à mensagem. Qualquer byte alterado causará falha na verificação. Tamanhos típicos no Dilithium2: chave privada ~2544 bytes, chave pública ~1184 bytes, assinatura ~2420 bytes.

Diferenças Entre Dilithium e RSA/ECDSA

Comparado a RSA-2048 ou ECDSA P-256, Dilithium oferece assinaturas maiores mas cálculos muito mais rápidos. Uma assinatura RSA-2048 tem ~256 bytes, enquanto Dilithium2 tem ~2420 bytes — um crescimento de ~10x. Porém, o tempo de assinatura é substancialmente menor em Dilithium, especialmente em processadores sem aceleração criptográfica. Para verificação, ambos os esquemas são rápidos, mas Dilithium é mais previsível.

NIST PQC: Contexto e Plano de Transição

Cronograma e Status Atual

O processo NIST PQC começou em 2016 com objetivo claro: fornecer algoritmos que possam ser padronizados e usados em larga escala antes que computadores quânticos capazes quebrem a criptografia atual. Em agosto de 2022, o NIST publicou FIPS 203 (Kyber), FIPS 204 (Dilithium) e FIPS 205 (Sphincs+) como padrões definitivos. Paralelamente, o NIST continua pesquisando esquemas de assinatura adicionais e outros primitivos.

A expectativa é que essas especificações sejam amplamente adotadas ao longo da década de 2020. Organizações como Google, Microsoft, Amazon e IBM já estão conduzindo pilotos internos. A Agência Nacional de Segurança dos EUA (NSA) recomenda que agências federais comecem transição para PQC já agora, visando completar-se em 2033.

Estratégia de Transição: Criptografia Híbrida

Uma abordagem prudente durante a transição é usar criptografia híbrida: combinar um algoritmo clássico (como ECDH) com um algoritmo pós-quântico (como Kyber) em um mesmo protocolo. Assim, a segurança depende de ambos: mesmo que um seja quebrado no futuro, a comunicação permanece segura enquanto o outro resistir.

Exemplo conceitual em TLS 1.3 híbrido:

1. Cliente envia: ECDH_public + Kyber_public
2. Servidor responde com: ECDH_signature + Kyber_encapsulation
3. Chave de sessão = KDF(ECDH_shared_secret || Kyber_shared_secret)

Dessa forma, um adversário teria que quebrar ECDH OU Kyber (ou possivelmente ambos, dependendo da construção), ao invés de apenas um.

Implementação Híbrida Simples em Python

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
from crystals_kyber import Kyber512
import hashlib

# Chaves clássicas (ECDH P-256)
private_key_ecdh = ec.generate_private_key(ec.SECP256R1(), default_backend())
public_key_ecdh = private_key_ecdh.public_key()

# Chaves pós-quânticas (Kyber512)
kem = Kyber512()
public_key_kyber, secret_key_kyber = kem.keygen()

# Simulando encapsulação hibrida pelo "servidor"
# (em um cenário real, seria feito por ambos os lados)
ciphertext_kyber, shared_secret_kyber = kem.encaps(public_key_kyber)

# Chave compartilhada clássica (simulada)
shared_secret_ecdh = b"x" * 32  # Em produção, ECDH real

# Combinar segredos via KDF
combined = shared_secret_ecdh + shared_secret_kyber
session_key = hashlib.sha256(combined).digest()

print(f"Chave de sessão híbrida: {session_key.hex()}")
print(f"Segurança híbrida ativada!")

Este exemplo mostra o conceito: combinam-se dois segredos independentes (um clássico, um PQC) através de uma função hash, garantindo que a segurança não dependa unicamente de um algoritmo.

Candidatos Alternativos e Pesquisa Contínua

Além de Kyber e Dilithium, outros candidatos continuam em análise. Sphincs+ é uma assinatura baseada em hash que não assume nenhum problema matemático estruturado — oferece segurança "unconditional" mas com assinaturas maiores (~17KB). NTRU é um antigo candidato lattice-based que oferece ótima eficiência de espaço. Falcon é outro esquema lattice-based com assinaturas extremamente compactas.

O NIST reconhece que não existe algoritmo único "melhor" para todos os casos de uso. Portanto, espera-se que no longo prazo, diferentes algoritmos coexistam, cada um otimizado para cenários específicos (celulares com restrição de bateria, servidores em nuvem, dispositivos IoT, etc.).

Desafios Práticos e Considerações de Implementação

Compatibilidade e Integração Gradual

Um desafio significativo é a compatibilidade retroativa. Sistemas legados não entendem certificados Dilithium ou chaves Kyber. A solução mais viável é o suporte híbrido: certificados que contêm tanto a assinatura clássica quanto a PQC, TLS estendido para oferecer ambos os conjuntos de ciphersuites, etc. Isso adiciona complexidade, mas garante que sistemas antigos continuem funcionando enquanto gradualmente migramos.

A integração em OpenSSL e outras bibliotecas de criptografia padrão está em andamento. Espera-se que em 2023-2024, suporte oficial para Kyber e Dilithium apareça em versões estáveis. Portanto, profissionais devem começar estudando e testando agora, para não serem pegos desprevenidos quando a adoção acelerada começar.

Tamanho de Chaves e Criptogramas

Uma desvantagem frequentemente citada é o tamanho. Chaves Kyber públicas (~800 bytes) são maiores que ECDH (~65 bytes). Certificados X.509 contendo chaves PQC podem crescer significativamente. Para comunicações móveis ou com restrição de banda, isso é relevante. Porém, em contextos de infraestrutura ou data center, é um trade-off aceitável pela segurança futura.

Pesquisas continuam em otimizações. Variantes comprimidas de Kyber (Kyber90s) reduzem tamanhos mantendo segurança. O desenvolvimento de "trade-offs" entre segurança, velocidade e tamanho é uma área ativa.

Testes e Validação

Implementações PQC devem ser testadas contra vetores de teste oficiais fornecidos pelo NIST. A biblioteca liboqs (Open Quantum Safe) mantém implementações auditadas de múltiplos algoritmos PQC e fornece vetores de teste públicos. Para produção, recomenda-se usar apenas implementações que passaram por auditoria de segurança formal.

# Instalação de liboqs para testes robustos
git clone https://github.com/open-quantum-safe/liboqs.git
cd liboqs
mkdir build && cd build
cmake ..
make
make test

Conclusão

Os três pontos principais aprendidos neste artigo são:

  1. Criptografia pós-quântica não é ficção científica — é realidade regulatória. O NIST padronizou Kyber e Dilithium, agências governamentais já demandam transição, e a maioria das grandes empresas de tecnologia possui roadmaps para implementação. Profissionais que ignorarem PQC estarão construindo sistemas vulneráveis para adversários futuros.

  2. Kyber e Dilithium são matematicamente elegantes mas substancialmente diferentes de RSA/ECDSA em prática. O uso de retículos, ruído estruturado e rejeição probabilística cria algoritmos simultaneamente mais rápidos e maior-chave que seus antecessores. Compreender essa diferença é essencial para implementação, debugging e otimização.

  3. A transição será híbrida, não imediata. Não haverá um dia em que RSA desaparecerá; em vez disso, sistemas híbridos coexistirão por uma década ou mais. Iniciativas agora devem focar em suporte dual-stack, certificação de implementações e testes incrementais, não em substituição total.

Referências

  • NIST Post-Quantum Cryptography Standardization: https://csrc.nist.gov/projects/post-quantum-cryptography/post-quantum-cryptography-standardization

  • CRYSTALS: Cryptographic Suite for Algebraic Lattices (Artigo oficial Kyber e Dilithium): https://pq-crystals.org/

  • liboqs: Open Quantum Safe (Implementações auditadas): https://github.com/open-quantum-safe/liboqs

  • FIPS 203, 204, 205 (Padrões oficiais do NIST): https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf (Kyber como KEM)

  • Introduction to Post-Quantum Cryptography (Documento educacional): https://csrc.nist.gov/publications/detail/nistir/8105/final


Artigos relacionados