Signaturmetoder
SLH-DSA forklaret matematisk
Sådan underskriver SLH-DSA-SHA2-256f (FIPS 205) uden et eneste svært regneproblem ud over hashfunktioner — fra hashkæder over Merkle-træer til skoven af FORS-træer.
Opdateret: 2026-11-09
1. Hvad det handler om
Hos McGesund kan kunder i abonnementerne Anmeldelser Premium og Signaler Premium vælge signaturniveauet PQ-Dual-Diversified. Så bærer hver QR-kode ud over den klassiske Ed25519-signatur to kvanteresistente signaturer: ML-DSA-87 og SLH-DSA-SHA2-256f.
Dette indlæg forklarer den anden. Den er bygget anderledes end alt andet, vi bruger.
SLH-DSA er ikke kryptering. Indholdet forbliver offentligt læsbart. SLH-DSA beviser oprindelse og uforanderlighed — som enhver digital signatur.
SLH-DSA står for Stateless Hash-Based Digital Signature Algorithm. Den er udviklet ud fra SPHINCS+ og blev i 2024 standardiseret som FIPS 205. Navnet afslører allerede det særlige: Metoden bruger kun hashfunktioner. Ingen gitre, ingen elliptiske kurver, ingen store primtal.
2. Hvad bliver præcist signeret?
Hos McGesund signerer SLH-DSA det samme datasæt, som Ed25519-signaturen i QR-koden også dækker: QR-kodens payload. Den indeholder blandt andet, hvilken virksomhed koden hører til (fid), hvilken slags kode det er (typ), hvornår den blev udstedt (iat), og hvor længe den gælder (exp) — som en kompakt kodet bytefølge (CBOR).
Denne bytefølge er vores besked . Ændrer nogen bagefter en eneste bit, passer ingen af signaturerne længere.
SLH-DSA-signaturen sidder ikke i selve QR-koden. Med omkring 49 KB er den alt for stor til det. Den ligger som et selvstændigt „stempel“ ved QR-datasættet i McGesund-backend og hentes ind i browseren, når man klikker på „Tjek ægthed“.
3. Hvorfor en metode udelukkende af hashfunktioner?
Enhver signaturmetode bygger på en opgave, der praktisk talt er uløselig uden den hemmelige nøgle:
| Metode | Sikkerheden bygger på |
|---|---|
| Ed25519 | diskret logaritme på en elliptisk kurve |
| FALCON | korte vektorer i NTRU-gitre |
| ML-DSA | Module-LWE og Module-SIS (gitre) |
| SLH-DSA | kun egenskaber ved hashfunktionen |
Ed25519 ville en stor kvantecomputer bryde. FALCON og ML-DSA anses for kvanteresistente — men begge støtter sig til gitterproblemer. Skulle der en dag blive fundet et grundlæggende angreb på gitre, ville begge blive ramt på én gang.
SLH-DSA behøver derimod kun, at hashfunktionen gør det, den er bygget til:
Det er den længst og grundigst undersøgte antagelse i hele kryptografien. Selv en kvantecomputer hjælper her kun begrænset: Grover-algoritmen halverer sikkerhedsbittene. Derfor bruger 256-varianten hashværdier på byte bit — efter Grover er der stadig 128 bit tilbage.
Netop derfor hedder niveauet Diversified: ML-DSA (gitre) og SLH-DSA (hash) stammer fra forskellige matematiske familier. Falder den ene, bærer den anden.
4. Byggesten 1: at underskrive med hashkæder (WOTS+)
Grundidéen er overraskende enkel. Vi begynder med et enkelt ciffer.
Tag en hemmelig tilfældig værdi , og hash den igen og igen:
Enden af kæden, , bliver offentliggjort. Det er den offentlige nøgle for netop dette ene ciffer.
For at underskrive et ciffer mellem 0 og 15 udleverer man kædeværdien på position :
Den, der vil verificere, hasher yderligere gange. Kommer der præcis ud, er signaturen ægte:
Et mini-eksempel
Vi underskriver cifferet :
- Underskriveren offentliggør .
- Verifikatoren beregner og sammenligner med . Det passer.
En forfalsker, der har set , kan ud fra den uden besvær beregne , osv. — altså underskrive større cifre. Mindre kan han ikke, for så skulle han hashe baglæns.
Kontrolsummen mod „optælling“
For at ingen blot kan forhøje cifre, underskrives der desuden en kontrolsum:
Forhøjer en forfalsker et ciffer i beskeden, bliver mindre — og så skulle han regne baglæns i kontrolsummens kæde. Dermed er begge retninger spærret.
Opskaleret til en hashværdi
En hashværdi på 32 byte har 64 cifre i base 16. Dertil kommer 3 cifre kontrolsum:
En sådan signatur hedder WOTS+ (Winternitz One-Time Signature). Dens store hage ligger i navnet: One-Time — engangsbrug. Den, der underskriver to forskellige beskeder med samme nøgle, afslører så mange kædeværdier, at forfalskninger bliver mulige.
5. Byggesten 2: mange engangsnøgler under ét tag (Merkle-træ)
Når hver nøgle kun må bruges én gang, har man brug for rigtig mange af dem — men man vil kun offentliggøre én offentlig nøgle.
Løsningen er et Merkle-træ: De offentlige nøgler fra WOTS+-par udgør bladene. To naboer ad gangen hashes sammen, resultaterne igen parvis, indtil der øverst står en enkelt rod.
I SLH-DSA-SHA2-256f har hvert træ højden , altså blade.
For at vise, at et bestemt blad hører til træet, leverer man autentificeringsstien: de 4 søskendeknuder på vejen opad. Med dem hasher verifikatoren sig fra bladet op til roden. Kommer den kendte rod ud, hører bladet med.
6. Byggesten 3: træer oven på træer (hypertræ)
16 engangsnøgler rækker selvfølgelig ikke. Derfor stabler SLH-DSA træer oven på hinanden: Roden af et træ underskrives med en WOTS+-nøgle fra træet ovenover. Dette tårn kaldes hypertræet.
I SLH-DSA-SHA2-256f er der lag, hvert med højden 4:
Helt nederst står der dermed
blade til rådighed. Roden af det øverste træ hedder — den er den egentlige offentlige nøgle.
Vigtigt: Ingen beregner disse træer på forhånd. Alle hemmelige værdier afledes efter behov fra en hemmelig startværdi . Der gemmes kun fire værdier på hver 32 byte:
| Del | Indhold | Størrelse |
|---|---|---|
| SK.seed | startværdi for alle hemmelige kædeværdier | 32 B |
| SK.prf | startværdi for den tilfældige komponent | 32 B |
| PK.seed | offentlig startværdi, adskiller nøglepar fra hinanden | 32 B |
| PK.root | roden af det øverste træ | 32 B |
Den private nøgle består af alle fire (128 byte), den offentlige kun af PK.seed og PK.root (64 byte).
7. Byggesten 4: en skov mod tilfældige træffere (FORS)
Nu det egentlige problem: Hvordan ved underskriveren, hvilket af de blade der stadig er ubrugt?
Ældre hashbaserede metoder (XMSS, LMS) fører til det formål en tæller. Den må aldrig nulstilles — hverken af en backup eller af en anden server. Sker det alligevel, bliver en engangsnøgle brugt to gange, og metoden er brudt. Sådanne metoder kaldes tilstandsbehæftede.
SLH-DSA er tilstandsløs: Bladet vælges pseudotilfældigt ud fra selve beskeden. Så kan det ske, at to beskeder rammer det samme blad. Derfor hænger der helt nederst ikke en engangssignatur, men en få-gangssignatur: FORS (Forest of Random Subsets).
FORS består af små Merkle-træer med hver blade. Bladene er hemmelige tilfældige værdier.
For at underskrive deles beskedens hash op i 35 tal på hver 9 bit. Hvert tal vælger præcis ét blad i „sit“ træ. Signaturen indeholder for hvert træ:
- den hemmelige værdi for dette blad
- dets autentificeringssti (9 knuder)
En forfalsker skulle for en anden besked ramme blade i alle 35 træer, hvis hemmeligheder allerede er blevet afsløret. Selv hvis den samme FORS-instans er blevet brugt et par gange, er det håbløst.
8. Hele forløbet ved underskrivning
- Tilfældig komponent. Ud fra , et frisk tilfældigt tal og beskeden opstår en 32-byte-værdi .
- Beskedens hash.
Digestens 49 byte fordeles: 40 byte vælger de 35 FORS-blade, resten bestemmer, hvilket træ (
idx_tree) og hvilket blad (idx_leaf) helt nederst i hypertræet der bruges. - FORS-signatur over beskeden. Ud af den fremkommer en offentlig FORS-nøgle.
- Hypertræ-signatur over denne FORS-nøgle: 17 WOTS+-signaturer med hver sin autentificeringssti, lag for lag helt op til .
Den færdige signatur er simpelthen sammenkædningen:
9. Hvorfor signaturen fylder 49.856 byte
Med parametrene for SLH-DSA-SHA2-256f kan størrelsen regnes nøjagtigt efter ( byte pr. hashværdi):
| Del | Beregning | Byte |
|---|---|---|
| 32 | ||
| FORS | 11.200 | |
| Hypertræ | 38.624 | |
| I alt | 49.856 |
Til sammenligning: En Ed25519-signatur fylder 64 byte, ML-DSA-87 fylder 4.627 byte. Størrelsen er prisen for, at SLH-DSA klarer sig med intet andet end hashfunktioner.
10. Sådan verificerer browseren
At verificere betyder ved SLH-DSA: at hashe efter.
- Beregn digesten igen ud fra , den offentlige nøgle og beskeden.
- Beregn ud fra de 35 afslørede FORS-blade og deres stier de 35 trærødder og ud fra dem den offentlige FORS-nøgle.
- Hash med hver af de 17 WOTS+-signaturer kæderne til ende, dan den offentlige WOTS+-nøgle, og hash dig via stien op til træets rod.
- Til sidst skal der komme præcis ud.
Det er nogle tusind hashkald — en bagatel for en computer. I browseren tager verifikationen hos os omkring 6 til 12 millisekunder.
11. Hvad sker der, hvis nogen ændrer datasættet?
Ændrer blot én bit af beskeden sig, ændrer digesten sig fuldstændigt. Dermed peger de 35 tal på andre FORS-blade og metoden på en anden plads i hypertræet.
De afslørede hemmeligheder passer ikke længere: De efterregnede rødder afviger, og til sidst kommer der ikke ud. Verifikationen mislykkes.
For alligevel at bygge en gyldig signatur skulle en angriber kende hemmeligheder, der aldrig er blevet offentliggjort — altså regne en hashfunktion baglæns.
12. Hvorfor netop 256f?
FIPS 205 definerer tolv parametersæt: to hashfamilier (SHA-2 og SHAKE), tre sikkerhedsniveauer (128, 192, 256) og for hver en hurtig („f“) og en lille („s“) variant.
| Variant | Signatur | Underskrivning (hos os) | Verifikation |
|---|---|---|---|
| SHA2-256s | 29.792 B | ca. 2,6 s | ca. 3 ms |
| SHA2-256f | 49.856 B | ca. 0,26 s | ca. 6 ms |
256 betyder NIST-sikkerhedskategori 5 — samme niveau som FALCON-1024 og ML-DSA-87.
„f“ har vi valgt, fordi virksomheder kan udstede op til 500 QR-koder i ét hug. Med „s“ ville underskrivningen tage over 20 minutter, med „f“ under et minut. Til gengæld er signaturen større — men da den ikke sidder i QR-koden, er det til at leve med.
SHA-2 i stedet for SHAKE, fordi SHA-256 og SHA-512 er hardwareaccelereret på praktisk talt al hardware.
13. Tilfældighed ved underskrivning
FIPS 205 tillader to måder at danne på:
- deterministisk: samme besked, samme signatur
- randomiseret („hedged“): et frisk tilfældigt tal indgår
Vi bruger den randomiserede variant. To signaturer over den samme besked ser derfor forskellige ud — begge er gyldige. Det gør angreb sværere, der kombinerer målinger på enheden (strømforbrug, tid) med gentagne signaturer.
14. Hvad McGesund konkret bruger det til
Niveauet. PQ-Dual-Diversified findes i Anmeldelser Premium og Signaler Premium. En QR-kode bærer så tre signaturer:
| Signatur | Familie | Placering |
|---|---|---|
| Ed25519 | elliptisk kurve | i QR-koden |
| ML-DSA-87 | gitre | stempel i backend |
| SLH-DSA-SHA2-256f | hashfunktioner | stempel i backend |
Underskrivningen. En SLH-DSA-signatur koster omkring et kvart sekunds regnetid. For at serveren i mellemtiden forbliver tilgængelig for alle andre, regner egne baggrundstråde.
Verifikationen. Læserens browser henter begge stempler og verificerer dem med det samme WASM-modul som alle andre PQ-signaturer. Vi leverer data; regnearbejdet sker på den besøgendes enhed.
Afstemningen med NIST. Vores modul består de officielle NIST-testvektorer for SLH-DSA-SHA2-256f: Ud fra NIST's startværdier opstår byte for byte de samme nøgler, og alle bevidst manipulerede signaturer bliver afvist. Det kan du selv efterprøve i browseren på NIST-testsiden.
Tidsankeret. Som for alle nøgler forankres SLH-DSA-nøglens fingeraftryk via OpenTimestamps i en Bitcoin-blok.
15. SLH-DSA, ML-DSA og FALCON side om side
| Egenskab | FALCON (FN-DSA) | ML-DSA-87 | SLH-DSA-SHA2-256f |
|---|---|---|---|
| Grundlag | NTRU-gitre | module-gitre | kun hashfunktioner |
| Standard | FIPS 206 (under udarbejdelse) | FIPS 204, endelig | FIPS 205, endelig |
| Offentlig nøgle | 1.793 B | 2.592 B | 64 B |
| Signatur | 1.280 B | 4.627 B | 49.856 B |
| Underskrivning | millisekunder | millisekunder | ca. 0,26 s |
| Verifikation | millisekunder | millisekunder | millisekunder |
| Antagelse | gitterproblem | gitterproblem | hashfunktion |
Kort sagt: SLH-DSA er den langsomste og største af de tre metoder — og den mest konservative. Den bygger ikke på noget, som enhver anden signatur ikke allerede forudsætter: en sikker hashfunktion.
16. En sætning at tage med
Den, der besidder den hemmelige startværdi, underskriver på et kvart sekund. Den, der ikke besidder den, skulle regne SHA-256 eller SHA-512 baglæns — også med en kvantecomputer.
For den, der læser en anmeldelse, betyder det: Selv hvis alle gittermetoder en dag skulle falde, kan denne signatur stadig verificeres. Han behøver ikke tro på os. Han kan regne efter.