Criptografía resistente a la computación cuántica para el ecosistema Go
filippo.io/mlkem768 es una implementación pura en Go de ML-KEM-768, optimizada para la corrección y la legibilidad.
- ML-KEM es un mecanismo de intercambio de claves resistente a la computación cuántica que está en proceso de estandarización por parte de NIST y ya se está adoptando en gran parte de la industria.
- El paquete está compuesto por unas 500 líneas de código, 200 líneas de comentarios y 650 líneas de pruebas, y no tiene dependencias salvo
golang.org/x/crypto/sha3.
- Está previsto que se integre en la biblioteca estándar de Go, y fue diseñado para ofrecer un alto nivel de confianza en su seguridad mediante facilidad de revisión, simplicidad y pruebas exhaustivas.
Una implementación para validar la especificación
- A diferencia de la mayoría de las implementaciones, este código no fue portado desde la biblioteca de referencia pq-crystals, sino que fue escrito desde cero sin leer en detalle otras bases de código.
- El documento FIPS 203 es una excelente guía de implementación, ya que ofrece seudocódigo detallado, definiciones exhaustivas e información de tipos consistente.
- Para aumentar la legibilidad del código y su valor como recurso de aprendizaje, los nombres de funciones y variables, así como el orden de las operaciones, se eligieron cuidadosamente para ajustarse a la especificación FIPS.
Suficiente polinomios y álgebra lineal para implementar
- La especificación requiere un trasfondo matemático relativamente limitado, pero para facilitar el trabajo de quien implemente, se escribió "Sufficient Polynomials and Linear Algebra to Implement Kyber".
- El resto queda como ejercicio para la persona lectora: 1) aritmética modular sobre el primo 3329, 2) implementación concreta de las funciones de compresión y descompresión de [0, 3329) a [0, 2ᵈ), 3) garantía de operaciones en tiempo constante.
Legibilidad y valor educativo
- La legibilidad es uno de los principales objetivos de la implementación, ya que permite revisiones efectivas y sirve como recurso educativo para la próxima generación de responsables de mantenimiento e ingenieros de criptografía.
- En algunos casos, para mejorar la legibilidad de funciones complejas, el código se hace más largo y menos reutilizable.
Alta confianza en la seguridad mediante pruebas
- Se verifica que la generación de claves, la encapsulación y la desencapsulación se realicen correctamente, y se mantiene una cobertura de pruebas superior al 95%.
- Se garantiza la interoperabilidad con vectores de prueba obtenidos de NIST y de otras implementaciones, y también se prueban exhaustivamente las operaciones aritméticas básicas de campos comparándolas con valores esperados.
- Como parte del proyecto CCTV, se publican vectores de prueba reutilizables por otras implementaciones.
Rendimiento
- El rendimiento no es el objetivo principal, pero el paquete necesita ser lo bastante rápido como para resultar útil.
- ML-KEM es suficientemente rápido, y esta implementación simple puede competir con implementaciones de P-256 y X25519 optimizadas en ensamblador.
- También se hicieron esfuerzos para mejorar el rendimiento siguiendo patrones de programación de Go y minimizando las asignaciones en el heap.
Usar una implementación de ML-KEM como Kyber v3
- NIST hizo algunos cambios menores a la propuesta Round 3 de Kyber.
- Algunos protocolos experimentales están definidos sobre Kyber v3 (o "draft00"), pero no hace falta crear un paquete separado.
- Se puede usar ML-KEM para generar el secreto compartido K y luego aplicar una derivación de clave adicional para generar el secreto compartido de Kyber.
Opinión de GN⁺
- Importancia de la criptografía resistente a la computación cuántica: con el avance de la computación cuántica, las técnicas de cifrado actuales podrían volverse vulnerables, por lo que el desarrollo y la estandarización de tecnologías resistentes a la computación cuántica como ML-KEM son muy importantes.
- Escalabilidad del lenguaje Go: esta implementación muestra la escalabilidad y flexibilidad de Go, y el plan de integrar una biblioteca criptográfica en la biblioteca estándar la convertirá en un recurso útil para la comunidad de desarrolladores de Go.
- Valor educativo: el enfoque centrado en la legibilidad del código y su valor educativo será de gran ayuda como recurso de aprendizaje para la próxima generación de ingenieros de criptografía y desarrolladores interesados.
1 comentarios
Comentarios en Hacker News
Pregunta sobre el estado actual de la computación cuántica
Saludos y aporte de Kudelski Security
Recomendación de un libro sobre sistemas criptográficos implementados en Go
Pregunta sobre implementaciones en otros lenguajes (Java, C#, etc.)
Preocupación por una implementación pura en Go
Interés y pregunta sobre el soporte para Kyber v3
Broma sobre la tabla de llamadas al sistema de 32 bits
Aprecio por el uso de nombres de variables con Unicode
Elogio a otro proyecto de FiloSottile
Se comparte el enlace al documento NIST FIPS 203