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 . Lega insieme sei affermazioni:
- A quale azienda appartiene la recensione (
f) - Quale recensione si intende (
c) - Quale testo vi stava dietro — come valore hash (
h) - 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 schemarv - Da quale QR code proviene la recensione (
qh); senza QR il campo decade - 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:
- La recensione è stata effettivamente emessa da McGesund.
- Il testo non è stato modificato dopo l'invio.
- 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:
Più precisamente: Module-LWE e Module-SIS.
5. Che cos'è un reticolo?
Dapprima solo punti nello spazio. Prendiamo due vettori:
Tutte le combinazioni a coefficienti interi
formano il reticolo. Per esempio:
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
si può scrivere come lista di coefficienti:
Si calcola in un anello:
Ciò significa due cose:
- : calcolare modulo
- : una regola aggiuntiva che fissa la lunghezza dei polinomi
Per tutti e tre i livelli ML-DSA vale:
Un polinomio ha dunque 256 coefficienti, considerati modulo 8.380.417. Ciò che cambia tra i livelli non è o , 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:
Dove:
- — matrice pubblica, apparentemente casuale, di polinomi
- — piccoli vettori segreti
- — valore pubblico
Un aggressore conosce e , ma non . 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
Sia
Allora:
In questo mini-formato si potrebbero provare tutte le possibilità. In ML-DSA-87 è una matrice 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 . In ML-DSA-87 i loro coefficienti provengono dall'intervallo
dunque da . Questa piccolezza non è un dettaglio, bensì il nocciolo: solo perché i segreti sono piccoli nasce un problema reticolare difficile.
La chiave pubblica è, semplificando,
è un seed dal quale si lascia ricostruire in modo deterministico — la matrice non deve quindi essere trasmessa. sono i bit superiori di ; i bit inferiori cadono, il che riduce nettamente la chiave. Questa omissione è più avanti la ragione dei cosiddetti hint.
Nasce così l'asimmetria desiderata:
10. La recensione diventa un numero
Il servizio di firma calcola dapprima l'hash dell'oggetto payload della sezione 2:
Nel nostro esempio giocattolo prendiamo un mini-hash artificiale. Nel sistema reale è 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 . Nel nostro esempio:
Ne nasce un valore intermedio, il commitment:
Questa non è ancora una firma.
12. Dalla recensione nasce una challenge
Messaggio e commitment vengono sottoposti a hash insieme:
In ML-DSA-87 è un polinomio con esattamente coefficienti presi da , tutti i restanti 196 sono nulli. Questa struttura è voluta: mantiene piccolo .
Nel nostro esempio giocattolo poniamo semplicemente
13. La firma vera e propria
Con i nostri valori:
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.
contiene il segreto . Se si rilasciasse semplicemente sempre , si potrebbe ricavare 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 riveli troppo, e in caso contrario scarta la firma — allora si ricomincia da capo con un nuovo casuale. Si chiama Fiat-Shamir with Aborts.
La condizione recita in sostanza:
Per ML-DSA-87 vale e . 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
- la chiave pubblica
- la firma
Non conosce . Il legame che gli permette comunque di procedere:
E poiché vale
l'ignoto si lascia sostituire con il valore pubblico:
Questa è l'equazione centrale — e dice qualcosa di importante: il browser ricostruisce non esattamente, bensì solo a meno del piccolo termine .
16. Il mini-esempio fino in fondo
Avevamo:
Verifichiamo:
Il commitment originario era
La differenza ammonta a
Dunque esattamente il piccolo termine d'errore previsto. Il verificatore non ottiene , bensì qualcosa che sta vicino a .
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 : 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 di tali indicazioni. Esse non rivelano il segreto — riparano soltanto l'arrotondamento.
Alla fine il browser ricalcola la challenge. Se coincide,
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):
Con ciò cambia la challenge:
La firma esistente è però stata generata per la vecchia challenge. Il browser rifà i conti e constata:
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 e , ma non . Per costruire una firma valida dovrebbe trovare una terna 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 . La condizione di piccolezza non è un accessorio, bensì il vero grado di difficoltà. Senza di essa una soluzione sarebbe banale.
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:
e con matrici formate da essi:
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:
| Parametro | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Dimensione della matrice | |||
| Intervallo del segreto | 2 | 4 | 2 |
| Peso della challenge | 39 | 49 | 60 |
| Chiave pubblica | 1.312 B | 1.952 B | 2.592 B |
| Firma | 2.420 B | 3.309 B | 4.627 B |
| Categoria NIST | 2 | 3 | 5 |
Degno di nota: ML-DSA-87 non è semplicemente «ML-DSA-65, solo più grande». L'intervallo del segreto 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.
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ì:
- Il servizio di firma invia un commitment.
- Il verificatore invia una challenge casuale.
- Il servizio di firma risponde.
- 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:
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
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:
| Piano | livelli di firma disponibili |
|---|---|
| Basis | Ed25519, FN-DSA-512 |
| Klassik | Ed25519, FN-DSA-512, FN-DSA-1024 |
| Pro | Ed25519, FN-DSA-1024, ML-DSA-87 |
| Premium | Ed25519, 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 |
|---|---|---|
| Tipo | firma digitale | firma digitale |
| Famiglia di reticoli | NTRU | Module-LWE / Module-SIS |
| Anello | , | , |
| Meccanismo centrale | vettore corto per campionamento gaussiano | domanda-risposta con interruzioni |
| FFT / NTT | FFT in virgola mobile, critica per la sicurezza | NTT, solo aritmetica |
| Dimensione della firma (livello più alto) | 1.280 B | 4.627 B |
| Implementazione | impegnativa (virgola mobile) | relativamente lineare |
| Standardizzazione | prevista come FIPS 206 (FN-DSA), non ancora conclusa | FIPS 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
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.