Procedeu de semnătură

ML-DSA-87 explicat matematic

Cum semnează ML-DSA-87 (FIPS 204) o recenzie McGesund — de la Module-LWE, prin rejection sampling, până la verificarea în browser.

Actualizat: 2026-09-07

1. Despre ce este vorba aici

Când cineva lasă o recenzie pe McGesund, în fundal se întâmplă mai mult decât lasă textul să se înțeleagă. Recenzia este semnată digital la trimitere. Această semnătură poate fi recalculată ulterior de orice vizitator în propriul browser — fără să aibă încredere în noi și fără să ne întrebe.

Pentru clienții începând cu tariful Pro, acest lucru se face, printre altele, cu ML-DSA-87. Acest articol explică ce se întâmplă matematic în acest proces.

Un lucru important de la bun început:

ML-DSA nu este o criptare. Textul recenziei rămâne lizibil public — acesta este chiar rostul unei recenzii. ML-DSA nu dovedește confidențialitatea, ci originea și integritatea.

ML-DSA a fost dezvoltat din CRYSTALS-Dilithium și este standardizat ca FIPS 204. Numărul 87 desemnează nivelul de parametri. Există trei:

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

ML-DSA-87 este cel mai înalt și se situează în categoria de securitate NIST 5.


2. Ce anume se semnează?

Nu textul recenziei în sine ajunge în semnătură, ci un obiect de date compact, care fixează fără echivoc textul. La McGesund, el arată în esență astfel:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<ID companie>",
  "c":   "<ID recenzie>",
  "h":   "<SHA-256 al textului recenziei>",
  "rh":  "<SHA-256 al întregului set de date trimis>",
  "rv":  1,
  "qh":  "<SHA-256 al envelope-ului QR, doar la recenziile prin QR>",
  "iat": 1757203200
}

Acest obiect este mesajul nostru mm. El leagă între ele șase afirmații:

  1. Cărei companii îi aparține recenzia (f)
  2. Despre ce recenzie este vorba (c)
  3. Ce text stătea în spatele ei — ca valoare hash (h)
  4. Ce set de date în ansamblu a fost trimis (rh): text, inimi, statusul geo și datele privind ocazia, serializate canonic și trecute prin hash — în versiunea de schemă rv
  5. Din ce cod QR provine recenzia (qh); fără QR, câmpul lipsește
  6. Când s-a semnat (iat)

Dacă cineva modifică ulterior un singur caracter din textul recenziei, h nu se mai potrivește — și nici rh. Cine, în schimb, umblă doar la inimi lasă h neatins, dar rupe rh. Dacă cineva modifică una dintre aceste valori hash, semnătura nu se mai potrivește. Exact acest lanț este esența.


3. Ce trebuie să realizeze semnătura

Un vizitator care citește recenzia trebuie să poată verifica singur trei lucruri:

  1. Recenzia a fost într-adevăr emisă de McGesund.
  2. Textul nu a fost modificat de la trimitere.
  3. Nimeni nu poate inventa o recenzie nouă, cu aspect valid.

Pentru asta există o pereche de chei:

  • o cheie privată — se află exclusiv în serviciul de semnare
  • o cheie publică — o poate avea oricine, este adresată prin ID-ul de cheie (kid) din envelope

Semnarea se face cu cheia privată. Verificarea, cu cea publică — și anume în browserul cititorului, nu pe serverul nostru.


4. De ce un procedeu post-cuantic?

Multe dintre procedeele de semnătură uzuale astăzi se bazează pe factorizarea numerelor mari sau pe logaritmi discreți. Un calculator cuantic suficient de performant ar putea rezolva exact aceste probleme considerabil mai repede, cu algoritmi cunoscuți.

Pentru o recenzie, aceasta nu este o întrebare academică. O recenzie trebuie să fie verificabilă și peste zece ani. Cine semnează astăzi semnează pentru întreaga durată de viață a înregistrării.

De aceea, ML-DSA folosește o altă bază:

Probleme pe rețele\boxed{\text{Probleme pe rețele}}

Mai exact: Module-LWE și Module-SIS.


5. Ce este o rețea?

Deocamdată doar puncte în spațiu. Să luăm doi vectori:

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

Toate combinațiile cu numere întregi

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

formează rețeaua. De exemplu:

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
Doi vectori, toate combinațiile lor cu numere întregi: o rețea. Punctul marcat rezultă din de două ori b₁ și o dată b₂.

Esențialul:

În dimensiuni mici, problemele pe rețele sunt ușoare. În dimensiuni foarte mari, anumite sarcini devin extrem de dificile.


6. Polinoame în loc de numere individuale

ML-DSA nu calculează cu vectori 2D, ci cu polinoame și vectori de polinoame.

Un polinom precum

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

se poate scrie ca listă de coeficienți:

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

Calculele se fac într-un inel:

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

Asta înseamnă două lucruri:

  • Zq\mathbb{Z}_q: calcul modulo qq
  • xn=1x^n=-1: o regulă suplimentară, care fixează lungimea polinoamelor

Pentru toate cele trei niveluri ML-DSA este valabil:

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

Un polinom are, așadar, 256 de coeficienți, considerați modulo 8.380.417. Ceea ce se schimbă între niveluri nu este nn sau qq, ci dimensiunea matricelor — despre asta, mai jos.

În treacăt: în practică, înmulțirea polinoamelor în acest inel se face prin NTT, varianta teoretic-numerică a transformatei Fourier rapide. Așadar, ML-DSA nu se lipsește nicidecum de ideile FFT; ele stau doar în aritmetică, nu în principiul semnăturii.


7. Trucul central: Module-LWE

Ideea de bază este Module Learning With Errors:

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

Aici:

  • A\mathbf{A} — matrice publică, aparent aleatoare, de polinoame
  • s1,s2\mathbf{s}_1,\mathbf{s}_2 — vectori secreți mici
  • t\mathbf{t} — valoare publică

Un atacator cunoaște A\mathbf{A} și t\mathbf{t}, dar nu s1,s2\mathbf{s}_1,\mathbf{s}_2. Ecuația îi apare ca o ecuație aleatoare cu zgomot. Nu trebuie să poată deduce eficient din ea secretele mici.


8. Un exemplu numeric minuscul

Luăm intenționat o variantă ridicol de mică — numere obișnuite în loc de polinoame, dimensiunea 2 în loc de 256, și

q=17.q=17.

Fie

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}.

Atunci:

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}.

În acest miniformat s-ar putea încerca toate posibilitățile. La ML-DSA-87, A\mathbf{A} este o matrice 8×78\times 7 de polinoame cu câte 256 de coeficienți fiecare — adică peste 14.000 de necunoscute în structura de rețea.


9. Perechea de chei a serviciului de semnare

Cheia privată conține, printre altele, vectorii mici s1,s2\mathbf{s}_1,\mathbf{s}_2. La ML-DSA-87, coeficienții lor provin din intervalul

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

adică din {2,1,0,1,2}\{-2,-1,0,1,2\}. Această micime nu este un detaliu, ci esența: doar pentru că secretele sunt mici ia naștere o problemă dificilă pe rețele.

Cheia publică este, simplificat,

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

ρ\rho este un seed din care A\mathbf{A} poate fi reconstruită determinist — matricea nu trebuie, așadar, transmisă. t1\mathbf{t}_1 sunt biții superiori ai lui t\mathbf{t}; cei d=13d=13 biți inferiori rămân pe dinafară, ceea ce micșorează considerabil cheia. Această omisiune este mai târziu motivul așa-numitelor hints.

Astfel ia naștere asimetria dorită:

verificare publica˘    semnare secreta˘\boxed{\text{verificare publică}\;\neq\;\text{semnare secretă}}

10. Recenzia devine un număr

Serviciul de semnare trece mai întâi obiectul payload din secțiunea 2 prin hash:

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

În exemplul nostru de jucărie luăm un mini-hash artificial. În sistemul real, μ\mu are 512 biți și include suplimentar cheia publică — astfel, o semnătură nu poate fi reinterpretată pentru o altă cheie.


11. Commitment

Serviciul de semnare extrage un vector mic aleatoriu y\mathbf{y}. În exemplul nostru:

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

De aici rezultă o valoare intermediară, commitment-ul:

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}.

Aceasta nu este încă o semnătură.


12. Din recenzie ia naștere un challenge

Mesajul și commitment-ul sunt trecute împreună prin hash:

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

La ML-DSA-87, cc este un polinom cu exact τ=60\tau=60 de coeficienți din {1,+1}\{-1,+1\}, toți ceilalți 196 fiind zero. Această structură este intenționată: ea menține cs1c\cdot\mathbf{s}_1 mic.

În exemplul nostru de jucărie punem pur și simplu

c=2.c=2.

13. Semnătura propriu-zisă

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

Cu valorile noastre:

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. Pasul ușor de trecut cu vederea: rejection sampling

Aici se află punctul în care ML-DSA se deosebește de o construcție naivă — și el nu este opțional.

z=y+cs1\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 conține secretul s1\mathbf{s}_1. Dacă z\mathbf{z} ar fi pur și simplu emis de fiecare dată, s1\mathbf{s}_1 ar putea fi dedus statistic din suficient de multe semnături. La un portal de recenzii cu foarte multe semnături pe zi, acesta nu este un risc teoretic.

De aceea, serviciul de semnare verifică înainte de emitere dacă z\mathbf{z} dezvăluie prea mult și, în caz contrar, aruncă semnătura — apoi se reia de la început cu un y\mathbf{y} aleatoriu nou. Acest lucru se numește Fiat-Shamir with Aborts.

Condiția sună, în esență, astfel:

z<γ1β.\|\mathbf{z}\|_\infty < \gamma_1-\beta.
Commitment w = AyChallenge c = H(μ, w)Răspuns z = y + c · s₁‖z‖∞ < γ₁ − β ?daSemnătura este emisănu — un nou y
Trei pași și o buclă. Dacă z iese prea mare, nu se corectează — întreaga trecere este aruncată și se reia cu un y aleatoriu proaspăt. De aceea, semnarea este aici un procedeu cu buclă.

Pentru ML-DSA-87 avem γ1=219\gamma_1=2^{19} și β=τη=602=120\beta=\tau\cdot\eta=60\cdot2=120. La asta se adaugă o a doua limită pe biții inferiori. În practică, mai multe treceri sunt normale — semnarea este, așadar, un procedeu cu buclă, nu un pas unic.

Pentru verificare este important: exact această limită o verifică browserul mai târziu. O semnătură cu coeficienți prea mari este respinsă, chiar dacă ecuația se verifică.


15. De ce poate browserul să verifice asta

Browserul cititorului cunoaște:

  • recenzia și, odată cu ea, mm
  • cheia publică (ρ,t1)(\rho,\mathbf{t}_1)
  • semnătura (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h})

El nu cunoaște s1\mathbf{s}_1. Relația care îl ajută totuși să avanseze:

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.

Și, deoarece este valabil

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

necunoscutul As1A\mathbf{s}_1 poate fi înlocuit prin valoarea publică:

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

Aceasta este ecuația centrală — și ea spune ceva important: browserul reconstruiește AyA\mathbf{y} nu exact, ci doar până la termenul mic cs2c\,\mathbf{s}_2.


16. Mini-exemplul până la capăt

Aveam:

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}.

Să verificăm:

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}.

Commitment-ul inițial era

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

Diferența este

(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.

Așadar, exact termenul mic de eroare prezis. Verificatorul nu primește w\mathbf{w}, ci ceva care se află aproape de w\mathbf{w}.

Exact de aceea ML-DSA nu compară valorile în sine, ci biții lor superiori. Și exact de aceea semnătura conține suplimentar un vector de hints h\mathbf{h}: el comunică în mod compact în ce locuri rotunjirea a basculat peste o limită din cauza termenului mic de eroare. La ML-DSA-87 sunt permise cel mult ω=75\omega=75 de asemenea indicii. Ele nu dezvăluie secretul — doar repară rotunjirea.

La final, browserul recalculează challenge-ul. Dacă acesta coincide,

cnou=c,c_{\text{nou}}=c,

și dacă toate normele se încadrează în limite, semnătura este validă.


17. Ce se întâmplă dacă cineva modifică recenzia?

Să presupunem că cineva cu acces la baza de date — inclusiv cineva de la noi — modifică textul recenziei sau una dintre inimi. Atunci se schimbă cel puțin una dintre cele două valori hash din payload (h la text, rh la orice câmp al setului de date):

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

Astfel se schimbă challenge-ul:

cc.c\neq c'.

Semnătura existentă a fost însă generată pentru challenge-ul vechi. Browserul recalculează și constată:

cnoucsemn.Semna˘tura˘ invalida˘c_{\text{nou}}\neq c_{\text{semn.}} \quad\Longrightarrow\quad \boxed{\text{Semnătură invalidă}}

Fraza decisivă în această privință: putem șterge o recenzie, dar nu o putem modifica pe nesimțite. La McGesund, aceeași verificare rulează suplimentar în fiecare noapte, pe server, asupra întregului fond — o recenzie care nu trece această verificare nu mai intră în media companiei.


18. De ce nu poate nimeni să inventeze o semnătură?

Un atacator cunoaște A\mathbf{A} și t\mathbf{t}, dar nu s1,s2\mathbf{s}_1,\mathbf{s}_2. Pentru a construi o semnătură validă, ar trebui să găsească un triplet (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) care

  • satisface ecuația de verificare și
  • respectă limitele de normă și
  • se potrivește cu challenge-ul care rezultă chiar din aceste valori.

În esență, asta se reduce la o problemă dificilă pe rețele — concret, la Module-SIS: găsirea unor soluții scurte ale unei ecuații omogene modulo qq. Condiția de micime nu este aici un accesoriu, ci gradul de dificultate propriu-zis. Fără ea, o soluție ar fi banală.

date publice    problema˘ dificila˘ pe rețele\boxed{\text{date publice}\;\rightarrow\;\text{problemă dificilă pe rețele}}

19. De ce „Module”?

Cuvântul descrie structura aflată între vectorii simpli și rețelele generale. În loc să calculeze cu numere individuale, ML-DSA lucrează cu vectori de polinoame:

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

și cu matrice formate din acestea:

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}.

Avantajul: obții dimensiunea mare a unei rețele, dar păstrezi o reprezentare compactă și eficient calculabilă. Securitatea poate fi reglată fin prin dimensiunea matricei, fără a schimba inelul.


20. De ce tocmai 87?

Cele trei niveluri nu se deosebesc prin inel, ci prin dimensiuni:

ParametruML-DSA-44ML-DSA-65ML-DSA-87
Dimensiunea matricei (k,)(k,\ell)4×44\times46×56\times58×78\times7
Domeniul secretului η\eta242
Greutatea challenge-ului τ\tau394960
Cheie publică1.312 B1.952 B2.592 B
Semnătură2.420 B3.309 B4.627 B
Categorie NIST235

Demn de remarcat: ML-DSA-87 nu este pur și simplu „ML-DSA-65, doar mai mare”. Domeniul secretului η\eta scade de la 4 înapoi la 2; securitatea vine aici din matricea mai mare, nu din coeficienți mai mari. Este vorba despre o alegere de parametri de sine stătătoare și standardizată.

structura˘ matematica˘ mai maremarja˘ de securitate mai mare\boxed{\text{structură matematică mai mare}\rightarrow\text{marjă de securitate mai mare}}

Prețul: 4.627 de octeți per semnătură — per ștampilă care este stocată și livrată browserului la verificare. De aceea, la McGesund, alături de ML-DSA-87 poate fi ales și FALCON, care se descurcă cu 1.280 de octeți.


21. Fiat-Shamir: de ce funcționează fără partener de dialog

Un demers interactiv ar decurge astfel:

  1. Serviciul de semnare trimite un commitment.
  2. Verificatorul trimite un challenge aleatoriu.
  3. Serviciul de semnare răspunde.
  4. Verificatorul recalculează.

La o recenzie, acest dialog nu există — cititorul vine luni mai târziu. Soluția este transformarea Fiat-Shamir: challenge-ul nu se obține prin aruncarea zarului, ci prin hash din datele înseși:

c=H(cheia publica˘,  mesajul,  commitment-ul).c=H(\text{cheia publică},\;\text{mesajul},\;\text{commitment-ul}).

Astfel, dintr-un dialog se naște un document. Serviciul de semnare nu își poate alege challenge-ul, pentru că ar trebui să controleze hash-ul.


22. Întregul flux

SERVICIUL DE SEMNARE (MCGESUND)BROWSERUL VIZITATORULUIcheia privată s₁, s₂Payload m = {companie, recenzie, h, rh, iat}Hash μvector aleatoriu yCommitment w = AyChallenge c = H(μ, w)z = y + c · s₁Semnătura (c, z, hints) + kidRecenzie + semnătură + cheia publicăAz − c·t → biți superiori + hintsrecalcularea challenge-uluichallenge-ul recalculat = cel livrat?validăinvalidăse aruncă dacă z e prea mare(rejection sampling)
Întregul parcurs al unei recenzii. Saltul înapoi punctat este rejection sampling — el este parcurs de câte ori este nevoie, până când z este suficient de mic pentru a nu dezvălui nimic despre cheia secretă.

23. Ce face McGesund concret cu asta

Trei niveluri se îmbină:

Envelope-ul. Fiecare recenzie semnată poartă o semnătură Ed25519. Aceasta este varianta obligatorie — clasică, minusculă, verificabilă nativ în orice browser.

Ștampilele post-cuantice. Suplimentar, una sau două semnături rezistente la calculul cuantic pot fi așezate alături. Care anume depinde de tarif:

Tarifniveluri de semnătură disponibile
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, ambele în paralel

Varianta paralelă este redundantă în mod deliberat. Dacă una dintre cele două familii matematice — rețele NTRU la FALCON, rețele modulare la ML-DSA — s-ar dovedi mai slabă decât se presupune astăzi, cealaltă continuă să susțină.

Ancora temporală. Amprenta cheii de semnare este ancorată printr-un bloc Bitcoin, prin OpenTimestamps. Astfel se poate dovedi nu doar că semnătura este autentică, ci și că ea exista deja la un anumit moment — fără ca cineva să fie nevoit să creadă marcajul nostru de timp.

Toate acestea sunt verificate în browserul cititorului, printr-un modul WASM. Noi livrăm datele; recalcularea are loc pe dispozitivul vizitatorului. Dacă mâine am dispărea de pe internet, o recenzie odată descărcată ar rămâne verificabilă.


24. ML-DSA și FALCON, una lângă alta

ProprietateFALCON (FN-DSA)ML-DSA
Tipsemnătură digitalăsemnătură digitală
Familia de rețeleNTRUModule-LWE / Module-SIS
InelZq[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
Mecanism centralvector scurt prin eșantionare gaussianăchallenge-răspuns cu întreruperi
FFT / NTTFFT în virgulă mobilă, critic pentru securitateNTT, doar aritmetică
Dimensiunea semnăturii (nivelul cel mai înalt)1.280 B4.627 B
Implementarepretențioasă (virgulă mobilă)comparativ directă
Standardizareprevăzut ca FIPS 206 (FN-DSA), încă nefinalizatFIPS 204, finalizat

Pe scurt: ML-DSA este mai ușor de implementat și de verificat corect, FALCON livrează semnături net mai compacte. În codul QR nu se află niciuna dintre ele — acolo stă doar envelope-ul Ed25519. De aceea, dimensiunea semnăturii contează la stocare și livrare, iar robustețea la implementare. De aceea le oferim pe amândouă.


25. O frază de reținut

ML-DSA produce, dintr-un vector secret scurt, un ra˘spuns la unchallenge derivat prin hash din recenzia ıˆnsa˘și — verificabilde oricine deține cheia publica˘.\boxed{ \begin{array}{c} \text{ML-DSA produce, dintr-un vector secret scurt, un răspuns la un}\\ \text{challenge derivat prin hash din recenzia însăși — verificabil}\\ \text{de oricine deține cheia publică.} \end{array}}

Cine deține vectorul secret semnează în milisecunde. Cine nu îl deține ar trebui să rezolve o problemă pe rețele în peste 14.000 de dimensiuni — chiar și cu un calculator cuantic.

Pentru cititorul unei recenzii asta înseamnă pur și simplu: nu trebuie să ne creadă. Poate să verifice singur.