Signaturmetoder
ML-DSA-87 matematiskt förklarat
Hur ML-DSA-87 (FIPS 204) undertecknar ett omdöme på McGesund — från Module-LWE över Rejection Sampling till verifieringen i webbläsaren.
Uppdaterat: 2026-09-07
1. Vad det handlar om
När någon lämnar ett omdöme på McGesund sker mer i bakgrunden än texten låter ana. Omdömet signeras digitalt när det skickas in. Denna signatur kan varje besökare senare räkna efter i sin egen webbläsare — utan att lita på oss och utan att fråga oss.
För kunder från abonnemanget Pro och uppåt sker det bland annat med ML-DSA-87. Denna artikel förklarar vad som matematiskt sker.
Viktigt att slå fast först:
ML-DSA är ingen kryptering. Omdömestexten förblir offentligt läsbar — det är ju hela poängen med ett omdöme. ML-DSA bevisar inte sekretess, utan ursprung och oförändrat innehåll.
ML-DSA utvecklades ur CRYSTALS-Dilithium och är standardiserad som FIPS 204. Talet 87 betecknar parameternivån. Det finns tre:
- ML-DSA-44
- ML-DSA-65
- ML-DSA-87
ML-DSA-87 är den högsta och ligger i NIST:s säkerhetskategori 5.
2. Vad signeras egentligen?
Det är inte omdömestexten själv som vandrar in i signaturen, utan ett kompakt dataobjekt som entydigt spikar fast texten. Hos McGesund ser det i kärnan ut så här:
{
"v": 1,
"typ": "rev-comment",
"f": "<Företags-ID>",
"c": "<Omdömes-ID>",
"h": "<SHA-256 av omdömestexten>",
"rh": "<SHA-256 av hela den inskickade datamängden>",
"rv": 1,
"qh": "<SHA-256 av QR-envelopen, endast vid QR-omdömen>",
"iat": 1757203200
}
Detta objekt är vårt meddelande . Det binder samman sex utsagor:
- Till vilket företag omdömet hör (
f) - Vilket omdöme som avses (
c) - Vilken text som låg bakom — som hashvärde (
h) - Vilken datamängd i sin helhet som lämnades in (
rh): text, hjärtan, geostatus och uppgifter om anledning, kanoniskt serialiserade och hashade — i schemaversionenrv - Ur vilken QR-kod omdömet kommer (
qh); utan QR utgår fältet - När signeringen skedde (
iat)
Ändrar någon senare ett enda tecken i omdömestexten stämmer h inte längre — och inte rh heller. Den som i stället bara skruvar på hjärtana lämnar h orört, men bryter rh. Ändrar någon ett av dessa hashvärden stämmer signaturen inte längre. Just denna kedja är poängen.
3. Vad signaturen ska åstadkomma
En besökare som läser omdömet ska själv kunna kontrollera tre saker:
- Omdömet utfärdades faktiskt av McGesund.
- Texten har inte ändrats sedan inskickandet.
- Ingen kan hitta på ett nytt, giltigt utseende omdöme.
För detta finns ett nyckelpar:
- en privat nyckel — ligger uteslutande i signaturtjänsten
- en offentlig nyckel — får alla ha, adresseras via nyckel-ID:t (
kid) i envelopen
Signeringen sker med den privata nyckeln. Verifieringen sker med den offentliga — och det i läsarens webbläsare, inte på vår server.
4. Varför över huvud taget en post-kvantmetod?
Många i dag vanliga signaturmetoder vilar på faktorisering av stora tal eller på diskreta logaritmer. En tillräckligt kraftfull kvantdator skulle kunna lösa just dessa problem avsevärt snabbare med kända algoritmer.
För ett omdöme är det ingen akademisk fråga. Ett omdöme ska gå att kontrollera även om tio år. Den som undertecknar i dag undertecknar för hela postens livslängd.
ML-DSA använder därför en annan grund:
Närmare bestämt: Module-LWE och Module-SIS.
5. Vad är ett gitter?
Till att börja med bara punkter i rummet. Låt oss ta två vektorer:
Alla heltalskombinationer
bildar gittret. Till exempel:
Det avgörande:
I små dimensioner är gitterproblem lätta. I mycket höga dimensioner blir vissa uppgifter extremt svåra.
6. Polynom i stället för enskilda tal
ML-DSA räknar inte med 2D-vektorer, utan med polynom och vektorer av polynom.
Ett polynom som
går att skriva som koefficientlista:
Räkningen sker i en ring:
Det betyder två saker:
- : räkning modulo
- : en tilläggsregel som fixerar polynomlängden
För alla tre ML-DSA-nivåer gäller:
Ett polynom har alltså 256 koefficienter, betraktade modulo 8 380 417. Det som ändras mellan nivåerna är inte eller , utan matrisernas storlek — mer om det senare.
För övrigt: polynommultiplikation i denna ring sker i praktiken via NTT, den talteoretiska varianten av den snabba fouriertransformen. ML-DSA klarar sig alltså ingalunda utan FFT-idéer; de sitter bara i aritmetiken i stället för i signaturprincipen.
7. Det centrala knepet: Module-LWE
Kärnidén är Module Learning With Errors:
Här är:
- — offentlig, skenbart slumpmässig matris av polynom
- — små hemliga vektorer
- — offentligt värde
En angripare känner och , men inte . Ekvationen ser för honom ut som en slumpmässig ekvation med brus. De små hemligheterna ska han inte kunna räkna tillbaka ur den på ett effektivt sätt.
8. Ett pyttelitet sifferexempel
Vi tar avsiktligt en löjligt liten variant — vanliga tal i stället för polynom, dimension 2 i stället för 256, och
Låt
Då:
I detta miniformat skulle man kunna pröva alla möjligheter. Hos ML-DSA-87 är en -matris av polynom med 256 koefficienter vardera — det är över 14 000 obekanta i gitterstrukturen.
9. Signaturtjänstens nyckelpar
Den privata nyckeln innehåller bland annat de små vektorerna . Hos ML-DSA-87 kommer deras koefficienter ur intervallet
alltså ur . Denna litenhet är ingen detalj, utan själva kärnan: bara för att hemligheterna är små uppstår över huvud taget ett svårt gitterproblem.
Den offentliga nyckeln är förenklat
är en seed ur vilken deterministiskt går att rekonstruera — matrisen behöver alltså inte överföras. är de övre bitarna av ; de undre bitarna faller bort, vilket förminskar nyckeln avsevärt. Denna utelämning är senare skälet till de så kallade hintarna.
Därmed uppstår den önskade asymmetrin:
10. Omdömet blir ett tal
Signaturtjänsten hashar först nyttolastobjektet ur avsnitt 2:
I vårt leksaksexempel tar vi en konstruerad minihash. I det verkliga systemet är 512 bitar långt och binder dessutom in den offentliga nyckeln — därigenom går en signatur inte att omtolka till att gälla en annan nyckel.
11. Commitment
Signaturtjänsten drar en slumpmässig liten vektor . I vårt exempel:
Ur den uppstår ett mellanvärde, commitmentet:
Det är ännu ingen signatur.
12. Ur omdömet blir en utmaning
Meddelande och commitment hashas samman:
Hos ML-DSA-87 är ett polynom med exakt koefficienter ur , alla övriga 196 är noll. Denna struktur är avsiktlig: den håller litet.
I vårt leksaksexempel sätter vi helt enkelt
13. Själva signaturen
Med våra värden:
14. Steget som man lätt förbiser: Rejection Sampling
Här ligger punkten där ML-DSA skiljer sig från en naiv konstruktion — och den är inte valfri.
innehåller hemligheten . Om man alltid bara gav ut skulle gå att räkna fram statistiskt ur tillräckligt många signaturer. Hos en omdömesportal med mycket många signaturer per dag är det ingen teoretisk risk.
Därför prövar signaturtjänsten före utgivningen om röjer för mycket, och förkastar annars signaturen — då börjar man om från början med ett nytt slumpmässigt . Detta kallas Fiat-Shamir with Aborts.
Villkoret lyder i allt väsentligt:
För ML-DSA-87 gäller och . Därtill kommer en andra gräns på de undre bitarna. I praktiken är flera genomlopp normalt — signeringen är alltså ett slingförfarande, inte ett enda steg.
För verifieringen är det viktigt att: exakt denna gräns prövar webbläsaren senare också. En signatur med för stora koefficienter avvisas, även om ekvationen går ihop.
15. Varför webbläsaren kan pröva detta
Läsarens webbläsare känner till:
- omdömet och därmed
- den offentliga nyckeln
- signaturen
Den känner inte . Sambandet som ändå för den vidare:
Och eftersom
gäller, går det okända att ersätta med det offentliga värdet:
Det är den centrala ekvationen — och den säger något viktigt: webbläsaren rekonstruerar inte exakt, utan bara så när som på den lilla termen .
16. Miniexemplet ända till slutet
Vi hade:
Låt oss räkna efter:
Det ursprungliga commitmentet var
Differensen är
Alltså exakt den förutsagda lilla feltermen. Verifieraren får inte , utan något som ligger nära .
Just därför jämför ML-DSA inte värdena själva, utan deras övre bitar. Och just därför innehåller signaturen dessutom en hint-vektor : den meddelar kompakt på vilka ställen avrundningen har tippat över en gräns på grund av den lilla feltermen. Hos ML-DSA-87 är högst sådana hintar tillåtna. De röjer inte hemligheten — de reparerar bara avrundningen.
Till slut beräknar webbläsaren utmaningen på nytt. Stämmer den överens,
och ligger alla normer inom gränserna, är signaturen giltig.
17. Vad händer om någon ändrar omdömet?
Anta att någon med databasåtkomst — även någon hos oss — ändrar omdömestexten eller ett av hjärtana. Då ändras minst ett av de båda hashvärdena i nyttolasten (h vid texten, rh vid varje fält i datamängden):
Därmed ändras utmaningen:
Den befintliga signaturen skapades dock för den gamla utmaningen. Webbläsaren räknar efter och konstaterar:
Den avgörande meningen om detta: vi kan radera ett omdöme, men vi kan inte ändra det obemärkt. Hos McGesund körs samma kontroll dessutom nattetid på serversidan över hela beståndet — ett omdöme som inte klarar denna kontroll räknas inte längre in i företagets snittbetyg.
18. Varför kan ingen hitta på en signatur?
En angripare känner och , men inte . För att bygga en giltig signatur skulle han behöva hitta en trippel som
- uppfyller verifieringsekvationen och
- håller sig inom normgränserna och
- passar till den utmaning som följer ur just dessa värden själva.
Det leder i kärnan till ett svårt gitterproblem — konkret till Module-SIS: att hitta korta lösningar till en homogen ekvation modulo . Litenhetsvillkoret är därvid ingen utsmyckning, utan den egentliga svårighetsgraden. Utan det vore en lösning trivial.
19. Varför "Module"?
Ordet beskriver strukturen mellan enkla vektorer och allmänna gitter. I stället för att räkna med enskilda tal arbetar ML-DSA med vektorer av polynom:
och med matriser av dessa:
Fördelen: man får ett gitters höga dimension, men behåller en kompakt, effektivt beräkningsbar framställning. Säkerheten går att finjustera via matrisstorleken, utan att byta ring.
20. Varför just 87?
De tre nivåerna skiljer sig inte i ringen, utan i dimensionerna:
| Parameter | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Matrisstorlek | |||
| Hemlighetsintervall | 2 | 4 | 2 |
| Utmaningsvikt | 39 | 49 | 60 |
| Offentlig nyckel | 1 312 B | 1 952 B | 2 592 B |
| Signatur | 2 420 B | 3 309 B | 4 627 B |
| NIST-kategori | 2 | 3 | 5 |
Anmärkningsvärt: ML-DSA-87 är inte helt enkelt "ML-DSA-65, bara större". Hemlighetsintervallet går från 4 tillbaka till 2; säkerheten kommer här ur den större matrisen, inte ur större koefficienter. Det rör sig om ett eget, standardiserat parameterval.
Priset: 4 627 byte per signatur — per stämpel som lagras och levereras till webbläsaren vid verifieringen. Därför står hos McGesund även FALCON till buds vid sidan av ML-DSA-87, som klarar sig med 1 280 byte.
21. Fiat-Shamir: varför det fungerar utan motpart
Ett interaktivt bevis skulle löpa så här:
- Signaturtjänsten skickar ett commitment.
- Verifieraren skickar en slumpmässig utmaning.
- Signaturtjänsten svarar.
- Verifieraren räknar efter.
Vid ett omdöme finns inte denna dialog — läsaren kommer månader senare. Lösningen är Fiat-Shamir-transformationen: utmaningen slås inte fram med tärning, utan hashas fram ur uppgifterna själva:
Därmed blir en dialog till ett dokument. Signaturtjänsten kan inte välja utmaningen, för då skulle den behöva kontrollera hashen.
22. Hela förloppet
23. Vad McGesund konkret gör med detta
Tre nivåer griper i varandra:
Envelopen. Varje signerat omdöme bär en Ed25519-signatur. Det är obligatoriet — klassisk, pytteliten, nativt verifierbar i varje webbläsare.
Post-kvantstämplarna. Dessutom kan en eller två kvantresistenta signaturer läggas bredvid. Vilka beror på abonnemanget:
| Abonnemang | tillgängliga signaturnivåer |
|---|---|
| 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, båda parallellt |
Den parallella varianten är medvetet redundant. Skulle en av de båda matematiska familjerna — NTRU-gitter hos FALCON, modulgitter hos ML-DSA — visa sig svagare än vad man i dag antar bär den andra vidare.
Tidsankaret. Signaturnyckelns fingeravtryck förankras via OpenTimestamps i ett Bitcoin-block. Därmed går det inte bara att belägga att signaturen är äkta, utan också att den redan fanns vid en bestämd tidpunkt — utan att någon behöver tro på vår tidsstämpel.
Allt detta verifieras i läsarens webbläsare, via en WASM-modul. Vi levererar data; efterräkningen sker på besökarens enhet. Om vi gick ned från nätet i morgon skulle ett en gång nedladdat omdöme förbli kontrollerbart.
24. ML-DSA och FALCON sida vid sida
| Egenskap | FALCON (FN-DSA) | ML-DSA |
|---|---|---|
| Typ | digital signatur | digital signatur |
| Gitterfamilj | NTRU | Module-LWE / Module-SIS |
| Ring | , | , |
| Kärnmekanism | kort vektor via gauss-sampling | utmaning och svar med avbrott |
| FFT / NTT | flyttals-FFT, säkerhetskritisk | NTT, endast aritmetik |
| Signaturstorlek (högsta nivån) | 1 280 B | 4 627 B |
| Implementation | krävande (flyttal) | jämförelsevis rättfram |
| Standardisering | avsedd som FIPS 206 (FN-DSA), ännu inte avslutad | FIPS 204, avslutad |
Kort sagt: ML-DSA är lättare att implementera och granska korrekt, FALCON levererar betydligt kompaktare signaturer. I QR-koden sitter ingen av dem — där står enbart Ed25519-envelopen. Signaturstorleken räknas därför vid lagring och leverans, robustheten vid implementationen. Därför erbjuder vi bådadera.
25. En mening att ta med sig
Den som äger den hemliga vektorn signerar på millisekunder. Den som inte äger den skulle behöva lösa ett gitterproblem i över 14 000 dimensioner — även med en kvantdator.
För läsaren av ett omdöme betyder det helt enkelt: han behöver inte tro oss. Han kan räkna efter.