Riepilogo
Kyber è progettato per essere implementato efficientemente sia in software che in hardware. Le sue operazioni principali sono moltiplicazioni polinomiali in R_q = Z_q[x]/(x^n + 1) con n = 256, q = 3329.
NTT — Number Theoretic Transform
La moltiplicazione in R_q è l'operazione dominante. Kyber la accelera usando NTT, l'analogo della FFT in campi finiti.
Moltiplicazione ingenua: O(n²) = 65,536 operazioni
Moltiplicazione via NTT: O(n log n) ≈ 2,048 operazioni
L'NTT in Kyber usa radici primitive dell'unità in Z_q. Poiché q = 3329 è primo e 3329 ≡ 1 (mod 512), esiste una radice primitiva di ordine 512, necessaria per NTT con n = 256.
La Trasformata
Kyber non NTT-trasforma tutti i polinomi. Un'ottimizzazione chiave è mantenere alcuni polinomi in dominio NTT (già trasformati) per evitare trasformazioni non necessarie:
Â(la matrice pubblica trasformata) viene memorizzata in dominio NTTŝ(la chiave segreta trasformata) viene anch'essa memorizzata in dominio NTT- L'incapsulamento richiede trasformare
s'al dominio NTT e ritrasformareu
Questo riduce il numero di NTT inversi necessari.
Compress e Decompress
Kyber comprime i ciphertext scartando bit di bassa magnitudine. Questo riduce la dimensione di ct ma introduce errore di compressione — errore che si somma all'errore crittografico e deve essere gestito dai parametri.
Compress_q(x, d) = ⌈(2^d / q) · x⌋ mod 2^d
Decompress_q(y, d) = ⌈(q / 2^d) · y⌋
Dove d controlla la precisione: più bit → meno errore di compressione → ciphertext più grande.
La compressione non è simmetrica: Decompress(Compress(x)) ≈ x ma non uguale. La differenza deve essere assorbita dal margine di errore dello schema.
FO Transform — Fujisaki-Okamoto
La trasformazione FO è ciò che converte un PKE (cifratura asimmetrica) insicuro contro attacchi adattivi in un KEM CCA-sicuro.
Il PKE sottostante di Kyber (senza FO) è CPA-sicuro ma non CCA-sicuro. Senza FO, un attaccante potrebbe:
- Intercettare un ciphertext
ct - Modificarlo leggermente →
ct' - Osservare se il ricevente accetta
ct'o no (oracolo di validità) - Usare quella informazione per recuperare la chiave
FO elimina questo facendo sì che la decifratura rielabori il ciphertext ricevuto e verifichi che coincida con quello che verrebbe generato da zero con la stessa moneta casuale. Se non coincide, viene restituita una chiave pseudo-casuale (non quella reale).
FO implicito vs esplicito
Kyber usa FO implicito: non restituisce un simbolo di rifiuto distinguibile, ma una chiave falsa. Questo evita attacchi di oracolo che dipendono dalla distinzione tra "fallimento" e "successo".
Decaps(sk, ct):
m' = Decrypt(sk, ct) # decifrare
(K', r') = G(m' || H(pk)) # rielaborare
ct' = Encrypt(pk, m', r') # re-cifrare
if ct' == ct:
return K' # reale
else:
return H(sk || ct) # pseudo-casuale (indistinguibile)
Campionamento Deterministico di A
La matrice A viene generata da un seed d usando SHAKE-128 come generatore di numeri casuali estendibile (XOF). Questo significa che:
Anon deve essere memorizzata nella chiave pubblica (si memorizza solo il seed, 32 byte).- Chiunque può ricostruire
Aconoscendo il seed. - La generazione è deterministica: stesso seed → stessa matrice.
Il seed è incluso in pk come parte degli 800/1184/1568 byte.
Ottimizzazioni
Software
| Tecnica | Guadagno |
|---|---|
| NTT con Montgomery reduction | Elimina divisioni, usa shift |
| Barret reduction per compressione | Alternativa più veloce della divisione |
| Vettorizzazione (AVX2, NEON) | 2-4× su CPU moderne |
| Precalcolo di tabelle NTT | Evita di ricalcolare radici |
Hardware
| Tecnica | Applicazione |
|---|---|
| Moltiplicatori paralleli | Accelerazione NTT su FPGA |
| Pipeline di SHAKE | Campionamento continuo senza pausa |
| Memoria dedicata per tabelle NTT | ASIC a basso consumo |
Implementazioni di Riferimento
| Linguaggio | Repository | Note |
|---|---|---|
| C (riferimento) | pq-crystals/kyber | L'implementazione ufficiale |
| Go | cloudflare/go (fork con CIRCL) | Cloudflare integra Kyber |
| Rust | pqcrypto-kyber | Binding al riferimento C |
| Python | pqcrypto-py | Binding, non nativa |
| JavaScript/WASM | ntt-kyber-js | Kyber compilato in WASM |
Riferimenti
- 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.
