Procedimenti di firma

Ed25519 spiegato matematicamente

La firma che accompagna ogni recensione di McGesund — dalla curva alla chiave, fino all'equazione che il browser del lettore ricalcola.

Aggiornato: 2026-09-07

1. Di che cosa si tratta

Una recensione su McGesund non è un campo di testo in una banca dati a cui bisogna semplicemente credere. Al momento dell'invio viene firmata digitalmente, e ogni visitatore può ricalcolare questa firma in seguito nel proprio browser.

Per questa firma utilizziamo Ed25519. A differenza di FALCON e ML-DSA, che possono essere aggiunti a fianco come timbri ulteriori, Ed25519 non è un'opzione: ogni recensione firmata la porta con sé, indipendentemente dal piano tariffario e dalla via di invio.

Una precisazione preliminare:

Ed25519 non è una cifratura. Il testo della recensione è fatto proprio per essere letto. La firma non dimostra la riservatezza, bensì origine e integrità.


2. Che cosa viene firmato esattamente

Non viene firmato il testo discorsivo, bensì un oggetto dati compatto che fissa in modo univoco il testo e tutto il resto:

{
  "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>",
  "kid": "<ID chiave>",
  "iat": 1757203200
}

Questo oggetto viene codificato in CBOR. Questa sequenza di byte — non la sua gradevole rappresentazione qui sopra — è il nostro messaggio mm. Firma e messaggio finiscono insieme in una busta:

Envelope=MCG1:    base64url(CBOR[3,  m,  σ])\text{Envelope} = \texttt{MCG1:} \;\|\; \mathrm{base64url}\bigl(\mathrm{CBOR}[\,3,\; m,\; \sigma\,]\bigr)

Il 33 è la versione del formato. Non vi è contenuto altro — in particolare nessuna firma post-quantistica: quella, se esiste, si trova accanto al record e non nella busta.


3. Che cosa deve garantire la firma

Un lettore che arriva sul profilo di un'azienda si trova davanti a due domande:

  1. Questa recensione proviene davvero dal sistema McGesund?
  2. È stata modificata in un secondo momento?

A tal fine esiste una coppia di chiavi:

  • una chiave privata — resta nel servizio di firma
  • una chiave pubblica — può averla chiunque, viene indirizzata tramite l'ID chiave (kid) nel payload

Si firma con la chiave privata. Si verifica con quella pubblica — e precisamente nel browser del lettore, non sul nostro server. È questo il punto: una verifica che eseguissimo noi stessi e il cui esito comunicassimo noi non sarebbe una verifica, ma un'affermazione.


4. Perché una curva ellittica?

Ogni firma ha bisogno di un calcolo facile in una direzione e praticamente impossibile nell'altra. In Ed25519 è la moltiplicazione scalare su una curva ellittica:

a    A=aB.a \;\longmapsto\; A = a\cdot B.

Calcolare il punto pubblico AA a partire dal numero segreto aa costa microsecondi. Risalire da AA ad aa è il problema del logaritmo discreto — e per esso non si conosce alcun procedimento che, a queste dimensioni, arrivi in fondo in tempi umani.

Il vantaggio pratico rispetto a procedimenti più datati come RSA sta nelle dimensioni:

chiave pubblicafirma
RSA-3072384 B384 B
Ed2551932 B64 B

A parità di livello di sicurezza. 64 byte per recensione non sono una grandezza su cui riflettere, nemmeno con milioni di recensioni.


5. La curva edwards25519

Si calcola modulo un numero primo:

p=225519.p = 2^{255}-19.

Da qui il nome. La curva è una curva di Edwards ritorta:

x2+y2  =  1+dx2y2,d=121665121666modp.-x^2+y^2 \;=\; 1 + d\,x^2y^2, \qquad d = -\frac{121665}{121666} \bmod p.

Un «punto» è una coppia di numeri (x,y)(x,y) presi da {0,,p1}\{0,\dots,p-1\} che soddisfa questa equazione. Non c'è alcuna curva da vedere — il disegno nella sezione successiva è un ausilio visivo sui numeri reali, non un'immagine dello spazio di calcolo effettivo.

Si aggiungono altre due grandezze:

  • un punto base BB fissato per convenzione,
  • l'ordine \ell del sottogruppo generato da BB:
=2252+27742317777372353535851937790883648493.\ell = 2^{252} + 27742317777372353535851937790883648493.

\ell è primo. Ciò significa: sommando BB ripetutamente a se stesso si percorrono esattamente \ell punti diversi e poi si torna al punto di partenza. Tutti i calcoli con gli scalari avvengono perciò modulo \ell, tutti quelli con le coordinate modulo pp. Confondere questi due numeri è il classico errore da principianti.


6. Sommare punti

Due punti vengono combinati in un terzo secondo una formula fissa:

x3=x1y2+y1x21+dx1x2y1y2,y3=y1y2x1x21dx1x2y1y2.x_3=\frac{x_1y_2+y_1x_2}{1+d\,x_1x_2y_1y_2}, \qquad y_3=\frac{y_1y_2-x_1x_2}{1-d\,x_1x_2y_1y_2}.

L'elemento neutro è (0,1)(0,1) — il punto in cui il calcolo prende avvio.

Questa formula ha una proprietà che a prima vista non si nota e che per la sicurezza conta più di qualsiasi costante: è completa. Funziona per tutti gli ingressi, senza casi particolari per «i due punti coincidono» o «il risultato è l'elemento neutro». Nelle più datate curve di Weierstrass questi casi particolari esistono, e ciascuno di essi è una diramazione nel programma — una diramazione il cui tempo di esecuzione è misurabile. Chi misura quanto dura una firma, con procedimenti simili apprende qualcosa sulla chiave segreta.

Formule complete significano: sempre lo stesso percorso di calcolo, sempre lo stesso tempo, nulla da misurare.


7. Moltiplicazione scalare — la strada a senso unico

nBn\cdot B significa: sommare BB esattamente nn volte a se stesso. Con un nn da 253 bit sarebbe una mole di lavoro insensata — perciò si raddoppia:

B2B4B8BB \to 2B \to 4B \to 8B \to \dots

e da questi risultati intermedi si compone l'nn desiderato. Circa 253 raddoppi bastano per qualsiasi nn. Questa è la strada in avanti.

All'indietro questa scorciatoia non esiste. Determinare il numero aa a partire dal punto AA significa risolvere il problema del logaritmo discreto.

(0,1) — elemento neutroB2B3B4B5B6B
Una curva di Edwards con i primi multipli del punto base, calcolati con la vera legge di addizione. Sui numeri reali si spostano lungo la curva ancora in un ordine visibile — si potrebbe ripercorrere il cammino a ritroso. Modulo p scompare esattamente questo ordine, ed è su questo che si fonda la sicurezza.

Nel procedimento reale si calcola modulo pp. Lì non esiste alcuna «sinistra», alcuna «destra» e alcuna vicinanza: da 17B17\,B e 18B18\,B nascono due coppie di numeri senza alcuna parentela riconoscibile.


8. La coppia di chiavi del servizio di firma

All'inizio ci sono 32 byte casuali, il seed. Tutto il resto ne viene derivato:

h=SHA-512(seed),h=h0..31  a    h32..63prefisso.h = \mathrm{SHA\text{-}512}(\text{seed}), \qquad h = \underbrace{h_{0..31}}_{\to\;a}\;\|\;\underbrace{h_{32..63}}_{\text{prefisso}}.

Dalla prima metà nasce lo scalare segreto aa, però non inalterato. Tre bit vengono impostati o azzerati — il cosiddetto clamping:

  • i tre bit più bassi vengono posti a zero: aa diventa così un multiplo di 8. Il motivo è il cofattore 8 della curva — il gruppo completo dei punti è otto volte più grande del sottogruppo di ordine \ell. Un aa divisibile per 8 finisce con certezza nel sottogruppo giusto e non rivela nulla sui punti di ordine piccolo.
  • il bit più alto viene azzerato, il penultimo impostato: aa ha così sempre la stessa lunghezza in bit. Un aa più corto richiederebbe meno raddoppi — e di nuovo dal tempo di esecuzione si potrebbe leggere qualcosa.

La chiave pubblica è poi semplicemente

A=aB,A = a\cdot B,

memorizzata su 32 byte: la coordinata yy e, nel bit più alto, il segno di xx. La xx il verificatore se la ricava da sé dall'equazione della curva — le due soluzioni differiscono solo per il segno, e quale sia quella giusta lo dice questo singolo bit.

La seconda metà del valore hash, il prefisso, non serve per la chiave. Entra in gioco nella sezione successiva.


9. Perché qui il caso non è casuale

Ogni firma di questo tipo ha bisogno di un valore irripetibile rr, spesso chiamato nonce. Non deve mai ripetersi: chi possiede due firme con lo stesso rr può ricavare la chiave segreta con l'algebra delle superiori.

È esattamente su questo che sono naufragati sistemi reali. Il caso più noto è la verifica delle firme di una console per videogiochi, il cui produttore nel 2010 usava sempre lo stesso nonce — la chiave privata era così ricostruibile pubblicamente.

Ed25519 risolve il problema non usando affatto il caso:

r=SHA-512(prefisso    m)mod.r = \mathrm{SHA\text{-}512}(\text{prefisso}\;\|\;m) \bmod \ell.

Il nonce dipende dal prefisso segreto e dal messaggio. Da ciò discendono due conseguenze:

  • Due recensioni diverse danno, con probabilità schiacciante, rr diversi — il caso della ripetizione non si verifica.
  • La stessa recensione dà sempre la stessa firma. Un'operazione di firma è così ripercorribile, e un cattivo generatore di numeri casuali sul server non può rovinare nulla, perché non ne serve alcuno.

Per un portale di recensioni con molte firme al giorno questo non è un vantaggio accademico. È la differenza tra «un errore nella sorgente di casualità sarebbe fatale» e «non esiste alcuna sorgente di casualità che possa venire meno».


10. Firmare

Tre righe, nulla di più:

r=H(prefisso    m)mod,R=rB,r = H(\text{prefisso}\;\|\;m) \bmod \ell, \qquad R = r\cdot B,
k=H(R    A    m)mod,k = H(R \;\|\; A \;\|\; m) \bmod \ell,
S=(r+ka)mod.S = (r + k\,a) \bmod \ell.

La firma è la coppia

σ=(R,S),\sigma = (R,\,S),

32 byte per il punto RR, 32 byte per il numero SS — in tutto 64 byte.

Degna di nota è la seconda riga: in kk entrano RR, la chiave pubblica AA e il messaggio. Che AA venga incluso nell'hash non è un accessorio — impedisce attacchi in cui una firma viene reinterpretata come relativa a un'altra chiave.


11. Verificare

Il browser del lettore conosce: la recensione mm, la firma (R,S)(R,S) e la chiave pubblica AA. Ricalcola kk e verifica una sola equazione:

SB  =  R+kA\boxed{S\cdot B \;=\; R + k\cdot A}

Se torna, la firma è valida. RFC 8032 consente inoltre la versione moltiplicata per il cofattore 8SB=8R+8kA8S\cdot B = 8R + 8k\cdot A, che tratta con più larghezza alcuni casi limite.

Non viene interrogato alcun server, nessun servizio deve essere disponibile. Basta la chiave pubblica.


12. Perché l'equazione torna

Basta sostituire:

SB=(r+ka)B=rB+k(aB)=R+kA.S\cdot B = (r + k\,a)\cdot B = r\cdot B + k\,(a\cdot B) = R + k\cdot A.

Tutto il trucco sta nel passaggio centrale: la moltiplicazione scalare è compatibile con l'addizione. Chi conosce aa può calcolare un SS che soddisfa l'equazione. Chi non conosce aa dovrebbe trovare, per un kk scelto da sé, un SS adeguato — e ciò significa risolvere il logaritmo discreto.


13. Un mini-esempio calcolato per intero

Con i numeri veri non c'è nulla da ricalcolare — valori da 253 bit non si verificano a mente. Perciò lo stesso procedimento in un gruppo minuscolo, in cui ogni passo è verificabile con la calcolatrice.

Passo 1: il gruppo

Calcoliamo con i resti modulo 2323 e prendiamo g=2g = 2. Vale

211=2048=8923+11(mod23),2^{11} = 2048 = 89\cdot 23 + 1 \equiv 1 \pmod{23},

gg genera quindi un sottogruppo di ordine =11\ell = 11. Le potenze sono:

nn1234567891011
gng^n248169181336121

gg assume il ruolo del punto base BB, la moltiplicazione quello dell'addizione di punti. Gli scalari si calcolano modulo 1111, i valori modulo 2323.

Passo 2: la coppia di chiavi

Sia a=6a = 6 il segreto. Allora

A=ga=26=6418(mod23).A = g^a = 2^6 = 64 \equiv 18 \pmod{23}.

A=18A = 18 può saperlo chiunque.

Passo 3: nonce e commitment

Dal prefisso e dalla recensione risulti r=4r = 4. Da cui:

R=gr=24=16.R = g^r = 2^4 = 16.

Passo 4: la challenge

L'hash su RR, AA e la recensione fornisca

k=5.k = 5.

Passo 5: la firma

S=(r+ka)mod11=(4+56)mod11=34mod11=1.S = (r + k\,a) \bmod 11 = (4 + 5\cdot 6) \bmod 11 = 34 \bmod 11 = 1.

La firma è la coppia (R,S)=(16,1)(R,S) = (16,\,1).

Passo 6: il browser verifica

Calcola entrambi i membri. A sinistra:

gS=21=2.g^S = 2^1 = 2.

A destra, con 1853(mod23)18^5 \equiv 3 \pmod{23}:

RAk=163=482(mod23).R\cdot A^{k} = 16\cdot 3 = 48 \equiv 2 \pmod{23}.

Entrambi i membri danno 22:

Firma valida\boxed{\text{Firma valida}}

Passo 7: qualcuno modifica il testo della recensione

Il testo entra nell'hash, quindi cambia la challenge — poniamo che diventi k=7k' = 7. La firma resta invariata a (16,1)(16,1), il membro destro invece no. Con 1876(mod23)18^7 \equiv 6 \pmod{23}:

RAk=166=964(mod23)    2=gSR\cdot A^{k'} = 16\cdot 6 = 96 \equiv 4 \pmod{23} \;\neq\; 2 = g^S
Firma non valida\boxed{\text{Firma non valida}}

Possiamo cancellare una recensione. Modificarla senza che si noti, no.

Nota di trasparenza sull'esempio

Qui si è calcolato nel gruppo moltiplicativo modulo 2323, non su una curva: gSg^S sta per SBS\cdot B, il prodotto RAkR\cdot A^k per l'addizione di punti R+kAR + k\cdot A. La struttura è la stessa, ed è esattamente questo che conta. Diversi sono gli ordini di grandezza: =11\ell = 11 contro 2252\ell \approx 2^{252}, e lì la chiave non si trova provando le undici possibilità.


14. 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 il record e con esso almeno uno dei due valori hash h e rh nel payload. Con ciò cambia mm, quindi la challenge kk, quindi il membro destro dell'equazione di verifica. La vecchia firma non torna più.

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 la supera non confluisce più nella media dell'azienda.


15. Perché un aggressore fallisce

Conosce la chiave pubblica AA, il punto base BB, la curva e ogni firma finora emessa. Ciò che gli manca è aa.

Il miglior attacco classico noto al problema del logaritmo discreto in un gruppo di ordine \ell richiede circa \sqrt{\ell} passi. Con 2252\ell \approx 2^{252} sono circa

21262^{126}

operazioni. Per confronto: persino una macchina capace di un miliardo di miliardi (101810^{18}) di passi al secondo impiegherebbe un multiplo dell'età dell'universo.

Falsificare senza la chiave significherebbe trovare, per un kk scelto da sé, un SS adeguato — lo stesso compito in altre vesti.


16. Perché Ed25519 e non ECDSA

Entrambi si fondano sullo stesso problema. La differenza sta in tutto ciò che accade attorno:

ECDSA (curve NIST)Ed25519
Nonceserve casualità frescadeterministico da prefisso e messaggio
Formulecasi particolari, diramazioni dipendenti dai daticomplete, un solo percorso di calcolo
Parametri della curvaorigine delle costanti mai spiegata del tuttoscelti secondo criteri verificabili
Dimensione della firma64–72 B, codifica variabilefissa a 64 B
Nel browserdisponibile da temponativo dal 2023/2024, altrimenti come libreria JS

Per noi il nonce è stato l'argomento decisivo. Un portale di recensioni firma spesso e in modo automatizzato; un procedimento in cui un singolo valore casuale debole rivela la chiave è la scelta sbagliata.


17. Che cosa Ed25519 non garantisce

Ed25519 si fonda sul logaritmo discreto — ed è proprio questo problema che un computer quantistico sufficientemente grande risolve in modo efficiente con l'algoritmo di Shor. Se e quando esisteranno macchine simili è una questione aperta. Per una recensione che deve restare verificabile anche tra dieci anni è comunque una domanda a cui bisogna rispondere oggi.

Perciò accanto alla firma Ed25519 può porsi un timbro resistente ai quanti:

Nessuno dei due sostituisce Ed25519: si pongono accanto ad esso. Se uno dei procedimenti cede, l'altro regge.


18. Il procedimento in figura

SERVIZIO DI FIRMA (MCGESUND)BROWSER DEL VISITATOREscalare privato a + prefisso (dal seed)payload m = {azienda, recensione, h, rh, iat}r = H(prefisso ‖ m) mod ℓR = r · Bk = H(R ‖ A ‖ m) mod ℓS = (r + k · a) mod ℓfirma σ = (R, S) + kidrecensione + σ + chiave pubblica Aricalcolare k a partire da R, A e mS · B = R + k · A ?validanon valida
Dal payload al segno di spunta nel browser. Sopra la linea di separazione tutto avviene una sola volta, all'invio; sotto, di nuovo per ogni lettore — sul suo dispositivo, con la sola chiave pubblica.

19. Che cosa ne fa concretamente McGesund

L'envelope. Ogni recensione firmata porta una busta MCG1: con versione del formato, payload e firma Ed25519. Il kid nel payload dice quale chiave si intende; la relativa chiave pubblica il server la fornisce su richiesta — è pubblica, non c'è nulla da proteggere.

La verifica nel browser. Chrome e Firefox supportano Ed25519 nativamente dal 2023/2024 tramite l'interfaccia WebCrypto. Safari no — lì la chiamata solleva un errore invece di verificare. Perciò il nostro codice di verifica ripiega su un'implementazione in puro JavaScript, che viene caricata solo dove serve. La verifica della firma va così a buon fine in ogni browser, e per l'esattezza sul dispositivo del lettore.

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 la chiave esisteva già in un determinato momento — senza che qualcuno debba credere alla nostra marca temporale.

Il vincolo sul contenuto. Il payload porta rh, l'hash sull'intero record inviato: testo, cuori, stato geografico, indicazioni sull'occasione e provenienza. La firma Ed25519 vincola così non solo il testo, ma tutto ciò che viene mostrato accanto alla recensione.


20. Una frase da portare a casa

Ed25519 trasforma un numero segreto in un’equazioneche chiunque puoˋ ricalcolare e nessuno puoˋ inventare.\boxed{ \begin{array}{c} \text{Ed25519 trasforma un numero segreto in un'equazione}\\ \text{che chiunque può ricalcolare e nessuno può inventare.} \end{array}}

Chi possiede lo scalare segreto firma in microsecondi. Chi non lo possiede dovrebbe risolvere un logaritmo discreto in un gruppo con circa 22522^{252} elementi.

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