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 mm üzenetünk. Hat állítást köt össze:

  1. Melyik céghez tartozik az értékelés (f)
  2. Melyik értékelésről van szó (c)
  3. Milyen szöveg állt mögötte — hasítóértékként (h)
  4. Ö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 — az rv sémaverzióban
  5. Melyik QR-kódból származik az értékelés (qh); QR nélkül ez a mező elmarad
  6. 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:

  1. Az értékelést valóban a McGesund állította ki.
  2. A szöveget a beküldés óta nem változtatták meg.
  3. 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:

Raˊcsprobleˊmaˊk\boxed{\text{Rácsproblémák}}

Pontosabban: Module-LWE és Module-SIS.


5. Mi az a rács?

Egyelőre csak pontok a térben. Vegyünk két vektort:

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

Az összes egész együtthatós kombináció

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

alkotja a rácsot. Például:

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
Két vektor, és az összes belőlük képzett egész együtthatós kombináció: ez egy rács. A kijelölt pont kétszer b₁-ből és egyszer b₂-ből keletkezik.

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

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

felírható együtthatólistaként:

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

A számítás egy gyűrűben történik:

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

Ez két dolgot jelent:

  • Zq\mathbb{Z}_q: számolás modulo qq
  • xn=1x^n=-1: kiegészítő szabály, amely rögzíti a polinom hosszát

Mindhárom ML-DSA-szintre érvényes:

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

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 nn vagy a qq, 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:

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

Ahol:

  • A\mathbf{A} — nyilvános, látszólag véletlen mátrix polinomokból
  • s1,s2\mathbf{s}_1,\mathbf{s}_2 — kis titkos vektorok
  • t\mathbf{t} — nyilvános érték

A támadó ismeri A\mathbf{A}-t és t\mathbf{t}-t, de nem ismeri s1\mathbf{s}_1-et és s2\mathbf{s}_2-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

q=17.q=17.

Legyen

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

Ekkor:

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

Ebben a miniformátumban végig lehetne próbálni az összes lehetőséget. Az ML-DSA-87 esetében az A\mathbf{A} egy 8×78\times 7-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 s1,s2\mathbf{s}_1,\mathbf{s}_2 vektorokat tartalmazza. Az ML-DSA-87-nél ezek együtthatói a következő intervallumból származnak:

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

tehát a {2,1,0,1,2}\{-2,-1,0,1,2\} 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

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

A ρ\rho egy seed, amelyből az A\mathbf{A} determinisztikusan rekonstruálható — a mátrixot tehát nem kell továbbítani. A t1\mathbf{t}_1 a t\mathbf{t} felső bitjeit jelenti; az alsó d=13d=13 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:

nyilvaˊnosan elleno˝rizni    titokban alaˊıˊrni\boxed{\text{nyilvánosan ellenőrizni}\;\neq\;\text{titokban aláírni}}

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:

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

A játékpéldánkban mesterséges mini-hasítást veszünk. A valódi rendszerben a μ\mu 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 y\mathbf{y} vektort. A példánkban:

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

Ebből keletkezik egy köztes érték, a commitment:

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

Ez még nem aláírás.


12. Az értékelésből challenge lesz

Az üzenetet és a commitmentet együtt hasítjuk:

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

Az ML-DSA-87-nél a cc olyan polinom, amelynek pontosan τ=60\tau=60 együtthatója van a {1,+1}\{-1,+1\} halmazból, a maradék 196 pedig nulla. Ez a struktúra szándékos: kicsiben tartja a cs1c\cdot\mathbf{s}_1 szorzatot.

A játékpéldánkban egyszerűen legyen

c=2.c=2.

13. A tulajdonképpeni aláírás

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

A mi értékeinkkel:

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. 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 z=y+cs1\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 tartalmazza az s1\mathbf{s}_1 titkot. Ha a z\mathbf{z}-t egyszerűen mindig kiadnánk, az s1\mathbf{s}_1 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 z\mathbf{z} túl sokat árul-e el, és ellenkező esetben elveti az aláírást — ilyenkor új véletlen y\mathbf{y}-nal kezdünk elölről. Ezt hívják Fiat-Shamir with Aborts-nak.

A feltétel lényegében így hangzik:

z<γ1β.\|\mathbf{z}\|_\infty < \gamma_1-\beta.
commitment w = Aychallenge c = H(μ, w)válasz z = y + c · s₁‖z‖∞ < γ₁ − β ?igenaz aláírás kiadásra kerülnem — új y
Három lépés és egy hurok. Ha a z túl nagyra sikerül, nem javítgatunk rajta — az egész menetet elvetjük, és friss véletlen y-nal kezdjük újra. Ezért az aláírás itt hurkos eljárás.

Az ML-DSA-87-re γ1=219\gamma_1=2^{19} és β=τη=602=120\beta=\tau\cdot\eta=60\cdot2=120 é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 mm-et
  • a (ρ,t1)(\rho,\mathbf{t}_1) nyilvános kulcsot
  • a (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) aláírást

Az s1\mathbf{s}_1-et nem ismeri. Az összefüggés, amely mégis továbbsegíti:

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.

És mivel

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

fennáll, az ismeretlen As1A\mathbf{s}_1 helyettesíthető a nyilvános értékkel:

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

Ez a központi egyenlet — és valami fontosat mond: a böngésző nem pontosan rekonstruálja az AyA\mathbf{y}-t, hanem csak a kicsi cs2c\,\mathbf{s}_2 tag erejéig.


16. A minipélda a végéig

Ezek voltak az értékeink:

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

Számoljuk végig:

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

Az eredeti commitment ez volt:

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

A különbség

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

Tehát pontosan az előre jelzett kicsi hibatag. Az ellenőrző nem a w\mathbf{w}-t kapja meg, hanem valamit, ami közel van a w\mathbf{w}-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, h\mathbf{h}-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 ω=75\omega=75 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,

cuˊj=c,c_{\text{új}}=c,

é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):

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

Ezzel megváltozik a challenge:

cc.c\neq c'.

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:

cuˊjcalaˊıˊraˊsAz alaˊıˊraˊeˊrveˊnytelenc_{\text{új}}\neq c_{\text{aláírás}} \quad\Longrightarrow\quad \boxed{\text{Az aláírás érvénytelen}}

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 A\mathbf{A}-t és a t\mathbf{t}-t, de nem ismeri az s1,s2\mathbf{s}_1,\mathbf{s}_2-t. Egy érvényes aláírás felépítéséhez olyan (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) 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 qq 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.

nyilvaˊnos adatok    neheˊz raˊcsprobleˊma\boxed{\text{nyilvános adatok}\;\rightarrow\;\text{nehéz rácsprobléma}}

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:

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

és az ezekből képzett mátrixokkal:

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

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éterML-DSA-44ML-DSA-65ML-DSA-87
Mátrixméret (k,)(k,\ell)4×44\times46×56\times58×78\times7
Titoktartomány η\eta242
Challenge-súly τ\tau394960
Nyilvános kulcs1312 B1952 B2592 B
Aláírás2420 B3309 B4627 B
NIST-kategória235

Figyelemre méltó: az ML-DSA-87 nem egyszerűen „az ML-DSA-65, csak nagyobb". A titoktartomány η\eta 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ó.

nagyobb matematikai struktuˊranagyobb biztonsaˊgi tartaleˊk\boxed{\text{nagyobb matematikai struktúra}\rightarrow\text{nagyobb biztonsági tartalék}}

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:

  1. Az aláíró szolgáltatás küld egy commitmentet.
  2. Az ellenőrző küld egy véletlen challenge-t.
  3. Az aláíró szolgáltatás válaszol.
  4. 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:

c=H(nyilvaˊnos kulcs,  u¨zenet,  commitment).c=H(\text{nyilvános kulcs},\;\text{üzenet},\;\text{commitment}).

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

ALÁÍRÓ SZOLGÁLTATÁS (MCGESUND)A LÁTOGATÓ BÖNGÉSZŐJEtitkos kulcs s₁, s₂payload m = {cég, értékelés, h, rh, iat}hasítóérték μvéletlen vektor ycommitment w = Aychallenge c = H(μ, w)z = y + c · s₁aláírás (c, z, hintek) + kidértékelés + aláírás + nyilv. kulcsAz − c·t → felső bitek + hintekchallenge újraszámolásaaz újraszámolt challenge = a kapott?érvényesérvénytelenelvetés, ha z túl nagy(rejection sampling)
Egy értékelés teljes útja. A szaggatott visszaugrás a rejection sampling — annyiszor futunk rajta végig, amíg a z elég kicsi nem lesz ahhoz, hogy semmit ne áruljon el a titkos kulcsról.

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:

Csomagelérhető aláírási szintek
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, 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ágFALCON (FN-DSA)ML-DSA
Típusdigitális aláírásdigitális aláírás
RácscsaládNTRUModule-LWE / Module-SIS
GyűrűZq[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
Alapmechanizmusrövid vektor Gauss-mintavétellelchallenge-válasz megszakításokkal
FFT / NTTlebegőpontos FFT, biztonságkritikusNTT, csak aritmetika
Aláírás mérete (legmagasabb szint)1280 B4627 B
Implementációigényes (lebegőpont)viszonylag egyenes vonalú
SzabványosításFIPS 206-ként (FN-DSA) tervezve, még nem lezártFIPS 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

Az ML-DSA egy ro¨vid titkos vektorboˊl vaˊlaszt aˊllıˊt elo˝ egy olyankihıˊvaˊsra, amelyet magaˊboˊl az eˊrteˊkeleˊsbo˝l hasıˊtottak — ezta nyilvaˊnos kulccsal baˊrki elleno˝rizheti.\boxed{ \begin{array}{c} \text{Az ML-DSA egy rövid titkos vektorból választ állít elő egy olyan}\\ \text{kihívásra, amelyet magából az értékelésből hasítottak — ezt}\\ \text{a nyilvános kulccsal bárki ellenőrizheti.} \end{array}}

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.