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 . El leagă între ele șase afirmații:
- Cărei companii îi aparține recenzia (
f) - Despre ce recenzie este vorba (
c) - Ce text stătea în spatele ei — ca valoare hash (
h) - 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 - Din ce cod QR provine recenzia (
qh); fără QR, câmpul lipsește - 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:
- Recenzia a fost într-adevăr emisă de McGesund.
- Textul nu a fost modificat de la trimitere.
- 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ă:
Mai exact: Module-LWE și Module-SIS.
5. Ce este o rețea?
Deocamdată doar puncte în spațiu. Să luăm doi vectori:
Toate combinațiile cu numere întregi
formează rețeaua. De exemplu:
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
se poate scrie ca listă de coeficienți:
Calculele se fac într-un inel:
Asta înseamnă două lucruri:
- : calcul modulo
- : o regulă suplimentară, care fixează lungimea polinoamelor
Pentru toate cele trei niveluri ML-DSA este valabil:
Un polinom are, așadar, 256 de coeficienți, considerați modulo 8.380.417. Ceea ce se schimbă între niveluri nu este sau , 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:
Aici:
- — matrice publică, aparent aleatoare, de polinoame
- — vectori secreți mici
- — valoare publică
Un atacator cunoaște și , dar nu . 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
Fie
Atunci:
În acest miniformat s-ar putea încerca toate posibilitățile. La ML-DSA-87, este o matrice 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 . La ML-DSA-87, coeficienții lor provin din intervalul
adică din . 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,
este un seed din care poate fi reconstruită determinist — matricea nu trebuie, așadar, transmisă. sunt biții superiori ai lui ; cei 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ă:
10. Recenzia devine un număr
Serviciul de semnare trece mai întâi obiectul payload din secțiunea 2 prin hash:
În exemplul nostru de jucărie luăm un mini-hash artificial. În sistemul real, 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 . În exemplul nostru:
De aici rezultă o valoare intermediară, commitment-ul:
Aceasta nu este încă o semnătură.
12. Din recenzie ia naștere un challenge
Mesajul și commitment-ul sunt trecute împreună prin hash:
La ML-DSA-87, este un polinom cu exact de coeficienți din , toți ceilalți 196 fiind zero. Această structură este intenționată: ea menține mic.
În exemplul nostru de jucărie punem pur și simplu
13. Semnătura propriu-zisă
Cu valorile noastre:
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.
conține secretul . Dacă ar fi pur și simplu emis de fiecare dată, 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ă dezvăluie prea mult și, în caz contrar, aruncă semnătura — apoi se reia de la început cu un aleatoriu nou. Acest lucru se numește Fiat-Shamir with Aborts.
Condiția sună, în esență, astfel:
Pentru ML-DSA-87 avem și . 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,
- cheia publică
- semnătura
El nu cunoaște . Relația care îl ajută totuși să avanseze:
Și, deoarece este valabil
necunoscutul poate fi înlocuit prin valoarea publică:
Aceasta este ecuația centrală — și ea spune ceva important: browserul reconstruiește nu exact, ci doar până la termenul mic .
16. Mini-exemplul până la capăt
Aveam:
Să verificăm:
Commitment-ul inițial era
Diferența este
Așadar, exact termenul mic de eroare prezis. Verificatorul nu primește , ci ceva care se află aproape de .
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 : 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 de asemenea indicii. Ele nu dezvăluie secretul — doar repară rotunjirea.
La final, browserul recalculează challenge-ul. Dacă acesta coincide,
ș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):
Astfel se schimbă challenge-ul:
Semnătura existentă a fost însă generată pentru challenge-ul vechi. Browserul recalculează și constată:
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 și , dar nu . Pentru a construi o semnătură validă, ar trebui să găsească un triplet 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 . Condiția de micime nu este aici un accesoriu, ci gradul de dificultate propriu-zis. Fără ea, o soluție ar fi banală.
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:
și cu matrice formate din acestea:
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:
| Parametru | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Dimensiunea matricei | |||
| Domeniul secretului | 2 | 4 | 2 |
| Greutatea challenge-ului | 39 | 49 | 60 |
| Cheie publică | 1.312 B | 1.952 B | 2.592 B |
| Semnătură | 2.420 B | 3.309 B | 4.627 B |
| Categorie NIST | 2 | 3 | 5 |
Demn de remarcat: ML-DSA-87 nu este pur și simplu „ML-DSA-65, doar mai mare”. Domeniul secretului 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ă.
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:
- Serviciul de semnare trimite un commitment.
- Verificatorul trimite un challenge aleatoriu.
- Serviciul de semnare răspunde.
- 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:
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
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:
| Tarif | niveluri de semnătură disponibile |
|---|---|
| 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, 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
| Proprietate | FALCON (FN-DSA) | ML-DSA |
|---|---|---|
| Tip | semnătură digitală | semnătură digitală |
| Familia de rețele | NTRU | Module-LWE / Module-SIS |
| Inel | , | , |
| Mecanism central | vector scurt prin eșantionare gaussiană | challenge-răspuns cu întreruperi |
| FFT / NTT | FFT în virgulă mobilă, critic pentru securitate | NTT, doar aritmetică |
| Dimensiunea semnăturii (nivelul cel mai înalt) | 1.280 B | 4.627 B |
| Implementare | pretențioasă (virgulă mobilă) | comparativ directă |
| Standardizare | prevăzut ca FIPS 206 (FN-DSA), încă nefinalizat | FIPS 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
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.