Procedimenti di firma

ML-DSA-87 spiegato matematicamente

Come ML-DSA-87 (FIPS 204) firma una recensione di McGesund — da Module-LWE al rejection sampling fino alla verifica nel browser.

Aggiornato: 2026-09-07

1. Di che cosa si tratta

Quando qualcuno lascia una recensione su McGesund, sullo sfondo accade più di quanto il testo lasci supporre. Al momento dell'invio la recensione viene firmata digitalmente. Questa firma ogni visitatore può ricalcolarla in seguito nel proprio browser — senza fidarsi di noi e senza chiedere a noi.

Per i clienti a partire dal piano Pro ciò avviene tra l'altro con ML-DSA-87. Questo contributo spiega che cosa accade matematicamente.

Una precisazione preliminare:

ML-DSA non è una cifratura. Il testo della recensione resta leggibile pubblicamente — è proprio questo il senso di una recensione. ML-DSA non dimostra la riservatezza, bensì origine e integrità.

ML-DSA è stato sviluppato a partire da CRYSTALS-Dilithium ed è standardizzato come FIPS 204. Il numero 87 indica il livello di parametri. Ce ne sono tre:

  • ML-DSA-44
  • ML-DSA-65
  • ML-DSA-87

ML-DSA-87 è il più alto e si colloca nella categoria di sicurezza NIST 5.


2. Che cosa viene firmato esattamente?

Nella firma non entra il testo della recensione in sé, bensì un oggetto dati compatto che fissa il testo in modo univoco. In McGesund nella sostanza si presenta così:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<ID azienda>",
  "c":   "<ID recensione>",
  "h":   "<SHA-256 del testo della recensione>",
  "rh":  "<SHA-256 dell'intero record inviato>",
  "rv":  1,
  "qh":  "<SHA-256 dell'envelope QR, solo per recensioni via QR>",
  "iat": 1757203200
}

Questo oggetto è il nostro messaggio mm. Lega insieme sei affermazioni:

  1. A quale azienda appartiene la recensione (f)
  2. Quale recensione si intende (c)
  3. Quale testo vi stava dietro — come valore hash (h)
  4. Quale record nel suo insieme è stato inviato (rh): testo, cuori, stato geografico e indicazioni sull'occasione, serializzati canonicamente e sottoposti a hash — nella versione di schema rv
  5. Da quale QR code proviene la recensione (qh); senza QR il campo decade
  6. Quando è stata apposta la firma (iat)

Se qualcuno modifica in seguito un solo carattere del testo della recensione, h non torna più — e nemmeno rh. Chi invece ritocca soltanto i cuori lascia h intatto, ma rompe rh. Se qualcuno modifica uno di questi valori hash, la firma non torna più. È esattamente questa catena il punto.


3. Che cosa deve garantire la firma

Un visitatore che legge la recensione deve poter verificare da sé tre cose:

  1. La recensione è stata effettivamente emessa da McGesund.
  2. Il testo non è stato modificato dopo l'invio.
  3. Nessuno può inventare una nuova recensione dall'aspetto valido.

A tal fine esiste una coppia di chiavi:

  • una chiave privata — si trova esclusivamente nel servizio di firma
  • una chiave pubblica — può averla chiunque, viene indirizzata tramite l'ID chiave (kid) nell'envelope

Si firma con la chiave privata. Si verifica con quella pubblica — e precisamente nel browser del lettore, non sul nostro server.


4. Perché un procedimento post-quantistico?

Molti procedimenti di firma oggi consueti si fondano sulla fattorizzazione di grandi numeri o sui logaritmi discreti. Un computer quantistico sufficientemente potente potrebbe risolvere proprio questi problemi in modo notevolmente più rapido con algoritmi noti.

Per una recensione non è una questione accademica. Una recensione deve essere verificabile ancora fra dieci anni. Chi firma oggi, firma per l'intera vita della voce.

ML-DSA usa perciò un fondamento diverso:

problemi reticolari\boxed{\text{problemi reticolari}}

Più precisamente: Module-LWE e Module-SIS.


5. Che cos'è un reticolo?

Dapprima solo punti nello spazio. Prendiamo due vettori:

b1=(2,0),b2=(1,2).b_1=(2,0), \qquad b_2=(1,2).

Tutte le combinazioni a coefficienti interi

ab1+bb2,a,bZa\,b_1+b\,b_2, \qquad a,b\in\mathbb{Z}

formano il reticolo. Per esempio:

2b1+b2=(4,0)+(1,2)=(5,2).2b_1+b_2 = (4,0)+(1,2) = (5,2).
b₁ = (2,0)b₂ = (1,2)(5,2)0
Due vettori, tutte le combinazioni a coefficienti interi che ne derivano: un reticolo. Il punto evidenziato nasce da due volte b₁ e una volta b₂.

Il punto decisivo:

In dimensioni piccole i problemi reticolari sono facili. In dimensioni molto alte determinati compiti diventano estremamente difficili.


6. Polinomi invece di singoli numeri

ML-DSA non calcola con vettori 2D, bensì con polinomi e vettori di polinomi.

Un polinomio come

a(x)=1+2x+x3a(x)=1+2x+x^3

si può scrivere come lista di coefficienti:

a=(1,2,0,1).a=(1,2,0,1).

Si calcola in un anello:

Rq=Zq[x]/(xn+1).R_q=\mathbb{Z}_q[x]/(x^n+1).

Ciò significa due cose:

  • Zq\mathbb{Z}_q: calcolare modulo qq
  • xn=1x^n=-1: una regola aggiuntiva che fissa la lunghezza dei polinomi

Per tutti e tre i livelli ML-DSA vale:

n=256,q=8380417.n=256, \qquad q=8380417.

Un polinomio ha dunque 256 coefficienti, considerati modulo 8.380.417. Ciò che cambia tra i livelli non è nn o qq, bensì la dimensione delle matrici — più avanti su questo.

Per inciso: la moltiplicazione di polinomi in questo anello passa in pratica per la NTT, la variante teorico-numerica della trasformata veloce di Fourier. ML-DSA non fa quindi affatto a meno delle idee della FFT; esse stanno soltanto nell'aritmetica anziché nel principio di firma.


7. Il trucco centrale: Module-LWE

L'idea di fondo è Module Learning With Errors:

t=As1+s2(modq).\mathbf{t}=\mathbf{A}\mathbf{s}_1+\mathbf{s}_2 \pmod q.

Dove:

  • A\mathbf{A} — matrice pubblica, apparentemente casuale, di polinomi
  • s1,s2\mathbf{s}_1,\mathbf{s}_2 — piccoli vettori segreti
  • t\mathbf{t} — valore pubblico

Un aggressore conosce A\mathbf{A} e t\mathbf{t}, ma non s1,s2\mathbf{s}_1,\mathbf{s}_2. L'equazione gli appare come un'equazione casuale con rumore. Da essa non deve poter ricavare in modo efficiente i piccoli segreti.


8. Un minuscolo esempio numerico

Prendiamo di proposito una variante ridicolmente piccola — numeri normali invece di polinomi, dimensione 2 invece di 256, e

q=17.q=17.

Sia

A=(3572),s1=(11),s2=(10).A=\begin{pmatrix}3&5\\7&2\end{pmatrix}, \qquad \mathbf{s}_1=\begin{pmatrix}1\\-1\end{pmatrix}, \qquad \mathbf{s}_2=\begin{pmatrix}1\\0\end{pmatrix}.

Allora:

As1=(3572)=(25),A\mathbf{s}_1=\begin{pmatrix}3-5\\7-2\end{pmatrix}=\begin{pmatrix}-2\\5\end{pmatrix},
t=As1+s2=(25)+(10)=(15)    (165)(mod17).\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2=\begin{pmatrix}-2\\5\end{pmatrix}+\begin{pmatrix}1\\0\end{pmatrix}=\begin{pmatrix}-1\\5\end{pmatrix} \;\equiv\; \boxed{\begin{pmatrix}16\\5\end{pmatrix}} \pmod{17}.

In questo mini-formato si potrebbero provare tutte le possibilità. In ML-DSA-87 A\mathbf{A} è una matrice 8×78\times 7 di polinomi con 256 coefficienti ciascuno — sono oltre 14.000 incognite nella struttura reticolare.


9. La coppia di chiavi del servizio di firma

La chiave privata contiene tra l'altro i piccoli vettori s1,s2\mathbf{s}_1,\mathbf{s}_2. In ML-DSA-87 i loro coefficienti provengono dall'intervallo

[η,η]conη=2,[-\eta,\eta] \quad\text{con}\quad \eta=2,

dunque da {2,1,0,1,2}\{-2,-1,0,1,2\}. Questa piccolezza non è un dettaglio, bensì il nocciolo: solo perché i segreti sono piccoli nasce un problema reticolare difficile.

La chiave pubblica è, semplificando,

(ρ,t1).(\rho,\mathbf{t}_1).

ρ\rho è un seed dal quale A\mathbf{A} si lascia ricostruire in modo deterministico — la matrice non deve quindi essere trasmessa. t1\mathbf{t}_1 sono i bit superiori di t\mathbf{t}; i d=13d=13 bit inferiori cadono, il che riduce nettamente la chiave. Questa omissione è più avanti la ragione dei cosiddetti hint.

Nasce così l'asimmetria desiderata:

verificare pubblicamente    firmare in segreto\boxed{\text{verificare pubblicamente}\;\neq\;\text{firmare in segreto}}

10. La recensione diventa un numero

Il servizio di firma calcola dapprima l'hash dell'oggetto payload della sezione 2:

μ=H(m).\mu=H(m).

Nel nostro esempio giocattolo prendiamo un mini-hash artificiale. Nel sistema reale μ\mu è lungo 512 bit e vincola in aggiunta la chiave pubblica — così una firma non può essere reinterpretata come relativa a un'altra chiave.


11. Commitment

Il servizio di firma estrae un piccolo vettore casuale y\mathbf{y}. Nel nostro esempio:

y=(21).\mathbf{y}=\begin{pmatrix}2\\-1\end{pmatrix}.

Ne nasce un valore intermedio, il commitment:

w=Ay=(32+5(1)72+2(1))=(112).\mathbf{w}=A\mathbf{y} =\begin{pmatrix}3\cdot2+5\cdot(-1)\\7\cdot2+2\cdot(-1)\end{pmatrix} =\begin{pmatrix}1\\12\end{pmatrix}.

Questa non è ancora una firma.


12. Dalla recensione nasce una challenge

Messaggio e commitment vengono sottoposti a hash insieme:

c=H(μ,w).c=H(\mu,\mathbf{w}).

In ML-DSA-87 cc è un polinomio con esattamente τ=60\tau=60 coefficienti presi da {1,+1}\{-1,+1\}, tutti i restanti 196 sono nulli. Questa struttura è voluta: mantiene piccolo cs1c\cdot\mathbf{s}_1.

Nel nostro esempio giocattolo poniamo semplicemente

c=2.c=2.

13. La firma vera e propria

z=y+cs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1.

Con i nostri valori:

cs1=2(11)=(22),c\,\mathbf{s}_1=2\begin{pmatrix}1\\-1\end{pmatrix}=\begin{pmatrix}2\\-2\end{pmatrix},
z=(21)+(22)=(43)\mathbf{z}=\begin{pmatrix}2\\-1\end{pmatrix}+\begin{pmatrix}2\\-2\end{pmatrix} =\boxed{\begin{pmatrix}4\\-3\end{pmatrix}}

14. Il passo che si trascura facilmente: il rejection sampling

Qui sta il punto in cui ML-DSA si distingue da una costruzione ingenua — e non è opzionale.

z=y+cs1\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 contiene il segreto s1\mathbf{s}_1. Se si rilasciasse semplicemente sempre z\mathbf{z}, si potrebbe ricavare s1\mathbf{s}_1 per via statistica da un numero sufficiente di firme. In un portale di recensioni con moltissime firme al giorno questo non è un rischio teorico.

Perciò il servizio di firma verifica prima dell'emissione se z\mathbf{z} riveli troppo, e in caso contrario scarta la firma — allora si ricomincia da capo con un nuovo y\mathbf{y} casuale. Si chiama Fiat-Shamir with Aborts.

La condizione recita in sostanza:

z<γ1β.\|\mathbf{z}\|_\infty < \gamma_1-\beta.
commitment w = Aychallenge c = H(μ, w)risposta z = y + c · s₁‖z‖∞ < γ₁ − β ?la firma viene emessano — nuovo y
Tre passi e un ciclo. Se z risulta troppo grande, non lo si corregge — l'intero giro viene scartato e si ricomincia con un nuovo y casuale. Per questo qui firmare è un procedimento a ciclo.

Per ML-DSA-87 vale γ1=219\gamma_1=2^{19} e β=τη=602=120\beta=\tau\cdot\eta=60\cdot2=120. A ciò si aggiunge una seconda soglia sui bit inferiori. In pratica più giri sono normali — firmare è dunque un procedimento a ciclo, non un passo unico.

Per la verifica è importante: è esattamente questa soglia che il browser controlla in seguito. Una firma con coefficienti troppo grandi viene rifiutata, anche se l'equazione torna.


15. Perché il browser può verificarlo

Il browser del lettore conosce:

  • la recensione e quindi mm
  • la chiave pubblica (ρ,t1)(\rho,\mathbf{t}_1)
  • la firma (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h})

Non conosce s1\mathbf{s}_1. Il legame che gli permette comunque di procedere:

z=y+cs1Az=Ay+cAs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 \quad\Longrightarrow\quad A\mathbf{z}=A\mathbf{y}+c\,A\mathbf{s}_1.

E poiché vale

t=As1+s2\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2

l'ignoto As1A\mathbf{s}_1 si lascia sostituire con il valore pubblico:

Azct=Aycs2.A\mathbf{z}-c\,\mathbf{t}=A\mathbf{y}-c\,\mathbf{s}_2.

Questa è l'equazione centrale — e dice qualcosa di importante: il browser ricostruisce AyA\mathbf{y} non esattamente, bensì solo a meno del piccolo termine cs2c\,\mathbf{s}_2.


16. Il mini-esempio fino in fondo

Avevamo:

A=(3572),t=(15),c=2,z=(43).A=\begin{pmatrix}3&5\\7&2\end{pmatrix},\quad \mathbf{t}=\begin{pmatrix}-1\\5\end{pmatrix},\quad c=2,\quad \mathbf{z}=\begin{pmatrix}4\\-3\end{pmatrix}.

Verifichiamo:

Az=(1215286)=(322),ct=2(15)=(210),A\mathbf{z}=\begin{pmatrix}12-15\\28-6\end{pmatrix}=\begin{pmatrix}-3\\22\end{pmatrix}, \qquad c\,\mathbf{t}=2\begin{pmatrix}-1\\5\end{pmatrix}=\begin{pmatrix}-2\\10\end{pmatrix},
Azct=(112).A\mathbf{z}-c\,\mathbf{t}=\begin{pmatrix}-1\\12\end{pmatrix}.

Il commitment originario era

w=(112).\mathbf{w}=\begin{pmatrix}1\\12\end{pmatrix}.

La differenza ammonta a

(112)(112)=(20)=cs2.\begin{pmatrix}-1\\12\end{pmatrix}-\begin{pmatrix}1\\12\end{pmatrix} =\begin{pmatrix}-2\\0\end{pmatrix} =-c\,\mathbf{s}_2.

Dunque esattamente il piccolo termine d'errore previsto. Il verificatore non ottiene w\mathbf{w}, bensì qualcosa che sta vicino a w\mathbf{w}.

Proprio per questo ML-DSA non confronta i valori stessi, bensì i loro bit superiori. E proprio per questo la firma contiene in aggiunta un vettore di hint h\mathbf{h}: comunica in modo compatto in quali punti l'arrotondamento è scivolato oltre una soglia a causa del piccolo termine d'errore. In ML-DSA-87 sono ammesse al massimo ω=75\omega=75 di tali indicazioni. Esse non rivelano il segreto — riparano soltanto l'arrotondamento.

Alla fine il browser ricalcola la challenge. Se coincide,

cnuova=c,c_{\text{nuova}}=c,

e se tutte le norme rientrano nelle soglie, la firma è valida.


17. Che cosa succede se qualcuno modifica la recensione?

Supponiamo che qualcuno con accesso alla banca dati — anche qualcuno da noi — modifichi il testo della recensione o uno dei cuori. Allora cambia almeno uno dei due valori hash nel payload (h per il testo, rh per ogni campo del record):

H(m)H(m).H(m)\neq H(m').

Con ciò cambia la challenge:

cc.c\neq c'.

La firma esistente è però stata generata per la vecchia challenge. Il browser rifà i conti e constata:

cnuovacfirmaFirma non validac_{\text{nuova}}\neq c_{\text{firma}} \quad\Longrightarrow\quad \boxed{\text{Firma non valida}}

La frase decisiva al riguardo: possiamo cancellare una recensione, ma non possiamo modificarla inosservati. In McGesund la stessa verifica gira inoltre ogni notte lato server sull'intero patrimonio — una recensione che non supera questa verifica non confluisce più nella media dell'azienda.


18. Perché nessuno può inventare una firma?

Un aggressore conosce A\mathbf{A} e t\mathbf{t}, ma non s1,s2\mathbf{s}_1,\mathbf{s}_2. Per costruire una firma valida dovrebbe trovare una terna (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) che

  • soddisfi l'equazione di verifica e
  • rispetti le soglie sulle norme e
  • corrisponda alla challenge che risulta proprio da questi stessi valori.

Nel nocciolo ciò equivale a un problema reticolare difficile — concretamente a Module-SIS: trovare soluzioni corte di un'equazione omogenea modulo qq. La condizione di piccolezza non è un accessorio, bensì il vero grado di difficoltà. Senza di essa una soluzione sarebbe banale.

dati pubblici    problema reticolare difficile\boxed{\text{dati pubblici}\;\rightarrow\;\text{problema reticolare difficile}}

19. Perché «Module»?

La parola descrive la struttura che sta tra i vettori semplici e i reticoli generali. Invece di calcolare con singoli numeri, ML-DSA lavora con vettori di polinomi:

a=(a1(x),a2(x),,ak(x)),\mathbf{a}=(a_1(x),a_2(x),\ldots,a_k(x)),

e con matrici formate da essi:

A=(a1,1(x)a1,2(x)a2,1(x)a2,2(x)).\mathbf{A}= \begin{pmatrix} a_{1,1}(x)&a_{1,2}(x)&\cdots\\ a_{2,1}(x)&a_{2,2}(x)&\cdots\\ \vdots&\vdots&\ddots \end{pmatrix}.

Il vantaggio: si ottiene l'alta dimensione di un reticolo, ma si conserva una rappresentazione compatta ed efficientemente calcolabile. La sicurezza si lascia regolare finemente tramite la dimensione della matrice, senza cambiare anello.


20. Perché proprio 87?

I tre livelli non si distinguono nell'anello, bensì nelle dimensioni:

ParametroML-DSA-44ML-DSA-65ML-DSA-87
Dimensione della matrice (k,)(k,\ell)4×44\times46×56\times58×78\times7
Intervallo del segreto η\eta242
Peso della challenge τ\tau394960
Chiave pubblica1.312 B1.952 B2.592 B
Firma2.420 B3.309 B4.627 B
Categoria NIST235

Degno di nota: ML-DSA-87 non è semplicemente «ML-DSA-65, solo più grande». L'intervallo del segreto η\eta torna da 4 a 2; qui la sicurezza viene dalla matrice più grande, non da coefficienti più grandi. Si tratta di una scelta di parametri autonoma e standardizzata.

struttura matematica piuˋ grandemargine di sicurezza maggiore\boxed{\text{struttura matematica più grande}\rightarrow\text{margine di sicurezza maggiore}}

Il prezzo: 4.627 byte per firma — per ogni timbro che viene memorizzato e consegnato al browser al momento della verifica. Perciò in McGesund accanto a ML-DSA-87 si può scegliere anche FALCON, che si accontenta di 1.280 byte.


21. Fiat-Shamir: perché funziona senza controparte

Una prova interattiva funzionerebbe così:

  1. Il servizio di firma invia un commitment.
  2. Il verificatore invia una challenge casuale.
  3. Il servizio di firma risponde.
  4. Il verificatore rifà i conti.

Con una recensione questo dialogo non c'è — il lettore arriva mesi dopo. La soluzione è la trasformazione di Fiat-Shamir: la challenge non viene tirata a sorte, bensì ricavata per hash dai dati stessi:

c=H(chiave pubblica,  messaggio,  commitment).c=H(\text{chiave pubblica},\;\text{messaggio},\;\text{commitment}).

Così da un dialogo nasce un documento. Il servizio di firma non può scegliersi la challenge, perché per farlo dovrebbe controllare l'hash.


22. L'intero procedimento

SERVIZIO DI FIRMA (MCGESUND)BROWSER DEL VISITATOREchiave privata s₁, s₂payload m = {azienda, recensione, h, rh, iat}hash μvettore casuale ycommitment w = Aychallenge c = H(μ, w)z = y + c · s₁firma (c, z, hint) + kidrecensione + firma + chiave pubbl.Az − c·t → bit superiori + hintricalcolare la challengechallenge ricalcolata = quella fornita?validanon validascartare se z è troppo grande(rejection sampling)
L'intero percorso di una recensione. Il ritorno tratteggiato è il rejection sampling — viene preso tante volte quante servono finché z non è abbastanza piccolo da non rivelare nulla sulla chiave segreta.

23. Che cosa ne fa concretamente McGesund

Tre livelli si incastrano l'uno nell'altro:

L'envelope. Ogni recensione firmata porta una firma Ed25519. È la variante obbligatoria — classica, minuscola, verificabile nativamente in ogni browser.

I timbri post-quantistici. In aggiunta si possono affiancare una o due firme resistenti ai quanti. Quali, dipende dal piano tariffario:

Pianolivelli di firma disponibili
BasisEd25519, FN-DSA-512
KlassikEd25519, FN-DSA-512, FN-DSA-1024
ProEd25519, FN-DSA-1024, ML-DSA-87
PremiumEd25519, FN-DSA-1024, ML-DSA-87, entrambe in parallelo

La variante parallela è ridondante di proposito. Se una delle due famiglie matematiche — reticoli NTRU in FALCON, reticoli modulari in ML-DSA — dovesse rivelarsi più debole di quanto oggi si assuma, l'altra regge.

L'ancoraggio temporale. L'impronta digitale della chiave di firma viene ancorata tramite OpenTimestamps in un blocco Bitcoin. Così si può dimostrare non solo che la firma è autentica, ma anche che essa esisteva già in un determinato momento — senza che qualcuno debba credere alla nostra marca temporale.

Tutto questo viene verificato nel browser del lettore, tramite un modulo WASM. Noi forniamo i dati; i conti vengono rifatti sul dispositivo del visitatore. Se domani andassimo offline, una recensione una volta scaricata resterebbe verificabile.


24. ML-DSA e FALCON a confronto

ProprietàFALCON (FN-DSA)ML-DSA
Tipofirma digitalefirma digitale
Famiglia di reticoliNTRUModule-LWE / Module-SIS
AnelloZq[x]/(xn+1)\mathbb{Z}_q[x]/(x^n+1), q=12289q=12289Zq[x]/(x256+1)\mathbb{Z}_q[x]/(x^{256}+1), q=8380417q=8380417
Meccanismo centralevettore corto per campionamento gaussianodomanda-risposta con interruzioni
FFT / NTTFFT in virgola mobile, critica per la sicurezzaNTT, solo aritmetica
Dimensione della firma (livello più alto)1.280 B4.627 B
Implementazioneimpegnativa (virgola mobile)relativamente lineare
Standardizzazioneprevista come FIPS 206 (FN-DSA), non ancora conclusaFIPS 204, conclusa

In breve: ML-DSA è più facile da implementare e verificare correttamente, FALCON fornisce firme nettamente più compatte. Nel QR code non sta nessuna delle due — lì c'è unicamente l'envelope Ed25519. La dimensione della firma conta perciò nella memorizzazione e nella consegna, la robustezza nell'implementazione. Per questo offriamo entrambe.


25. Una frase da portare a casa

ML-DSA genera da un breve vettore segreto una risposta a unachallenge ricavata per hash dalla recensione stessa — verificabileda chiunque disponga della chiave pubblica.\boxed{ \begin{array}{c} \text{ML-DSA genera da un breve vettore segreto una risposta a una}\\ \text{challenge ricavata per hash dalla recensione stessa — verificabile}\\ \text{da chiunque disponga della chiave pubblica.} \end{array}}

Chi possiede il vettore segreto firma in millisecondi. Chi non lo possiede dovrebbe risolvere un problema reticolare in oltre 14.000 dimensioni — anche con un computer quantistico.

Per il lettore di una recensione ciò significa semplicemente: non deve crederci. Può ricalcolare.