Handtekeningmethode

ML-DSA-87 wiskundig uitgelegd

Hoe ML-DSA-87 (FIPS 204) een McGesund-beoordeling ondertekent — van Module-LWE via rejection sampling tot de controle in de browser.

Stand: 2026-09-07

1. Waar het hier over gaat

Wanneer iemand bij McGesund een beoordeling indient, gebeurt er op de achtergrond meer dan de tekst doet vermoeden. De beoordeling wordt bij het verzenden digitaal ondertekend. Die handtekening kan elke bezoeker later in de eigen browser narekenen — zonder ons te vertrouwen en zonder het ons te vragen.

Voor klanten vanaf het tarief Pro gebeurt dat onder meer met ML-DSA-87. Deze bijdrage legt uit wat daarbij wiskundig gebeurt.

Vooraf van belang:

ML-DSA is geen versleuteling. De beoordelingstekst blijft openbaar leesbaar — dat is immers de zin van een beoordeling. ML-DSA bewijst geen geheimhouding, maar herkomst en integriteit.

ML-DSA is ontwikkeld uit CRYSTALS-Dilithium en is als FIPS 204 gestandaardiseerd. Het getal 87 duidt het parameterniveau aan. Er zijn er drie:

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

ML-DSA-87 is het hoogste en valt in NIST-beveiligingscategorie 5.


2. Wat wordt er precies ondertekend?

Niet de beoordelingstekst zelf gaat mee in de handtekening, maar een compact gegevensobject dat de tekst eenduidig vastlegt. Bij McGesund ziet dat er in de kern zo uit:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<bedrijfs-ID>",
  "c":   "<beoordelings-ID>",
  "h":   "<SHA-256 van de beoordelingstekst>",
  "rh":  "<SHA-256 van het volledige ingediende record>",
  "rv":  1,
  "qh":  "<SHA-256 van de QR-envelop, alleen bij QR-beoordelingen>",
  "iat": 1757203200
}

Dit object is ons bericht mm. Het bindt zes uitspraken samen:

  1. Bij welke onderneming de beoordeling hoort (f)
  2. Welke beoordeling bedoeld is (c)
  3. Welke tekst erachter stond — als hashwaarde (h)
  4. Welk record in totaal is ingediend (rh): tekst, hartjes, geostatus en gegevens over de aanleiding, canoniek geserialiseerd en gehasht — in schemaversie rv
  5. Uit welke QR-code de beoordeling afkomstig is (qh); zonder QR vervalt het veld
  6. Wanneer er is ondertekend (iat)

Wijzigt iemand later één enkel teken in de beoordelingstekst, dan klopt h niet meer — en rh evenmin. Wie in plaats daarvan alleen aan de hartjes draait, laat h onberoerd, maar breekt rh. Wijzigt iemand een van deze hashwaarden, dan past de handtekening niet meer. Precies deze keten is het punt.


3. Wat de handtekening moet leveren

Een bezoeker die de beoordeling leest, moet drie dingen zelf kunnen controleren:

  1. De beoordeling is daadwerkelijk door McGesund afgegeven.
  2. De tekst is sinds het verzenden niet gewijzigd.
  3. Niemand kan een nieuwe, geldig ogende beoordeling verzinnen.

Daarvoor bestaat een sleutelpaar:

  • een private sleutel — ligt uitsluitend in de ondertekeningsdienst
  • een openbare sleutel — mag iedereen hebben, wordt via de key-ID (kid) in de envelop aangesproken

Ondertekend wordt met de private sleutel. Gecontroleerd wordt met de openbare — en wel in de browser van de lezer, niet op onze server.


4. Waarom eigenlijk een post-quantummethode?

Veel van de vandaag gebruikelijke handtekeningmethoden berusten op het ontbinden van grote getallen in factoren of op discrete logaritmen. Een voldoende krachtige quantumcomputer zou precies deze problemen met bekende algoritmen aanzienlijk sneller kunnen oplossen.

Voor een beoordeling is dat geen academische vraag. Een beoordeling moet over tien jaar nog controleerbaar zijn. Wie vandaag ondertekent, ondertekent voor de volledige levensduur van de vermelding.

ML-DSA gebruikt daarom een andere grondslag:

Roosterproblemen\boxed{\text{Roosterproblemen}}

Preciezer: Module-LWE en Module-SIS.


5. Wat is een rooster?

Om te beginnen slechts punten in de ruimte. Nemen wij twee vectoren:

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

Alle geheeltallige combinaties

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

vormen het rooster. Bijvoorbeeld:

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
Twee vectoren, alle geheeltallige combinaties daarvan: een rooster. Het gemarkeerde punt ontstaat uit tweemaal b₁ en eenmaal b₂.

Het doorslaggevende:

In lage dimensies zijn roosterproblemen eenvoudig. In zeer hoge dimensies worden bepaalde opgaven extreem moeilijk.


6. Polynomen in plaats van losse getallen

ML-DSA rekent niet met 2D-vectoren, maar met polynomen en vectoren van polynomen.

Een polynoom als

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

laat zich als coëfficiëntenlijst schrijven:

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

Er wordt gerekend in een ring:

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

Dat betekent tweeërlei:

  • Zq\mathbb{Z}_q: rekenen modulo qq
  • xn=1x^n=-1: een extra regel die de polynoomlengte vastlegt

Voor alle drie de ML-DSA-niveaus geldt:

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

Een polynoom heeft dus 256 coëfficiënten, bekeken modulo 8.380.417. Wat er tussen de niveaus verandert, is niet nn of qq, maar de omvang van de matrices — daarover later meer.

Terzijde: polynoomvermenigvuldiging in deze ring loopt in de praktijk via de NTT, de getaltheoretische variant van de snelle fouriertransformatie. ML-DSA komt dus geenszins zonder FFT-ideeën uit; zij zitten alleen in de rekenkunde in plaats van in het handtekeningprincipe.


7. De centrale truc: Module-LWE

Het kernidee is Module Learning With Errors:

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

Daarbij zijn:

  • A\mathbf{A} — openbare, schijnbaar willekeurige matrix van polynomen
  • s1,s2\mathbf{s}_1,\mathbf{s}_2 — kleine geheime vectoren
  • t\mathbf{t} — openbare waarde

Een aanvaller kent A\mathbf{A} en t\mathbf{t}, maar niet s1,s2\mathbf{s}_1,\mathbf{s}_2. De vergelijking ziet er voor hem uit als een willekeurige vergelijking met ruis. De kleine geheimen zou hij daaruit niet efficiënt moeten kunnen terugrekenen.


8. Een piepklein getallenvoorbeeld

Wij nemen met opzet een belachelijk kleine variant — gewone getallen in plaats van polynomen, dimensie 2 in plaats van 256, en

q=17.q=17.

Zij

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

Dan:

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

In dit miniformaat zou u alle mogelijkheden kunnen uitproberen. Bij ML-DSA-87 is A\mathbf{A} een 8×78\times 7-matrix van polynomen met elk 256 coëfficiënten — dat zijn ruim 14.000 onbekenden in de roosterstructuur.


9. Het sleutelpaar van de ondertekeningsdienst

De private sleutel bevat onder meer de kleine vectoren s1,s2\mathbf{s}_1,\mathbf{s}_2. Bij ML-DSA-87 komen hun coëfficiënten uit het interval

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

dus uit {2,1,0,1,2}\{-2,-1,0,1,2\}. Deze kleinheid is geen detail, maar de kern: alleen doordat de geheimen klein zijn, ontstaat er pas een moeilijk roosterprobleem.

De openbare sleutel is vereenvoudigd

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

ρ\rho is een seed waaruit A\mathbf{A} deterministisch te reconstrueren is — de matrix hoeft dus niet te worden overgedragen. t1\mathbf{t}_1 zijn de bovenste bits van t\mathbf{t}; de onderste d=13d=13 bits vallen weg, wat de sleutel aanzienlijk verkleint. Deze weglating is later de reden voor de zogenoemde hints.

Daarmee ontstaat de gewenste asymmetrie:

openbaar controleren    geheim ondertekenen\boxed{\text{openbaar controleren}\;\neq\;\text{geheim ondertekenen}}

10. De beoordeling wordt een getal

De ondertekeningsdienst hasht eerst het payload-object uit hoofdstuk 2:

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

In ons speelgoedvoorbeeld nemen wij een kunstmatige minihash. In het echte systeem is μ\mu 512 bit lang en bindt daarnaast de openbare sleutel mee — daardoor laat een handtekening zich niet naar een andere sleutel omduiden.


11. Commitment

De ondertekeningsdienst trekt een willekeurige kleine vector y\mathbf{y}. In ons voorbeeld:

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

Daaruit ontstaat een tussenwaarde, het 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}.

Dat is nog geen handtekening.


12. Uit de beoordeling wordt een challenge

Bericht en commitment worden samen gehasht:

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

Bij ML-DSA-87 is cc een polynoom met precies τ=60\tau=60 coëfficiënten uit {1,+1}\{-1,+1\}, alle overige 196 zijn nul. Deze structuur is gewild: zij houdt cs1c\cdot\mathbf{s}_1 klein.

In ons speelgoedvoorbeeld nemen wij eenvoudigweg

c=2.c=2.

13. De eigenlijke handtekening

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

Met onze waarden:

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. De stap die men gemakkelijk over het hoofd ziet: rejection sampling

Hier ligt het punt waarop ML-DSA zich van een naïeve constructie onderscheidt — en hij is niet optioneel.

z=y+cs1\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 bevat het geheim s1\mathbf{s}_1. Zou men z\mathbf{z} eenvoudigweg altijd afgeven, dan liet s1\mathbf{s}_1 zich uit voldoende veel handtekeningen statistisch terugrekenen. Bij een beoordelingsportaal met zeer veel handtekeningen per dag is dat geen theoretisch risico.

Daarom controleert de ondertekeningsdienst vóór de afgifte of z\mathbf{z} te veel verraadt, en verwerpt hij de handtekening anders — dan wordt er met een nieuwe willekeurige y\mathbf{y} opnieuw begonnen. Dat heet Fiat-Shamir with Aborts.

De voorwaarde luidt in wezen:

z<γ1β.\|\mathbf{z}\|_\infty < \gamma_1-\beta.
commitment w = Aychallenge c = H(μ, w)antwoord z = y + c · s₁‖z‖∞ < γ₁ − β ?jahandtekening wordt afgegevennee — nieuwe y
Drie stappen en een lus. Valt z te groot uit, dan wordt er niet bijgeschaafd — de hele doorloop wordt verworpen en er wordt met een verse willekeurige y opnieuw begonnen. Daarom is ondertekenen hier een lusmethode.

Voor ML-DSA-87 geldt γ1=219\gamma_1=2^{19} en β=τη=602=120\beta=\tau\cdot\eta=60\cdot2=120. Daar komt een tweede grens op de onderste bits bij. In de praktijk zijn meerdere doorlopen normaal — het ondertekenen is dus een lusmethode, geen eenmalige stap.

Voor de verificatie is van belang: precies deze grens controleert de browser later mee. Een handtekening met te grote coëfficiënten wordt afgewezen, zelfs wanneer de vergelijking klopt.


15. Waarom de browser dat kan controleren

De browser van de lezer kent:

  • de beoordeling en daarmee mm
  • de openbare sleutel (ρ,t1)(\rho,\mathbf{t}_1)
  • de handtekening (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h})

Hij kent s1\mathbf{s}_1 niet. Het verband dat hem toch verder helpt:

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.

En omdat

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

geldt, laat het onbekende As1A\mathbf{s}_1 zich door de openbare waarde vervangen:

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

Dat is de centrale vergelijking — en zij zegt iets belangrijks: de browser reconstrueert AyA\mathbf{y} niet exact, maar slechts op de kleine term cs2c\,\mathbf{s}_2 na.


16. Het minivoorbeeld tot het einde

Wij hadden:

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

Laten wij narekenen:

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

Het oorspronkelijke commitment was

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

Het verschil bedraagt

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

Dus precies de voorspelde kleine foutterm. De verifier krijgt niet w\mathbf{w}, maar iets dat dicht bij w\mathbf{w} ligt.

Precies daarom vergelijkt ML-DSA niet de waarden zelf, maar hun bovenste bits. En precies daarom bevat de handtekening daarnaast een hint-vector h\mathbf{h}: die deelt compact mee op welke plaatsen de afronding door de kleine foutterm over een grens is gekanteld. Bij ML-DSA-87 zijn ten hoogste ω=75\omega=75 van zulke aanwijzingen toegestaan. Zij verraden het geheim niet — zij repareren alleen de afronding.

Aan het einde berekent de browser de challenge opnieuw. Komt zij overeen,

cnieuw=c,c_{\text{nieuw}}=c,

en liggen alle normen binnen de grenzen, dan is de handtekening geldig.


17. Wat er gebeurt wanneer iemand de beoordeling wijzigt?

Stel dat iemand met databasetoegang — ook iemand bij ons — de beoordelingstekst of een van de hartjes wijzigt. Dan verandert ten minste een van de twee hashwaarden in de payload (h bij de tekst, rh bij elk veld van het record):

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

Daarmee verandert de challenge:

cc.c\neq c'.

De aanwezige handtekening is echter voor de oude challenge gemaakt. De browser rekent na en stelt vast:

cnieuwchandtekeningHandtekening ongeldigc_{\text{nieuw}}\neq c_{\text{handtekening}} \quad\Longrightarrow\quad \boxed{\text{Handtekening ongeldig}}

De doorslaggevende zin daarbij: wij kunnen een beoordeling verwijderen, maar wij kunnen haar niet onopgemerkt veranderen. Bij McGesund loopt dezelfde controle daarnaast elke nacht aan serverzijde over het bestand — een beoordeling die deze controle niet doorstaat, telt niet meer mee in het gemiddelde van de onderneming.


18. Waarom kan niemand een handtekening verzinnen?

Een aanvaller kent A\mathbf{A} en t\mathbf{t}, maar niet s1,s2\mathbf{s}_1,\mathbf{s}_2. Om een geldige handtekening te bouwen zou hij een drietal (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) moeten vinden dat

  • aan de verificatievergelijking voldoet en
  • de normgrenzen aanhoudt en
  • past bij de challenge die uit precies deze waarden zelf volgt.

Dat komt in de kern neer op een moeilijk roosterprobleem — concreet op Module-SIS: korte oplossingen vinden van een homogene vergelijking modulo qq. De kleinheidsvoorwaarde is daarbij geen bijzaak, maar de eigenlijke moeilijkheidsgraad. Zonder haar zou een oplossing triviaal zijn.

openbare gegevens    moeilijk roosterprobleem\boxed{\text{openbare gegevens}\;\rightarrow\;\text{moeilijk roosterprobleem}}

19. Waarom „Module"?

Het woord beschrijft de structuur tussen eenvoudige vectoren en algemene roosters. In plaats van met losse getallen te rekenen, werkt ML-DSA met vectoren van polynomen:

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

en met matrices daarvan:

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

Het voordeel: u krijgt de hoge dimensie van een rooster, maar behoudt een compacte, efficiënt berekenbare voorstelling. De veiligheid laat zich via de matrixgrootte fijnregelen, zonder van ring te wisselen.


20. Waarom uitgerekend 87?

De drie niveaus verschillen niet in de ring, maar in de dimensies:

ParameterML-DSA-44ML-DSA-65ML-DSA-87
Matrixgrootte (k,)(k,\ell)4×44\times46×56\times58×78\times7
Geheimbereik η\eta242
Challenge-gewicht τ\tau394960
Openbare sleutel1.312 B1.952 B2.592 B
Handtekening2.420 B3.309 B4.627 B
NIST-categorie235

Opmerkelijk: ML-DSA-87 is niet eenvoudigweg „ML-DSA-65, alleen groter". Het geheimbereik η\eta gaat van 4 weer terug naar 2; de veiligheid komt hier uit de grotere matrix, niet uit grotere coëfficiënten. Het gaat om een zelfstandige, gestandaardiseerde parameterkeuze.

grotere wiskundige structuurhogere veiligheidsmarge\boxed{\text{grotere wiskundige structuur}\rightarrow\text{hogere veiligheidsmarge}}

De prijs: 4.627 byte per handtekening — per stempel dat wordt opgeslagen en bij het controleren aan de browser wordt uitgeleverd. Daarom staat bij McGesund naast ML-DSA-87 ook FALCON ter keuze, dat met 1.280 byte toekomt.


21. Fiat-Shamir: waarom het zonder tegenpartij werkt

Een interactief bewijs zou zo verlopen:

  1. De ondertekeningsdienst stuurt een commitment.
  2. De controleur stuurt een willekeurige challenge.
  3. De ondertekeningsdienst antwoordt.
  4. De controleur rekent na.

Bij een beoordeling bestaat die dialoog niet — de lezer komt maanden later. De oplossing is de Fiat-Shamir-transformatie: de challenge wordt niet gedobbeld, maar uit de gegevens zelf gehasht:

c=H(openbare sleutel,  bericht,  commitment).c=H(\text{openbare sleutel},\;\text{bericht},\;\text{commitment}).

Daarmee wordt uit een dialoog een document. De ondertekeningsdienst kan de challenge niet uitkiezen, want daarvoor zou hij de hash moeten beheersen.


22. Het volledige verloop

ONDERTEKENINGSDIENST (MCGESUND)BROWSER VAN DE BEZOEKERprivate sleutel s₁, s₂payload m = {bedrijf, beoordeling, h, rh, iat}hash μwillekeurige vector ycommitment w = Aychallenge c = H(μ, w)z = y + c · s₁handtekening (c, z, hints) + kidbeoordeling + handtekening + openb. sleutelAz − c·t → bovenste bits + hintschallenge opnieuw berekenenopnieuw berekende challenge = meegeleverde?geldigongeldigverwerpen als z te groot is(rejection sampling)
De hele weg van een beoordeling. De gestippelde terugsprong is het rejection sampling — hij wordt zo vaak genomen tot z klein genoeg is om niets over de geheime sleutel te verraden.

23. Wat McGesund er concreet mee doet

Drie lagen grijpen in elkaar:

De envelop. Elke ondertekende beoordeling draagt een Ed25519-handtekening. Dat is de verplichte variant — klassiek, piepklein, in elke browser natief controleerbaar.

De post-quantumstempels. Daarnaast kunnen een of twee quantumresistente handtekeningen ernaast worden gelegd. Welke, hangt af van het tarief:

Tariefbeschikbare handtekeningniveaus
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, beide parallel

De parallelle variant is bewust redundant. Mocht een van de twee wiskundige families — NTRU-roosters bij FALCON, module-roosters bij ML-DSA — zwakker blijken dan vandaag wordt aangenomen, dan draagt de andere verder.

Het tijdanker. De vingerafdruk van de ondertekeningssleutel wordt via OpenTimestamps in een Bitcoin-blok verankerd. Daarmee valt niet alleen aan te tonen dat de handtekening echt is, maar ook dat zij op een bepaald tijdstip al bestond — zonder dat iemand ons tijdstempel hoeft te geloven.

Gecontroleerd wordt dat alles in de browser van de lezer, via een WASM-module. Wij leveren de gegevens; nagerekend wordt er op het apparaat van de bezoeker. Zouden wij morgen offline gaan, dan bleef een eenmaal gedownloade beoordeling controleerbaar.


24. ML-DSA en FALCON naast elkaar

EigenschapFALCON (FN-DSA)ML-DSA
Typedigitale handtekeningdigitale handtekening
RoosterfamilieNTRUModule-LWE / Module-SIS
RingZq[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
Kernmechanismekorte vector via gauss-samplingchallenge-antwoord met afbrekingen
FFT / NTTdrijvendekomma-FFT, veiligheidskritischNTT, alleen rekenkunde
Handtekeninggrootte (hoogste niveau)1.280 B4.627 B
Implementatieveeleisend (drijvende komma)betrekkelijk rechttoe rechtaan
Standaardiseringals FIPS 206 (FN-DSA) voorzien, nog niet afgerondFIPS 204, afgerond

Kort gezegd: ML-DSA is eenvoudiger correct te implementeren en te controleren, FALCON levert duidelijk compactere handtekeningen. In de QR-code zit geen van beide — daar staat alleen de Ed25519-envelop. De handtekeninggrootte telt daarom bij opslag en uitlevering, de robuustheid bij de implementatie. Daarom bieden wij beide aan.


25. Eén zin om te onthouden

ML-DSA maakt uit een korte geheime vector een antwoord op eenchallenge die uit de beoordeling zelf is gehasht — controleerbaarvoor iedereen met de openbare sleutel.\boxed{ \begin{array}{c} \text{ML-DSA maakt uit een korte geheime vector een antwoord op een}\\ \text{challenge die uit de beoordeling zelf is gehasht — controleerbaar}\\ \text{voor iedereen met de openbare sleutel.} \end{array}}

Wie de geheime vector bezit, ondertekent in milliseconden. Wie hem niet bezit, zou een roosterprobleem in ruim 14.000 dimensies moeten oplossen — ook met een quantumcomputer.

Voor de lezer van een beoordeling betekent dat eenvoudigweg: hij hoeft ons niet te geloven. Hij kan narekenen.