Résumé
Kyber est conçu pour être implémenté efficacement tant en logiciel qu'en matériel. Ses opérations principales sont des multiplications polynomiales dans R_q = Z_q[x]/(x^n + 1) avec n = 256, q = 3329.
NTT — Number Theoretic Transform
La multiplication dans R_q est l'opération dominante. Kyber l'accélère en utilisant NTT, l'analogue de la FFT dans les corps finis.
Multiplication naïve : O(n²) = 65 536 opérations
Multiplication via NTT : O(n log n) ≈ 2 048 opérations
Le NTT dans Kyber utilise des racines primitives de l'unité dans Z_q. Comme q = 3329 est premier et 3329 ≡ 1 (mod 512), il existe une racine primitive d'ordre 512, nécessaire pour NTT avec n = 256.
La Transformée
Kyber ne NTT-transforme pas tous les polynômes. Une optimisation clé est de maintenir certains polynômes en domaine NTT (déjà transformés) pour éviter des transformations inutiles :
Â(la matrice publique transformée) est stockée dans le domaine NTTŝ(la clé secrète transformée) est également stockée dans le domaine NTT- L'encapsulation nécessite de transformer
s'dans le domaine NTT et de retransformeru
Cela réduit le nombre de NTT inverses nécessaires.
Compress et Decompress
Kyber comprime les ciphertexts en supprimant les bits de faible magnitude. Cela réduit la taille de ct mais introduit une erreur de compression — une erreur qui s'ajoute à l'erreur cryptographique et doit être gérée par les paramètres.
Compress_q(x, d) = ⌈(2^d / q) · x⌋ mod 2^d
Decompress_q(y, d) = ⌈(q / 2^d) · y⌋
Où d contrôle la précision : plus de bits → moins d'erreur de compression → ciphertext plus grand.
La compression n'est pas symétrique : Decompress(Compress(x)) ≈ x mais pas égal. La différence doit être absorbée par la marge d'erreur du schéma.
FO Transform — Fujisaki-Okamoto
La transformation FO est ce qui convertit un PKE (chiffrement asymétrique) non sécurisé contre les attaques adaptatives en un KEM CCA-sécurisé.
Le PKE sous-jacent de Kyber (sans FO) est CPA-sécurisé mais pas CCA-sécurisé. Sans FO, un attaquant pourrait :
- Intercepter un ciphertext
ct - Le modifier légèrement →
ct' - Observer si le récepteur accepte
ct'ou non (oracle de validité) - Utiliser cette information pour récupérer la clé
FO élimine cela en faisant en sorte que le déchiffrement retraite le ciphertext reçu et vérifie qu'il correspond à celui qui serait généré à partir de zéro avec la même monnaie aléatoire. Si ça ne correspond pas, une clé pseudo-aléatoire est retournée (pas la vraie).
FO implicite vs explicite
Kyber utilise FO implicite : il ne retourne pas un symbole de rejet distinguable, mais une fausse clé. Cela évite les attaques d'oracle qui dépendent de la distinction entre "échec" et "succès".
Decaps(sk, ct) :
m' = Decrypt(sk, ct) # déchiffrer
(K', r') = G(m' || H(pk)) # retraiter
ct' = Encrypt(pk, m', r') # re-chiffrer
if ct' == ct :
return K' # réelle
else :
return H(sk || ct) # pseudo-aléatoire (indistinguable)
Échantillonnage Déterministe de A
La matrice A est générée à partir d'une graine d en utilisant SHAKE-128 comme générateur de nombres aléatoires extensible (XOF). Cela signifie que :
An'a pas besoin d'être stockée dans la clé publique (seule la graine est stockée, 32 bytes).- N'importe qui peut reconstruire
Aen connaissant la graine. - La génération est déterministe : même graine → même matrice.
La graine est incluse dans pk comme faisant partie des 800/1184/1568 bytes.
Optimisations
Logiciel
| Technique | Gain |
|---|---|
| NTT avec réduction de Montgomery | Élimine les divisions, utilise des décalages |
| Réduction de Barrett pour la compression | Alternative plus rapide que la division |
| Vectorisation (AVX2, NEON) | 2-4× sur CPUs modernes |
| Précalcul des tables NTT | Évite de recalculer les racines |
Matériel
| Technique | Application |
|---|---|
| Multiplicateurs parallèles | Accélération NTT sur FPGA |
| Pipeline SHAKE | Échantillonnage continu sans pause |
| Mémoire dédiée pour tables NTT | ASICs à faible consommation |
Implémentations de Référence
| Langage | Dépôt | Notes |
|---|---|---|
| C (référence) | pq-crystals/kyber | L'implémentation officielle |
| Go | cloudflare/go (fork avec CIRCL) | Cloudflare intègre Kyber |
| Rust | pqcrypto-kyber | Bindings vers la référence C |
| Python | pqcrypto-py | Bindings, pas natif |
| JavaScript/WASM | ntt-kyber-js | Kyber compilé en WASM |
Références
- Bos, J. et al. (2018). "CRYSTALS-Kyber: A CCA-Secure Module-Lattice-Based KEM."
- Alkim, E. et al. (2020). "The Number Theoretic Transform and Its Applications in Lattice-Based Cryptography."
- Montgomery, P. (1985). "Modular Multiplication Without Trial Division." Mathematics of Computation.
