Aláírási eljárás
Az ML-DSA-87 matematikai magyarázata
Hogyan ír alá az ML-DSA-87 (FIPS 204) egy McGesund-értékelést — a Module-LWE-től a rejection samplingen át a böngészőbeli ellenőrzésig.
Állapot: 2026-09-07
1. Miről van szó
Amikor valaki a McGesundnál értékelést ad le, a háttérben több történik, mint amit a szöveg sejtet. Az értékelést beküldéskor digitálisan aláírjuk. Ezt az aláírást bármelyik látogató később újraszámolhatja a saját böngészőjében — anélkül, hogy bíznia kellene bennünk, és anélkül, hogy meg kellene kérdeznie minket.
A Pro csomagtól felfelé ez többek között az ML-DSA-87 eljárással történik. Ez a cikk elmagyarázza, mi történik közben matematikailag.
Fontos előrebocsátani:
Az ML-DSA nem titkosítás. Az értékelés szövege nyilvánosan olvasható marad — hiszen éppen ez az értékelés értelme. Az ML-DSA nem a titkosságot bizonyítja, hanem az eredetet és a sértetlenséget.
Az ML-DSA a CRYSTALS-Dilithiumból fejlődött ki, és FIPS 204-ként szabványosított. A 87-es szám a paraméterszintet jelöli. Három van belőlük:
- ML-DSA-44
- ML-DSA-65
- ML-DSA-87
Az ML-DSA-87 a legmagasabb, és az 5. NIST-biztonsági kategóriába esik.
2. Mit írunk alá pontosan?
Nem maga az értékelés szövege kerül az aláírásba, hanem egy tömör adatobjektum, amely a szöveget egyértelműen rögzíti. A McGesundnál lényegében így néz ki:
{
"v": 1,
"typ": "rev-comment",
"f": "<cégazonosító>",
"c": "<értékelésazonosító>",
"h": "<az értékelés szövegének SHA-256 hasítóértéke>",
"rh": "<a teljes beküldött adatrekord SHA-256 hasítóértéke>",
"rv": 1,
"qh": "<a QR-envelope SHA-256 hasítóértéke, csak QR-értékeléseknél>",
"iat": 1757203200
}
Ez az objektum a mi üzenetünk. Hat állítást köt össze:
- Melyik céghez tartozik az értékelés (
f) - Melyik értékelésről van szó (
c) - Milyen szöveg állt mögötte — hasítóértékként (
h) - Összességében milyen adatrekordot küldtek be (
rh): szöveg, szívek, geostátusz és az alkalomra vonatkozó adatok, kanonikusan szerializálva és hasítva — azrvsémaverzióban - Melyik QR-kódból származik az értékelés (
qh); QR nélkül ez a mező elmarad - Mikor történt az aláírás (
iat)
Ha valaki később egyetlen karaktert megváltoztat az értékelés szövegén, a h már nem illeszkedik — és az rh sem. Aki ehelyett csak a szíveken állít, a h-t érintetlenül hagyja, de megtöri az rh-t. Ha valaki megváltoztatja e hasítóértékek egyikét, az aláírás már nem illeszkedik. Pontosan ez a lánc a lényeg.
3. Mit kell teljesítenie az aláírásnak
A látogatónak, aki elolvassa az értékelést, három dolgot kell tudnia maga ellenőrizni:
- Az értékelést valóban a McGesund állította ki.
- A szöveget a beküldés óta nem változtatták meg.
- Senki nem tud új, érvényesnek látszó értékelést kitalálni.
Ehhez egy kulcspár tartozik:
- egy titkos kulcs — kizárólag az aláíró szolgáltatásban van
- egy nyilvános kulcs — bárkinél lehet, a borítékban lévő kulcsazonosítón (
kid) keresztül címezhető
Az aláírás a titkos kulccsal készül. Az ellenőrzés a nyilvánossal — méghozzá az olvasó böngészőjében, nem a mi szerverünkön.
4. Miért egyáltalán poszt-kvantum eljárás?
A ma szokásos aláírási eljárások közül sok nagy számok faktorizációján vagy diszkrét logaritmusokon alapul. Egy kellően nagy teljesítményű kvantumszámítógép pontosan ezeket a problémákat ismert algoritmusokkal jelentősen gyorsabban tudná megoldani.
Egy értékelés esetében ez nem elméleti kérdés. Egy értékelésnek tíz év múlva is ellenőrizhetőnek kell lennie. Aki ma ír alá, a bejegyzés teljes élettartamára ír alá.
Az ML-DSA ezért más alapot használ:
Pontosabban: Module-LWE és Module-SIS.
5. Mi az a rács?
Egyelőre csak pontok a térben. Vegyünk két vektort:
Az összes egész együtthatós kombináció
alkotja a rácsot. Például:
A döntő szempont:
Kis dimenziókban a rácsproblémák könnyűek. Nagyon magas dimenziókban bizonyos feladatok rendkívül nehézzé válnak.
6. Polinomok egyes számok helyett
Az ML-DSA nem kétdimenziós vektorokkal számol, hanem polinomokkal és polinomvektorokkal.
Egy olyan polinom, mint
felírható együtthatólistaként:
A számítás egy gyűrűben történik:
Ez két dolgot jelent:
- : számolás modulo
- : kiegészítő szabály, amely rögzíti a polinom hosszát
Mindhárom ML-DSA-szintre érvényes:
Egy polinomnak tehát 256 együtthatója van, modulo 8 380 417 tekintve. Ami a szintek között változik, az nem az vagy a , hanem a mátrixok mérete — erről később bővebben.
Mellékesen: a polinomszorzás ebben a gyűrűben a gyakorlatban az NTT-n keresztül fut, amely a gyors Fourier-transzformáció számelméleti változata. Az ML-DSA tehát korántsem nélkülözi az FFT-gondolatokat; azok csak az aritmetikában rejlenek, nem az aláírási elvben.
7. A központi trükk: Module-LWE
A központi gondolat a Module Learning With Errors:
Ahol:
- — nyilvános, látszólag véletlen mátrix polinomokból
- — kis titkos vektorok
- — nyilvános érték
A támadó ismeri -t és -t, de nem ismeri -et és -t. Az egyenlet számára úgy néz ki, mint egy zajjal terhelt véletlen egyenlet. A kis titkokat nem tudja belőle hatékonyan visszaszámolni.
8. Egy parányi számpélda
Szándékosan nevetségesen kicsi változatot veszünk — közönséges számokat polinomok helyett, 2-es dimenziót 256 helyett, és
Legyen
Ekkor:
Ebben a miniformátumban végig lehetne próbálni az összes lehetőséget. Az ML-DSA-87 esetében az egy -es mátrix polinomokból, mindegyik 256 együtthatóval — ez több mint 14 000 ismeretlen a rácsstruktúrában.
9. Az aláíró szolgáltatás kulcspárja
A titkos kulcs többek között a kis vektorokat tartalmazza. Az ML-DSA-87-nél ezek együtthatói a következő intervallumból származnak:
tehát a halmazból. Ez a kicsiség nem részletkérdés, hanem a lényeg: csak azért jön létre egyáltalán nehéz rácsprobléma, mert a titkok kicsik.
A nyilvános kulcs leegyszerűsítve
A egy seed, amelyből az determinisztikusan rekonstruálható — a mátrixot tehát nem kell továbbítani. A a felső bitjeit jelenti; az alsó bit elmarad, ami jelentősen csökkenti a kulcs méretét. Ez az elhagyás lesz később az oka az úgynevezett hinteknek.
Ezzel létrejön a kívánt aszimmetria:
10. Az értékelésből szám lesz
Az aláíró szolgáltatás először a 2. szakaszban látott payload-objektumot hasítja:
A játékpéldánkban mesterséges mini-hasítást veszünk. A valódi rendszerben a 512 bit hosszú, és a nyilvános kulcsot is beleköti — ezáltal egy aláírás nem értelmezhető át egy másik kulcsra.
11. Commitment
Az aláíró szolgáltatás húz egy véletlen kis vektort. A példánkban:
Ebből keletkezik egy köztes érték, a commitment:
Ez még nem aláírás.
12. Az értékelésből challenge lesz
Az üzenetet és a commitmentet együtt hasítjuk:
Az ML-DSA-87-nél a olyan polinom, amelynek pontosan együtthatója van a halmazból, a maradék 196 pedig nulla. Ez a struktúra szándékos: kicsiben tartja a szorzatot.
A játékpéldánkban egyszerűen legyen
13. A tulajdonképpeni aláírás
A mi értékeinkkel:
14. A lépés, amelyet könnyű átugrani: rejection sampling
Itt van az a pont, ahol az ML-DSA különbözik egy naiv konstrukciótól — és ez nem opcionális.
A tartalmazza az titkot. Ha a -t egyszerűen mindig kiadnánk, az elég sok aláírásból statisztikailag kiszámolható lenne. Egy naponta nagyon sok aláírást előállító értékelőportál esetében ez nem elméleti kockázat.
Ezért az aláíró szolgáltatás a kiadás előtt ellenőrzi, hogy a túl sokat árul-e el, és ellenkező esetben elveti az aláírást — ilyenkor új véletlen -nal kezdünk elölről. Ezt hívják Fiat-Shamir with Aborts-nak.
A feltétel lényegében így hangzik:
Az ML-DSA-87-re és érvényes. Ehhez jön egy második korlát az alsó biteken. A gyakorlatban több menet is normális — az aláírás tehát hurkos eljárás, nem egyszeri lépés.
A verifikáció szempontjából fontos: pontosan ezt a korlátot ellenőrzi később a böngésző is. A túl nagy együtthatókkal rendelkező aláírást elutasítja, még akkor is, ha az egyenlet kijön.
15. Miért tudja a böngésző ezt ellenőrizni
Az olvasó böngészője ismeri:
- az értékelést, és ezzel az -et
- a nyilvános kulcsot
- a aláírást
Az -et nem ismeri. Az összefüggés, amely mégis továbbsegíti:
És mivel
fennáll, az ismeretlen helyettesíthető a nyilvános értékkel:
Ez a központi egyenlet — és valami fontosat mond: a böngésző nem pontosan rekonstruálja az -t, hanem csak a kicsi tag erejéig.
16. A minipélda a végéig
Ezek voltak az értékeink:
Számoljuk végig:
Az eredeti commitment ez volt:
A különbség
Tehát pontosan az előre jelzett kicsi hibatag. Az ellenőrző nem a -t kapja meg, hanem valamit, ami közel van a -hez.
Éppen ezért az ML-DSA nem magukat az értékeket hasonlítja össze, hanem azok felső bitjeit. És éppen ezért tartalmaz az aláírás egy további hint-vektort, -t: ez tömören közli, mely helyeken billent át a kerekítés a kicsi hibatag miatt egy határon. Az ML-DSA-87-nél legfeljebb ilyen jelzés megengedett. Ezek nem árulják el a titkot — csak a kerekítést javítják ki.
Végül a böngésző újraszámolja a challenge-t. Ha az egyezik,
és minden norma a korlátokon belül van, az aláírás érvényes.
17. Mi történik, ha valaki megváltoztatja az értékelést?
Tegyük fel, hogy valaki adatbázis-hozzáféréssel — akár nálunk valaki — megváltoztatja az értékelés szövegét vagy az egyik szívet. Ekkor a payloadban lévő két hasítóérték közül legalább az egyik megváltozik (h a szövegnél, rh az adatrekord bármely mezőjénél):
Ezzel megváltozik a challenge:
A meglévő aláírás azonban a régi challenge-re készült. A böngésző utánaszámol, és megállapítja:
A döntő mondat ehhez: egy értékelést törölni tudunk, de észrevétlenül megváltoztatni nem. A McGesundnál ugyanez az ellenőrzés éjszakánként a szerveroldalon is végigfut az állományon — az az értékelés, amely ezen az ellenőrzésen nem megy át, többé nem számít bele a cég átlagába.
18. Miért nem tud senki aláírást kitalálni?
A támadó ismeri az -t és a -t, de nem ismeri az -t. Egy érvényes aláírás felépítéséhez olyan hármast kellene találnia, amely
- kielégíti a verifikációs egyenletet és
- betartja a normakorlátokat és
- illeszkedik ahhoz a challenge-hez, amely pontosan ezekből az értékekből adódik.
Ez lényegében egy nehéz rácsproblémára vezet — konkrétan a Module-SIS-re: egy szerinti homogén egyenlet rövid megoldásait kell megtalálni. A kicsiségi feltétel itt nem díszítés, hanem maga a nehézség forrása. Nélküle a megoldás triviális volna.
19. Miért „module"?
A szó a struktúrát írja le az egyszerű vektorok és az általános rácsok között. Az ML-DSA nem egyes számokkal számol, hanem polinomvektorokkal:
és az ezekből képzett mátrixokkal:
Az előny: megkapjuk egy rács magas dimenzióját, de megtartunk egy tömör, hatékonyan számolható ábrázolást. A biztonság a mátrixméreten keresztül finomhangolható, gyűrűváltás nélkül.
20. Miért éppen 87?
A három szint nem a gyűrűben, hanem a dimenziókban különbözik:
| Paraméter | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Mátrixméret | |||
| Titoktartomány | 2 | 4 | 2 |
| Challenge-súly | 39 | 49 | 60 |
| Nyilvános kulcs | 1312 B | 1952 B | 2592 B |
| Aláírás | 2420 B | 3309 B | 4627 B |
| NIST-kategória | 2 | 3 | 5 |
Figyelemre méltó: az ML-DSA-87 nem egyszerűen „az ML-DSA-65, csak nagyobb". A titoktartomány 4-ről visszamegy 2-re; a biztonság itt a nagyobb mátrixból származik, nem a nagyobb együtthatókból. Önálló, szabványosított paraméterválasztásról van szó.
Az ár: 4627 bájt aláírásonként — bélyegzőnként, amelyet tárolni kell, és ellenőrzéskor ki kell szolgálni a böngészőnek. Ezért a McGesundnál az ML-DSA-87 mellett a FALCON is választható, amely 1280 bájtból kijön.
21. Fiat-Shamir: miért működik partner nélkül
Egy interaktív bizonyítás így zajlana:
- Az aláíró szolgáltatás küld egy commitmentet.
- Az ellenőrző küld egy véletlen challenge-t.
- Az aláíró szolgáltatás válaszol.
- Az ellenőrző utánaszámol.
Egy értékelésnél nincs ilyen párbeszéd — az olvasó hónapokkal később érkezik. A megoldás a Fiat-Shamir-transzformáció: a challenge-t nem kockával dobjuk, hanem magukból az adatokból hasítjuk:
Ezzel a párbeszédből dokumentum lesz. Az aláíró szolgáltatás nem választhatja meg a challenge-t, mert ahhoz a hasítófüggvényt kellene irányítania.
22. A teljes folyamat
23. Mit kezd ezzel konkrétan a McGesund
Három szint kapcsolódik egymásba:
A boríték. Minden aláírt értékelés hordoz egy Ed25519-aláírást. Ez a kötelező változat — klasszikus, parányi, minden böngészőben natívan ellenőrizhető.
A poszt-kvantum bélyegzők. Ezenkívül egy vagy két kvantumrezisztens aláírás helyezhető mellé. Hogy melyik, az a csomagtól függ:
| Csomag | elérhető aláírási szintek |
|---|---|
| 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, mindkettő párhuzamosan |
A párhuzamos változat szándékosan redundáns. Ha a két matematikai család egyike — NTRU-rácsok a FALCON-nál, modulrácsok az ML-DSA-nál — gyengébbnek bizonyulna a ma feltételezettnél, a másik tovább visz.
Az időhorgony. Az aláírókulcs ujjlenyomatát az OpenTimestamps segítségével egy Bitcoin-blokkban rögzítjük. Ezzel nemcsak az igazolható, hogy az aláírás valódi, hanem az is, hogy egy adott időpontban már létezett — anélkül, hogy bárkinek hinnie kellene a mi időbélyegünknek.
Mindezt az olvasó böngészőjében ellenőrizzük, egy WASM-modulon keresztül. Mi az adatokat szállítjuk; az utánaszámolás a látogató eszközén történik. Ha holnap lekapcsolnánk a hálózatról, egy egyszer letöltött értékelés akkor is ellenőrizhető maradna.
24. Az ML-DSA és a FALCON egymás mellett
| Tulajdonság | FALCON (FN-DSA) | ML-DSA |
|---|---|---|
| Típus | digitális aláírás | digitális aláírás |
| Rácscsalád | NTRU | Module-LWE / Module-SIS |
| Gyűrű | , | , |
| Alapmechanizmus | rövid vektor Gauss-mintavétellel | challenge-válasz megszakításokkal |
| FFT / NTT | lebegőpontos FFT, biztonságkritikus | NTT, csak aritmetika |
| Aláírás mérete (legmagasabb szint) | 1280 B | 4627 B |
| Implementáció | igényes (lebegőpont) | viszonylag egyenes vonalú |
| Szabványosítás | FIPS 206-ként (FN-DSA) tervezve, még nem lezárt | FIPS 204, lezárt |
Röviden: az ML-DSA-t könnyebb helyesen implementálni és ellenőrizni, a FALCON pedig lényegesen tömörebb aláírásokat ad. A QR-kódban egyik sem szerepel — ott egyedül az Ed25519-boríték áll. Az aláírás mérete ezért a tárolásnál és a kiszolgálásnál számít, a robusztusság pedig az implementációnál. Ezért kínáljuk mindkettőt.
25. Egy mondat, amit érdemes megjegyezni
Aki birtokolja a titkos vektort, ezredmásodpercek alatt ír alá. Aki nem birtokolja, annak több mint 14 000 dimenzióban kellene rácsproblémát megoldania — kvantumszámítógéppel is.
Egy értékelés olvasója számára ez egyszerűen azt jelenti: nem kell hinnie nekünk. Utánaszámolhat.