Criptografia resistente a quântica para o ecossistema Go
filippo.io/mlkem768 é uma implementação pura em Go do ML-KEM-768, otimizada para correção e legibilidade.
- O ML-KEM é um mecanismo de troca de chaves resistente a quântica em processo de padronização pelo NIST e já adotado na maior parte da indústria.
- O pacote é composto por cerca de 500 linhas de código, 200 linhas de comentários e 650 linhas de testes, sem dependências além de
golang.org/x/crypto/sha3.
- Está previsto para ser integrado à biblioteca padrão do Go e foi projetado para oferecer alta confiança de segurança por meio de facilidade de revisão, simplicidade e testes rigorosos.
Implementação para verificação da especificação
- Ao contrário da maioria das implementações, este código não foi portado da biblioteca de referência pq-crystals e foi escrito do zero, sem ler detalhadamente outras bases de código.
- O documento FIPS 203 oferece pseudocódigo detalhado, definições rigorosas e informações de tipos consistentes, servindo como um excelente guia de implementação.
- Para aumentar a legibilidade do código e seu valor como recurso de aprendizado, os nomes de funções e variáveis, assim como a ordem das operações, foram cuidadosamente alinhados à especificação FIPS.
Álgebra linear e polinomial suficiente para implementar
- A especificação exige uma base matemática relativamente limitada, mas, para facilitar o trabalho de quem implementa, foi escrito o texto 'Álgebra linear e polinomial suficiente para implementar Kyber'.
- O restante fica como exercício para o leitor, incluindo 1) aritmética modular no primo 3329, 2) implementação concreta das funções de compressão e descompressão de [0, 3329) para [0, 2ᵈ), e 3) garantia de operações em tempo constante.
Legibilidade e valor educacional
- A legibilidade é um dos principais objetivos da implementação, permitindo revisões eficazes e atuando como recurso educacional para a próxima geração de mantenedores e engenheiros de criptografia.
- Em alguns casos, o código é tornado mais longo e menos reutilizável para aumentar a legibilidade de funções complexas.
Alta confiança de segurança por meio de testes
- Verifica-se se a geração de chaves, encapsulamento e desencapsulamento funcionam corretamente, mantendo cobertura de testes acima de 95%.
- Garante interoperabilidade com vetores de teste obtidos do NIST e de outras implementações, além de testar minuciosamente operações aritméticas básicas de campo comparando com valores esperados.
- Como parte do projeto CCTV, são publicados vetores de teste reutilizáveis por outras implementações.
Desempenho
- Desempenho não é o objetivo principal, mas o pacote precisa ser rápido o suficiente para ser útil.
- O ML-KEM é suficientemente rápido, e esta implementação simples consegue competir com implementações de P-256 e X25519 otimizadas em assembly.
- Também houve esforço para melhorar o desempenho seguindo padrões de programação em Go e minimizando alocações no heap.
Usando a implementação de ML-KEM como Kyber v3
- O NIST fez algumas pequenas alterações na submissão da Round 3 do Kyber.
- Alguns protocolos experimentais foram definidos com base no Kyber v3 (ou "draft00"), mas não há necessidade de criar um pacote separado.
- É possível usar o ML-KEM para gerar o segredo compartilhado K e depois aplicar uma derivação de chave adicional para gerar o segredo compartilhado do Kyber.
Opinião do GN⁺
- Importância da criptografia resistente a quântica: com o avanço da computação quântica, as técnicas criptográficas existentes podem se tornar vulneráveis, por isso o desenvolvimento e a padronização de tecnologias resistentes a quântica como o ML-KEM são muito importantes.
- Escalabilidade da linguagem Go: esta implementação mostra a escalabilidade e a flexibilidade da linguagem Go, além de planejar integrar a biblioteca criptográfica à biblioteca padrão, o que deve torná-la um recurso útil para a comunidade de desenvolvedores Go.
- Valor educacional: a abordagem focada em legibilidade e valor educacional deve ser de grande ajuda como recurso de aprendizado para a próxima geração de engenheiros de criptografia e desenvolvedores interessados.
1 comentários
Comentários do Hacker News
Pergunta sobre o estado atual da computação quântica
Saudações e compartilhamento da Kudelski Security
Recomendação de livro sobre sistemas criptográficos implementados em Go
Pergunta sobre implementações em outras linguagens (Java, C# etc.)
Preocupação com uma implementação pura em Go
Interesse e pergunta sobre suporte ao Kyber v3
Piada sobre a tabela de chamadas de sistema de 32 bits
Apreço pelo uso de nomes de variáveis Unicode
Elogio a outros projetos do FiloSottile
Compartilhamento do link para o documento NIST FIPS 203