Zusammenfassung
Kyber ist darauf ausgelegt, sowohl in Software als auch in Hardware effizient implementiert zu werden. Seine Hauptoperationen sind Polynommultiplikationen in R_q = Z_q[x]/(x^n + 1) mit n = 256, q = 3329.
NTT — Number Theoretic Transform
Die Multiplikation in R_q ist die dominierende Operation. Kyber beschleunigt sie mit NTT, dem Analogon der FFT in endlichen Körpern.
Naive Multiplikation: O(n²) = 65.536 Operationen
Multiplikation via NTT: O(n log n) ≈ 2.048 Operationen
NTT in Kyber verwendet primitive Einheitswurzeln in Z_q. Da q = 3329 eine Primzahl ist und 3329 ≡ 1 (mod 512), existiert eine primitive Wurzel der Ordnung 512, die für NTT mit n = 256 benötigt wird.
Die Transformierte
Kyber NTT-transformiert nicht alle Polynome. Eine wichtige Optimierung besteht darin, einige Polynome im NTT-Bereich (bereits transformiert) zu halten, um unnötige Transformationen zu vermeiden:
Â(die transformierte öffentliche Matrix) wird im NTT-Bereich gespeichertŝ(der transformierte geheime Schlüssel) wird ebenfalls im NTT-Bereich gespeichert- Die Einkapselung erfordert die Transformation von
s'in den NTT-Bereich und die Rücktransformation vonu
Dies reduziert die Anzahl der benötigten inversen NTTs.
Compress und Decompress
Kyber komprimiert die Ciphertexts, indem es Bits niedriger Größenordnung verwirft. Dies reduziert die Größe von ct, führt aber einen Kompressionsfehler ein — einen Fehler, der sich zum kryptographischen Fehler addiert und von den Parametern verwaltet werden muss.
Compress_q(x, d) = ⌈(2^d / q) · x⌋ mod 2^d
Decompress_q(y, d) = ⌈(q / 2^d) · y⌋
Wobei d die Genauigkeit steuert: mehr Bits → weniger Kompressionsfehler → größerer Ciphertext.
Die Kompression ist nicht symmetrisch: Decompress(Compress(x)) ≈ x aber nicht gleich. Die Differenz muss von der Fehlermarge des Schemas absorbiert werden.
FO-Transform — Fujisaki-Okamoto
Der FO-Transform macht aus einem gegen adaptive Angriffe unsicheren PKE (asymmetrische Verschlüsselung) einen CCA-sicheren KEM.
Das zugrundeliegende PKE von Kyber (ohne FO) ist CPA-sicher, aber nicht CCA-sicher. Ohne FO könnte ein Angreifer:
- Einen Ciphertext
ctabfangen - Ihn leicht modifizieren →
ct' - Beobachten, ob der Empfänger
ct'akzeptiert oder nicht (Gültigkeitsorakel) - Diese Information nutzen, um den Schlüssel wiederherzustellen
FO eliminiert dies, indem die Entschlüsselung den empfangenen Ciphertext neu verarbeitet und überprüft, ob er mit dem übereinstimmt, der von Grund auf mit derselben zufälligen Münze erzeugt worden wäre. Stimmt er nicht überein, wird ein pseudozufälliger Schlüssel zurückgegeben (nicht der echte).
Impliziter vs. expliziter FO
Kyber verwendet impliziten FO: Es gibt kein unterscheidbares Zurückweisungssymbol zurück, sondern einen falschen Schlüssel. Dies vermeidet Orakelangriffe, die auf der Unterscheidung zwischen "Fehler" und "Erfolg" beruhen.
Decaps(sk, ct):
m' = Decrypt(sk, ct) # entschlüsseln
(K', r') = G(m' || H(pk)) # neu verarbeiten
ct' = Encrypt(pk, m', r') # neu verschlüsseln
if ct' == ct:
return K' # echt
else:
return H(sk || ct) # pseudozufällig (nicht unterscheidbar)
Deterministisches Sampling von A
Die Matrix A wird aus einem Seed d mit SHAKE-128 als erweiterbarer Zufallszahlengenerator (XOF) erzeugt. Das bedeutet:
Amuss nicht im öffentlichen Schlüssel gespeichert werden (nur der Seed wird gespeichert, 32 Bytes).- Jeder kann
Arekonstruieren, wenn er den Seed kennt. - Die Erzeugung ist deterministisch: gleicher Seed → gleiche Matrix.
Der Seed ist in pk als Teil der 800/1184/1568 Bytes enthalten.
Optimierungen
Software
| Technik | Gewinn |
|---|---|
| NTT mit Montgomery-Reduktion | Eliminiert Divisionen, verwendet Shifts |
| Barret-Reduktion für Kompression | Schnellere Alternative zur Division |
| Vektorisierung (AVX2, NEON) | 2-4× auf modernen CPUs |
| Vorberechnung von NTT-Tabellen | Vermeidet Neuberechnung von Wurzeln |
Hardware
| Technik | Anwendung |
|---|---|
| Parallele Multiplizierer | NTT-Beschleunigung auf FPGA |
| SHAKE-Pipeline | Kontinuierliches Sampling ohne Pause |
| Dedizierter Speicher für NTT-Tabellen | Energieeffiziente ASICs |
Referenzimplementierungen
| Sprache | Repository | Anmerkungen |
|---|---|---|
| C (Referenz) | pq-crystals/kyber | Die offizielle Implementierung |
| Go | cloudflare/go (Fork mit CIRCL) | Cloudflare integriert Kyber |
| Rust | pqcrypto-kyber | Bindings an die C-Referenz |
| Python | pqcrypto-py | Bindings, nicht nativ |
| JavaScript/WASM | ntt-kyber-js | Kyber kompiliert zu WASM |
Referenzen
- 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.
