Allkirjastamismeetod

SLH-DSA matemaatiliselt selgitatud

Kuidas SLH-DSA-SHA2-256f (FIPS 205) allkirjastab, toetudes ainsa raske ülesandena räsifunktsioonidele — räsiahelatest üle Merkle-puude kuni FORS-puude metsani.

Seisuga: 2026-11-09

1. Millest siin jutt käib

McGesundis saavad klientid paketis Hinnangud Premium ja Signaalid Premium valida allkirjataseme PQ-Dual-Diversified. Siis kannab iga QR-kood lisaks klassikalisele Ed25519 allkirjale kaht kvantiresistentset allkirja: ML-DSA-87 ja SLH-DSA-SHA2-256f.

See artikkel selgitab neist teist. See on üles ehitatud teisiti kui kõik muu, mida me kasutame.

SLH-DSA ei ole krüpteerimine. Sisu jääb avalikult loetavaks. SLH-DSA tõendab päritolu ja terviklikkust — nagu iga digitaalallkiri.

SLH-DSA tähendab välja kirjutatuna Stateless Hash-Based Digital Signature Algorithm. See on välja arendatud SPHINCS+-ist ja standarditi 2024. aastal kui FIPS 205. Juba nimi reedab erilise: meetod kasutab ainult räsifunktsioone. Ei mingeid võresid, elliptilisi kõveraid ega suuri algarve.


2. Mida täpselt allkirjastatakse?

McGesundis allkirjastab SLH-DSA sama andmekirje, mida katab ka QR-koodis olev Ed25519 allkiri: QR-koodi payloadi. See sisaldab muu hulgas, millisele ettevõttele kood kuulub (fid), mis tüüpi see on (typ), millal see väljastati (iat) ja mis ajani see kehtib (exp) — kompaktselt kodeeritud baidijadana (CBOR).

See baidijada on meie sõnum MM. Kui keegi muudab hiljem üht ainsat bitti, ei sobi ükski allkiri enam.

SLH-DSA allkiri ei asu QR-koodis endas. Umbes 49 KB-ga on see selleks liiga suur. See on McGesundi taustasüsteemis QR-kirje juures eraldi „templina“ ja laaditakse brauserisse, kui klõpsate nupul „Kontrolli autentsust“.


3. Miks meetod, mis koosneb ainult räsifunktsioonidest?

Iga allkirjastamismeetod põhineb ülesandel, mis on ilma salajase võtmeta praktiliselt lahendamatu:

MeetodTurvalisus põhineb
Ed25519diskreetsel logaritmil elliptilisel kõveral
FALCONlühikestel vektoritel NTRU-võredes
ML-DSAModule-LWE-l ja Module-SIS-il (võred)
SLH-DSAainult räsifunktsiooni omadustel

Ed25519 murraks suur kvantarvuti. FALCONit ja ML-DSA-d peetakse kvantiresistentseks — kuid mõlemad toetuvad võreülesannetele. Kui ühel päeval leitaks võrede vastu põhimõtteline rünne, oleksid mõlemad korraga ohus.

SLH-DSA vajab seevastu vaid seda, et räsifunktsioon teeks seda, milleks see on ehitatud:

Va¨a¨rtusest H(x) ei saa x-i tagasi arvutada, ja teist x′-i, mille puhul H(x′)=H(x), ei leia keegi.\text{Väärtusest } H(x) \text{ ei saa } x \text{-i tagasi arvutada, ja teist } x' \text{-i, mille puhul } H(x') = H(x) \text{, ei leia keegi.}

See on kogu krüptograafia kõige kauem ja põhjalikumalt uuritud eeldus. Ka kvantarvuti aitab siin vaid piiratult: Groveri algoritm poolitab turvabitid. Seepärast kasutab variant 256 räsiväärtusi pikkusega n=32n = 32 baiti =256= 256 bitti — pärast Groverit jääb alles ikka veel 128 bitti.

Just seepärast nimetataksegi taset Diversified: ML-DSA (võred) ja SLH-DSA (räsi) pärinevad eri matemaatilistest perekondadest. Kui üks langeb, kannab teine edasi.


4. Ehitusplokk 1: allkirjastamine räsiahelatega (WOTS+)

Põhiidee on üllatavalt lihtne. Alustame ühestainsast numbrist.

Võta salajane juhuslik väärtus ss ja räsi seda ikka ja jälle:

s  →  H(s)  →  H2(s)  →  …  →  H15(s)=ps \;\to\; H(s) \;\to\; H^2(s) \;\to\; \dots \;\to\; H^{15}(s) = p

Ahela lõpp pp avaldatakse. See on selle ühe numbri avalik võti.

Et allkirjastada number dd vahemikus 0 kuni 15, antakse välja ahela väärtus positsioonil dd:

σ=Hd(s)\sigma = H^{d}(s)

Kes tahab kontrollida, räsib σ\sigma-t veel 15−d15 - d korda edasi. Kui tulemuseks on täpselt pp, on allkiri ehtne:

H15−d(σ)=?pH^{15-d}(\sigma) \stackrel{?}{=} p

Pisike näide

Allkirjastame numbri d=6d = 6:

  • Allkirjastaja avaldab σ=H6(s)\sigma = H^6(s).
  • Kontrollija arvutab H9(σ)=H15(s)H^{9}(\sigma) = H^{15}(s) ja võrdleb seda pp-ga. Sobib.

Võltsija, kes on σ\sigma-t näinud, saab sellest vaevata arvutada H7(s)H^7(s), H8(s)H^8(s) jne — ehk allkirjastada suuremaid numbreid. Väiksemaid ta ei saa, selleks peaks ta räsima tagurpidi.

Kontrollsumma „ülesloendamise“ vastu

Et keegi ei saaks numbreid lihtsalt suurendada, allkirjastatakse lisaks kontrollsumma:

C=∑i(15−di)C = \sum_{i} (15 - d_i)

Kui võltsija suurendab sõnumi mõnd numbrit, muutub CC väiksemaks — ja selleks peaks ta kontrollsumma ahelas tagurpidi arvutama. Sellega on mõlemad suunad suletud.

Kogu räsiväärtuse ulatuses

32-baidisel räsiväärtusel on 64 numbrit alusel 16. Neile lisanduvad 3 kontrollsumma numbrit:

len=64+3=67 ahelat\text{len} = 64 + 3 = 67 \text{ ahelat}

Sellist allkirja nimetatakse WOTS+ (Winternitz One-Time Signature). Selle suur konks peitub nimes: One-Time. Kes allkirjastab sama võtmega kaks erinevat sõnumit, reedab nii palju ahela väärtusi, et võltsingud muutuvad võimalikuks.


5. Ehitusplokk 2: palju ühekordseid võtmeid ühe katuse all (Merkle-puu)

Kui iga võtit tohib kasutada vaid korra, on neid vaja väga palju — kuid avaldada tahetakse ainult üht avalikku võtit.

Lahendus on Merkle-puu: 2h′2^{h'} WOTS+-võtmepaari avalikud võtmed moodustavad lehed. Kaks naabrit räsitakse alati kokku, tulemused omakorda paarikaupa, kuni üleval on üksainus juur.

so˜lm=H(vasak ∥ parem)\text{sõlm} = H(\text{vasak} \,\|\, \text{parem})

SLH-DSA-SHA2-256f puhul on igal puul kõrgus h′=4h' = 4, seega 24=162^4 = 16 lehte.

Et näidata, et teatud leht kuulub puusse, antakse autentimistee: 4 õdesõlme teel üles. Nende abil räsib kontrollija end lehelt juureni üles. Kui tulemuseks on tuntud juur, kuulub leht puusse.


6. Ehitusplokk 3: puud puude peal (hüperpuu)

16 ühekordsest võtmest muidugi ei piisa. Seepärast laob SLH-DSA puid üksteise peale: puu juur allkirjastatakse ülemise puu WOTS+-võtmega. Seda torni nimetatakse hüperpuuks.

SLH-DSA-SHA2-256f puhul on d=17d = 17 kihti, igaüks kõrgusega 4:

h=d⋅h′=17⋅4=68h = d \cdot h' = 17 \cdot 4 = 68

Päris all on seega kasutada

268≈2,95⋅10202^{68} \approx 2{,}95 \cdot 10^{20}

lehte. Kõige ülemise puu juurt nimetatakse PK.root\text{PK.root} — see ongi tegelik avalik võti.

Oluline: keegi ei arvuta neid puid ette. Kõik salajased väärtused tuletatakse vajaduse korral salajasest algväärtusest SK.seed\text{SK.seed}. Salvestatakse ainult neli väärtust, igaüks 32 baiti:

OsaSisuSuurus
SK.seedalgväärtus kõigi salajaste ahela väärtuste jaoks32 B
SK.prfalgväärtus juhuslikkuse komponendi RR jaoks32 B
PK.seedavalik algväärtus, eristab võtmepaare üksteisest32 B
PK.rootkõige ülemise puu juur32 B

Privaatvõti koosneb kõigist neljast (128 baiti), avalik võti ainult PK.seed-ist ja PK.root-ist (64 baiti).


7. Ehitusplokk 4: mets juhuslike tabamuste vastu (FORS)

Nüüd tegelik probleem: kust teab allkirjastaja, milline 2682^{68} lehest on veel kasutamata?

Vanemad räsipõhised meetodid (XMSS, LMS) peavad selleks loendurit. Seda ei tohi kunagi lähtestada — ei varukoopia ega teise serveri kaudu. Kui see siiski juhtub, kasutatakse ühekordset võtit kaks korda ja meetod on murtud. Selliseid meetodeid nimetatakse olekupõhisteks.

SLH-DSA on olekuta: leht valitakse sõnumi enda põhjal pseudojuhuslikult. Siis võib juhtuda, et kaks sõnumit tabavad sama lehte. Seepärast ei ripu päris all mitte ühekordne allkiri, vaid mõnekordne allkiri: FORS (Forest of Random Subsets).

FORS koosneb k=35k = 35 väikesest Merkle-puust, millest igaühel on 2a=29=5122^a = 2^9 = 512 lehte. Lehed on salajased juhuslikud väärtused.

Allkirjastamiseks jagatakse sõnumi räsi 35 arvuks, igaüks 9 bitti. Iga arv valib „oma“ puus täpselt ühe lehe. Allkiri sisaldab iga puu kohta:

  • selle lehe salajast väärtust
  • selle autentimisteed (9 sõlme)

Võltsija peaks teise sõnumi jaoks tabama kõigis 35 puus lehti, mille saladused on juba reedetud. Isegi kui sama FORS-instantsi on kasutatud paar korda, on see lootusetu.


8. Allkirjastamise kogu kulg

  1. Juhuslikkuse komponent. SK.prf\text{SK.prf}-ist, värskest juhuslikust arvust ja sõnumist tekib 32-baidine väärtus RR.
  2. Sõnumi räsi.
    digest=Hmsg(R, PK.seed, PK.root, M)\text{digest} = H_{\text{msg}}(R,\ \text{PK.seed},\ \text{PK.root},\ M)
    Digesti 49 baiti jagatakse: 40 baiti valivad 35 FORS-lehte, ülejäänu määrab, millist puud (idx_tree) ja millist lehte (idx_leaf) hüperpuu päris all kasutatakse.
  3. FORS-allkiri sõnumi üle. Sellest saadakse FORS-i avalik võti.
  4. Hüperpuu allkiri selle FORS-võtme üle: 17 WOTS+-allkirja, igaühel oma autentimistee, kiht kihi haaval kuni PK.root\text{PK.root}-ini üles.

Valmis allkiri on lihtsalt nende järjestikku sidumine:

σ=R ∥ σFORS ∥ σHT\sigma = R \,\|\, \sigma_{\text{FORS}} \,\|\, \sigma_{\text{HT}}

9. Miks allkiri on 49 856 baiti suur

SLH-DSA-SHA2-256f parameetritega saab suuruse täpselt järele arvutada (n=32n = 32 baiti räsiväärtuse kohta):

OsaArvutusBaiti
RRnn32
FORSk⋅(1+a)⋅n=35⋅10⋅32k \cdot (1 + a) \cdot n = 35 \cdot 10 \cdot 3211 200
Hüperpuu(h+d⋅len)⋅n=(68+17⋅67)⋅32(h + d \cdot \text{len}) \cdot n = (68 + 17 \cdot 67) \cdot 3238 624
Kokku49 856

Võrdluseks: Ed25519 allkiri on 64 baiti, ML-DSA-87 oma 4 627 baiti. Suurus on hind selle eest, et SLH-DSA saab hakkama ainult räsifunktsioonidega.


10. Kuidas brauser kontrollib

SLH-DSA puhul tähendab kontrollimine: uuesti räsimist.

  1. Arvutada digest RR-ist, avalikust võtmest ja sõnumist uuesti.
  2. Arvutada 35 avaldatud FORS-lehest ja nende teedest 35 puu juurt ning neist FORS-i avalik võti.
  3. Räsida iga 17 WOTS+-allkirjaga ahelad lõpuni, moodustada WOTS+-i avalik võti ja räsida tee kaudu puu juureni üles.
  4. Lõpuks peab tulemuseks olema täpselt PK.root\text{PK.root}.

See on mõni tuhat räsikutset — arvuti jaoks tühiasi. Brauseris võtab kontroll meil umbes 6 kuni 12 millisekundit.


11. Mis juhtub, kui keegi andmekirjet muudab?

Kui muutub kas või üks bitt sõnumist MM, muutub digest täielikult. Sellega osutavad 35 arvu teistele FORS-lehtedele ja meetod teisele kohale hüperpuus.

Avaldatud saladused ei sobi enam: järele arvutatud juured erinevad ja lõpuks ei tule välja PK.root\text{PK.root}. Kontroll kukub läbi.

Et sellest hoolimata kehtiv allkiri ehitada, peaks ründaja teadma saladusi, mida pole kunagi avaldatud — ehk arvutama räsifunktsiooni tagurpidi.


12. Miks just 256f?

FIPS 205 määratleb kaksteist parameetrikomplekti: kaks räsiperekonda (SHA-2 ja SHAKE), kolm turvataset (128, 192, 256) ning kummagi jaoks kiire („f“) ja väike („s“) variant.

VariantAllkiriAllkirjastamine (meil)Kontroll
SHA2-256s29 792 Bu 2,6 su 3 ms
SHA2-256f49 856 Bu 0,26 su 6 ms

256 tähendab NISTi turvakategooriat 5 — sama taset kui FALCON-1024 ja ML-DSA-87.

„f“ valisime, sest ettevõtted saavad väljastada kuni 500 QR-koodi korraga. „s“-iga kestaks allkirjastamine üle 20 minuti, „f“-iga alla minuti. Selle eest on allkiri suurem — kuna see ei ole QR-koodis, on see talutav.

SHA-2 SHAKE asemel, sest SHA-256 ja SHA-512 on praktiliselt igal riistvaral kiirendatud.


13. Juhuslikkus allkirjastamisel

FIPS 205 lubab RR-i luua kahel viisil:

  • deterministlikult: sama sõnum, sama allkiri
  • randomiseeritult („hedged“): lisatakse värske juhuslik arv

Meie kasutame randomiseeritud varianti. Kaks sama sõnumi allkirja näevad seetõttu erinevad välja — mõlemad on kehtivad. See raskendab ründeid, mis kombineerivad seadmel tehtud mõõtmisi (voolutarve, aeg) korduvate allkirjadega.


14. Mida McGesund sellega konkreetselt teeb

Tase. PQ-Dual-Diversified on saadaval paketis Hinnangud Premium ja Signaalid Premium. QR-kood kannab siis kolme allkirja:

AllkiriPerekondAsukoht
Ed25519elliptiline kõverQR-koodis
ML-DSA-87võredtempel taustasüsteemis
SLH-DSA-SHA2-256fräsifunktsioonidtempel taustasüsteemis

Allkirjastamine. Üks SLH-DSA allkiri võtab umbes veerand sekundit arvutusaega. Et server jääks selle ajal kõigile teistele kättesaadavaks, arvutavad eraldi taustalõimed.

Kontroll. Lugeja brauser laadib mõlemad templid ja kontrollib neid sama WASM-mooduliga nagu kõiki teisi PQ-allkirju. Meie tarnime andmed, arvutatakse külastaja seadmes.

Võrdlus NISTiga. Meie moodul läbib SLH-DSA-SHA2-256f ametlikud NISTi testvektorid: NISTi algväärtustest tekivad baidi haaval samad võtmed ja kõik meelega manipuleeritud allkirjad lükatakse tagasi. Seda saate NISTi testlehel ise brauseris kontrollida.

Ajaankur. Nagu kõigi võtmete puhul, ankurdatakse SLH-DSA võtme sõrmejälg OpenTimestampsi kaudu Bitcoini plokki.


15. SLH-DSA, ML-DSA ja FALCON kõrvuti

OmadusFALCON (FN-DSA)ML-DSA-87SLH-DSA-SHA2-256f
AlusNTRU-võredmoodulvõredainult räsifunktsioonid
StandardFIPS 206 (töös)FIPS 204, lõplikFIPS 205, lõplik
Avalik võti1 793 B2 592 B64 B
Allkiri1 280 B4 627 B49 856 B
Allkirjastaminemillisekundidmillisekundidu 0,26 s
Kontrollmillisekundidmillisekundidmillisekundid
Eeldusvõreülesannevõreülesanneräsifunktsioon

Lühidalt: SLH-DSA on kolmest meetodist kõige aeglasem ja suurem — ja kõige konservatiivsem. See ei toetu millelegi, mida iga teine allkiri niikuinii ei eeldaks: turvalisele räsifunktsioonile.


16. Üks lause kaasavõtmiseks

SLH-DSA allkirjastab ra¨siahelatega, koondab need Merkle-puudesseja valib lehe so˜numi enda po˜hjal — turvaline seni, kunira¨sifunktsioon on turvaline.\boxed{ \begin{array}{c} \text{SLH-DSA allkirjastab räsiahelatega, koondab need Merkle-puudesse}\\ \text{ja valib lehe sõnumi enda põhjal — turvaline seni, kuni}\\ \text{räsifunktsioon on turvaline.} \end{array}}

Kellel on salajane algväärtus, allkirjastab veerand sekundiga. Kellel seda ei ole, peaks SHA-256 või SHA-512 tagurpidi arvutama — ka kvantarvutiga.

Arvustuse lugeja jaoks tähendab see: isegi kui ühel päeval peaksid kõik võremeetodid langema, jääb see allkiri kontrollitavaks. Ta ei pea meid uskuma. Ta saab järele arvutada.