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 . Het bindt zes uitspraken samen:
- Bij welke onderneming de beoordeling hoort (
f) - Welke beoordeling bedoeld is (
c) - Welke tekst erachter stond — als hashwaarde (
h) - Welk record in totaal is ingediend (
rh): tekst, hartjes, geostatus en gegevens over de aanleiding, canoniek geserialiseerd en gehasht — in schemaversierv - Uit welke QR-code de beoordeling afkomstig is (
qh); zonder QR vervalt het veld - 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:
- De beoordeling is daadwerkelijk door McGesund afgegeven.
- De tekst is sinds het verzenden niet gewijzigd.
- 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:
Preciezer: Module-LWE en Module-SIS.
5. Wat is een rooster?
Om te beginnen slechts punten in de ruimte. Nemen wij twee vectoren:
Alle geheeltallige combinaties
vormen het rooster. Bijvoorbeeld:
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
laat zich als coëfficiëntenlijst schrijven:
Er wordt gerekend in een ring:
Dat betekent tweeërlei:
- : rekenen modulo
- : een extra regel die de polynoomlengte vastlegt
Voor alle drie de ML-DSA-niveaus geldt:
Een polynoom heeft dus 256 coëfficiënten, bekeken modulo 8.380.417. Wat er tussen de niveaus verandert, is niet of , 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:
Daarbij zijn:
- — openbare, schijnbaar willekeurige matrix van polynomen
- — kleine geheime vectoren
- — openbare waarde
Een aanvaller kent en , maar niet . 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
Zij
Dan:
In dit miniformaat zou u alle mogelijkheden kunnen uitproberen. Bij ML-DSA-87 is een -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 . Bij ML-DSA-87 komen hun coëfficiënten uit het interval
dus uit . 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
is een seed waaruit deterministisch te reconstrueren is — de matrix hoeft dus niet te worden overgedragen. zijn de bovenste bits van ; de onderste bits vallen weg, wat de sleutel aanzienlijk verkleint. Deze weglating is later de reden voor de zogenoemde hints.
Daarmee ontstaat de gewenste asymmetrie:
10. De beoordeling wordt een getal
De ondertekeningsdienst hasht eerst het payload-object uit hoofdstuk 2:
In ons speelgoedvoorbeeld nemen wij een kunstmatige minihash. In het echte systeem is 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 . In ons voorbeeld:
Daaruit ontstaat een tussenwaarde, het commitment:
Dat is nog geen handtekening.
12. Uit de beoordeling wordt een challenge
Bericht en commitment worden samen gehasht:
Bij ML-DSA-87 is een polynoom met precies coëfficiënten uit , alle overige 196 zijn nul. Deze structuur is gewild: zij houdt klein.
In ons speelgoedvoorbeeld nemen wij eenvoudigweg
13. De eigenlijke handtekening
Met onze waarden:
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.
bevat het geheim . Zou men eenvoudigweg altijd afgeven, dan liet 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 te veel verraadt, en verwerpt hij de handtekening anders — dan wordt er met een nieuwe willekeurige opnieuw begonnen. Dat heet Fiat-Shamir with Aborts.
De voorwaarde luidt in wezen:
Voor ML-DSA-87 geldt en . 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
- de openbare sleutel
- de handtekening
Hij kent niet. Het verband dat hem toch verder helpt:
En omdat
geldt, laat het onbekende zich door de openbare waarde vervangen:
Dat is de centrale vergelijking — en zij zegt iets belangrijks: de browser reconstrueert niet exact, maar slechts op de kleine term na.
16. Het minivoorbeeld tot het einde
Wij hadden:
Laten wij narekenen:
Het oorspronkelijke commitment was
Het verschil bedraagt
Dus precies de voorspelde kleine foutterm. De verifier krijgt niet , maar iets dat dicht bij ligt.
Precies daarom vergelijkt ML-DSA niet de waarden zelf, maar hun bovenste bits. En precies daarom bevat de handtekening daarnaast een hint-vector : 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 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,
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):
Daarmee verandert de challenge:
De aanwezige handtekening is echter voor de oude challenge gemaakt. De browser rekent na en stelt vast:
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 en , maar niet . Om een geldige handtekening te bouwen zou hij een drietal 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 . De kleinheidsvoorwaarde is daarbij geen bijzaak, maar de eigenlijke moeilijkheidsgraad. Zonder haar zou een oplossing triviaal zijn.
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:
en met matrices daarvan:
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:
| Parameter | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Matrixgrootte | |||
| Geheimbereik | 2 | 4 | 2 |
| Challenge-gewicht | 39 | 49 | 60 |
| Openbare sleutel | 1.312 B | 1.952 B | 2.592 B |
| Handtekening | 2.420 B | 3.309 B | 4.627 B |
| NIST-categorie | 2 | 3 | 5 |
Opmerkelijk: ML-DSA-87 is niet eenvoudigweg „ML-DSA-65, alleen groter". Het geheimbereik 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.
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:
- De ondertekeningsdienst stuurt een commitment.
- De controleur stuurt een willekeurige challenge.
- De ondertekeningsdienst antwoordt.
- 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:
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
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:
| Tarief | beschikbare handtekeningniveaus |
|---|---|
| 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, 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
| Eigenschap | FALCON (FN-DSA) | ML-DSA |
|---|---|---|
| Type | digitale handtekening | digitale handtekening |
| Roosterfamilie | NTRU | Module-LWE / Module-SIS |
| Ring | , | , |
| Kernmechanisme | korte vector via gauss-sampling | challenge-antwoord met afbrekingen |
| FFT / NTT | drijvendekomma-FFT, veiligheidskritisch | NTT, alleen rekenkunde |
| Handtekeninggrootte (hoogste niveau) | 1.280 B | 4.627 B |
| Implementatie | veeleisend (drijvende komma) | betrekkelijk rechttoe rechtaan |
| Standaardisering | als FIPS 206 (FN-DSA) voorzien, nog niet afgerond | FIPS 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
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.