Allekirjoitusmenetelmä

SLH-DSA matemaattisesti selitettynä

Miten SLH-DSA-SHA2-256f (FIPS 205) allekirjoittaa ilman yhtäkään vaikeaa laskuongelmaa tiivistefunktioiden lisäksi — tiivisteketjuista Merkle-puiden kautta FORS-puiden metsään.

Päivitetty: 2026-11-09

1. Mistä tässä on kyse

McGesundissa asiakkaat voivat paketeissa Arviot Premium ja Signaalit Premium valita allekirjoitustason PQ-Dual-Diversified. Tällöin jokainen QR-koodi kantaa klassisen Ed25519-allekirjoituksen lisäksi kahta kvanttiresistenttiä allekirjoitusta: ML-DSA-87 ja SLH-DSA-SHA2-256f.

Tämä kirjoitus selittää jälkimmäisen. Se on rakennettu eri tavalla kuin mikään muu, mitä käytämme.

SLH-DSA ei ole salausmenetelmä. Sisältö pysyy julkisesti luettavana. SLH-DSA todistaa alkuperän ja eheyden — kuten mikä tahansa digitaalinen allekirjoitus.

SLH-DSA tulee sanoista Stateless Hash-Based Digital Signature Algorithm. Se kehitettiin SPHINCS+:sta ja standardoitiin vuonna 2024 nimellä FIPS 205. Jo nimi paljastaa erityispiirteen: menetelmä käyttää pelkkiä tiivistefunktioita. Ei hiloja, ei elliptisiä käyriä, ei suuria alkulukuja.


2. Mitä tarkalleen allekirjoitetaan?

McGesundissa SLH-DSA allekirjoittaa saman tietueen, jonka myös QR-koodin Ed25519-allekirjoitus kattaa: QR-koodin payloadin. Se sisältää muun muassa tiedon siitä, mihin yritykseen koodi kuuluu (fid), minkä tyyppinen se on (typ), milloin se on myönnetty (iat) ja mihin asti se on voimassa (exp) — tiiviisti koodattuna tavujonona (CBOR).

Tämä tavujono on viestimme MM. Jos joku muuttaa jälkikäteen yhdenkin bitin, mikään allekirjoituksista ei enää täsmää.

SLH-DSA-allekirjoitus ei ole itse QR-koodissa. Noin 49 kt:n kokoisena se on siihen aivan liian suuri. Se on erillisenä ”leimana” QR-tietueen yhteydessä McGesundin taustajärjestelmässä, ja se ladataan selaimeen, kun napsautatte ”Tarkista aitous”.


3. Miksi pelkistä tiivistefunktioista koostuva menetelmä?

Jokainen allekirjoitusmenetelmä perustuu tehtävään, joka on ilman salaista avainta käytännössä ratkaisematon:

MenetelmäTurvallisuus perustuu
Ed25519diskreettiin logaritmiin elliptisellä käyrällä
FALCONlyhyisiin vektoreihin NTRU-hiloissa
ML-DSAModule-LWE:hen ja Module-SIS:iin (hilat)
SLH-DSAvain tiivistefunktion ominaisuuksiin

Suuri kvanttitietokone murtaisi Ed25519:n. FALCONia ja ML-DSA:ta pidetään kvanttiresistentteinä — mutta molemmat nojaavat hilaongelmiin. Jos jonain päivänä löydettäisiin perustavanlaatuinen hyökkäys hiloja vastaan, se koskisi molempia yhtä aikaa.

SLH-DSA sen sijaan tarvitsee vain sen, että tiivistefunktio tekee sen, mihin se on rakennettu:

Arvosta H(x) ei voi laskea takaisin x:a¨a¨, eika¨ kukaan lo¨yda¨ toista x′:ta, jolle H(x′)=H(x).\text{Arvosta } H(x) \text{ ei voi laskea takaisin } x \text{:ää, eikä kukaan löydä toista } x' \text{:ta, jolle } H(x') = H(x) \text{.}

Tämä on koko kryptografian pisimpään ja perusteellisimmin tutkittu oletus. Kvanttitietokonekin auttaa tässä vain rajallisesti: Groverin algoritmi puolittaa turvallisuusbitit. Siksi variantti 256 käyttää tiivisteitä, joiden pituus on n=32n = 32 tavua =256= 256 bittiä — Groverin jälkeenkin jää vielä 128 bittiä.

Juuri siksi taso on nimeltään Diversified: ML-DSA (hilat) ja SLH-DSA (tiiviste) ovat peräisin eri matematiikan perheistä. Jos toinen kaatuu, toinen kantaa.


4. Rakennuspalikka 1: allekirjoittaminen tiivisteketjuilla (WOTS+)

Perusajatus on yllättävän yksinkertainen. Aloitamme yhdestä ainoasta numerosta.

Ota salainen satunnaisarvo ss ja tiivistä se yhä uudelleen:

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

Ketjun loppu pp julkaistaan. Se on tämän yhden numeron julkinen avain.

Numeron dd allekirjoittamiseksi väliltä 0–15 annetaan ketjun arvo kohdassa dd:

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

Se, joka haluaa todentaa, tiivistää σ\sigma:n vielä 15−d15 - d kertaa. Jos tulokseksi saadaan täsmälleen pp, allekirjoitus on aito:

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

Pieni esimerkki

Allekirjoitamme numeron d=6d = 6:

  • Allekirjoittaja julkaisee σ=H6(s)\sigma = H^6(s).
  • Todentaja laskee H9(σ)=H15(s)H^{9}(\sigma) = H^{15}(s) ja vertaa sitä pp:hen. Täsmää.

Väärentäjä, joka on nähnyt σ\sigma:n, voi siitä vaivatta laskea H7(s)H^7(s), H8(s)H^8(s) jne. — eli allekirjoittaa suurempia numeroita. Pienempiä hän ei voi, sillä siihen hänen pitäisi tiivistää taaksepäin.

Tarkistussumma ”ylöspäin laskemista” vastaan

Jotta kukaan ei voisi yksinkertaisesti kasvattaa numeroita, allekirjoitetaan lisäksi tarkistussumma:

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

Jos väärentäjä kasvattaa viestin jotakin numeroa, CC pienenee — ja sitä varten hänen pitäisi laskea tarkistussumman ketjussa taaksepäin. Näin molemmat suunnat on suljettu.

Skaalattuna koko tiivisteeseen

32 tavun tiivisteessä on 64 numeroa kantaluvussa 16. Niihin tulee lisäksi 3 tarkistussumman numeroa:

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

Tällaista allekirjoitusta kutsutaan nimellä WOTS+ (Winternitz One-Time Signature). Sen suuri koukku on nimessä: One-Time. Joka allekirjoittaa samalla avaimella kaksi eri viestiä, paljastaa niin monta ketjun arvoa, että väärennökset tulevat mahdollisiksi.


5. Rakennuspalikka 2: monta kertakäyttöistä avainta saman katon alla (Merkle-puu)

Jos kutakin avainta saa käyttää vain kerran, niitä tarvitaan hyvin paljon — mutta julkaista halutaan vain yksi julkinen avain.

Ratkaisu on Merkle-puu: 2h′2^{h'} WOTS+-avainparin julkiset avaimet muodostavat lehdet. Kaksi naapuria tiivistetään aina yhteen, tulokset jälleen pareittain, kunnes ylimpänä on yksi ainoa juuri.

solmu=H(vasen ∥ oikea)\text{solmu} = H(\text{vasen} \,\|\, \text{oikea})

SLH-DSA-SHA2-256f:ssä jokaisen puun korkeus on h′=4h' = 4, eli lehtiä on 24=162^4 = 16.

Osoittaakseen, että tietty lehti kuuluu puuhun, annetaan sen todennuspolku: 4 sisarsolmua matkalla ylös. Niiden avulla todentaja tiivistää tiensä lehdestä juureen. Jos tulokseksi saadaan tunnettu juuri, lehti kuuluu puuhun.


6. Rakennuspalikka 3: puita puiden päällä (hyperpuu)

16 kertakäyttöistä avainta ei tietenkään riitä. Siksi SLH-DSA pinoaa puita päällekkäin: puun juuri allekirjoitetaan yläpuolisen puun WOTS+-avaimella. Tätä tornia kutsutaan hyperpuuksi.

SLH-DSA-SHA2-256f:ssä on d=17d = 17 kerrosta, kunkin korkeus 4:

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

Aivan alimpana on siten käytettävissä

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

lehteä. Ylimmän puun juurta kutsutaan nimellä PK.root\text{PK.root} — se on varsinainen julkinen avain.

Tärkeää: kukaan ei laske näitä puita etukäteen. Kaikki salaiset arvot johdetaan tarvittaessa salaisesta lähtöarvosta SK.seed\text{SK.seed}. Tallennetaan vain neljä arvoa, kukin 32 tavua:

OsaSisältöKoko
SK.seedlähtöarvo kaikille salaisille ketjun arvoille32 B
SK.prflähtöarvo satunnaiskomponentille RR32 B
PK.seedjulkinen lähtöarvo, erottaa avainparit toisistaan32 B
PK.rootylimmän puun juuri32 B

Yksityinen avain koostuu kaikista neljästä (128 tavua), julkinen vain PK.seedistä ja PK.rootista (64 tavua).


7. Rakennuspalikka 4: metsä sattumaosumia vastaan (FORS)

Nyt varsinainen ongelma: mistä allekirjoittaja tietää, mikä 2682^{68} lehdestä on vielä käyttämättä?

Vanhemmat tiivistepohjaiset menetelmät (XMSS, LMS) pitävät tätä varten laskuria. Sitä ei saa koskaan palauttaa taaksepäin — ei varmuuskopiolla eikä toisella palvelimella. Jos niin kuitenkin käy, kertakäyttöistä avainta käytetään kahdesti, ja menetelmä on murrettu. Tällaisia menetelmiä kutsutaan tilallisiksi.

SLH-DSA on tilaton: lehti valitaan näennäissatunnaisesti itse viestin perusteella. Silloin voi käydä niin, että kaksi viestiä osuu samaan lehteen. Siksi alimpana ei ole kertakäyttöinen allekirjoitus vaan muutaman kerran käytettävä allekirjoitus: FORS (Forest of Random Subsets).

FORS koostuu k=35k = 35 pienestä Merkle-puusta, joissa kussakin on 2a=29=5122^a = 2^9 = 512 lehteä. Lehdet ovat salaisia satunnaisarvoja.

Allekirjoitettaessa viestin tiiviste jaetaan 35 lukuun, kukin 9 bittiä. Kukin luku valitsee ”omasta” puustaan täsmälleen yhden lehden. Allekirjoitus sisältää jokaista puuta kohden:

  • tämän lehden salaisen arvon
  • sen todennuspolun (9 solmua)

Väärentäjän pitäisi toista viestiä varten osua kaikissa 35 puussa lehtiin, joiden salaisuudet on jo paljastettu. Vaikka samaa FORS-instanssia olisi käytetty muutaman kerran, se on toivotonta.


8. Allekirjoittamisen koko kulku

  1. Satunnaiskomponentti. SK.prf\text{SK.prf}:stä, tuoreesta satunnaisluvusta ja viestistä syntyy 32 tavun arvo RR.
  2. Viestin tiiviste.
    digest=Hmsg(R, PK.seed, PK.root, M)\text{digest} = H_{\text{msg}}(R,\ \text{PK.seed},\ \text{PK.root},\ M)
    Digestin 49 tavua jaetaan: 40 tavua valitsee 35 FORS-lehteä, loput määräävät, mitä puuta (idx_tree) ja mitä lehteä (idx_leaf) hyperpuun alimmassa kerroksessa käytetään.
  3. FORS-allekirjoitus viestin yli. Siitä saadaan FORS-julkinen avain.
  4. Hyperpuun allekirjoitus tämän FORS-avaimen yli: 17 WOTS+-allekirjoitusta, kullakin oma todennuspolkunsa, kerros kerrokselta ylös PK.root\text{PK.root}:iin asti.

Valmis allekirjoitus on yksinkertaisesti näiden peräkkäin liittäminen:

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

9. Miksi allekirjoitus on 49 856 tavun kokoinen

SLH-DSA-SHA2-256f:n parametreilla koon voi laskea tarkasti (n=32n = 32 tavua tiivistettä kohti):

OsaLaskelmaTavua
RRnn32
FORSk⋅(1+a)⋅n=35⋅10⋅32k \cdot (1 + a) \cdot n = 35 \cdot 10 \cdot 3211 200
Hyperpuu(h+d⋅len)⋅n=(68+17⋅67)⋅32(h + d \cdot \text{len}) \cdot n = (68 + 17 \cdot 67) \cdot 3238 624
Yhteensä49 856

Vertailun vuoksi: Ed25519-allekirjoitus on 64 tavua, ML-DSA-87:n 4 627 tavua. Koko on hinta siitä, että SLH-DSA tulee toimeen pelkillä tiivistefunktioilla.


10. Miten selain todentaa

SLH-DSA:ssa todentaminen tarkoittaa: tiivistämistä uudelleen.

  1. Lasketaan digest uudelleen RR:stä, julkisesta avaimesta ja viestistä.
  2. Lasketaan 35 paljastetusta FORS-lehdestä ja niiden poluista 35 puun juurta ja niistä FORS-julkinen avain.
  3. Tiivistetään jokaisella 17 WOTS+-allekirjoituksella ketjut loppuun, muodostetaan WOTS+-julkinen avain ja tiivistetään polkua pitkin ylös puun juureen.
  4. Lopuksi tulokseksi on saatava täsmälleen PK.root\text{PK.root}.

Siihen tarvitaan muutama tuhat tiivistekutsua — tietokoneelle pikkujuttu. Selaimessa todennus kestää meillä noin 6–12 millisekuntia.


11. Mitä tapahtuu, jos joku muuttaa tietuetta?

Jos viestistä MM muuttuu vain yksikin bitti, digest muuttuu täysin. Silloin 35 lukua osoittavat muihin FORS-lehtiin ja menetelmä toiseen paikkaan hyperpuussa.

Paljastetut salaisuudet eivät enää sovi: uudelleen lasketut juuret poikkeavat, eikä lopputuloksena ole PK.root\text{PK.root}. Todennus epäonnistuu.

Rakentaakseen silti kelvollisen allekirjoituksen hyökkääjän pitäisi tuntea salaisuuksia, joita ei ole koskaan julkaistu — eli laskea tiivistefunktio taaksepäin.


12. Miksi juuri 256f?

FIPS 205 määrittelee kaksitoista parametrijoukkoa: kaksi tiivisteperhettä (SHA-2 ja SHAKE), kolme turvallisuustasoa (128, 192, 256) ja kullekin nopea (”f”) ja pieni (”s”) variantti.

VarianttiAllekirjoitusAllekirjoittaminen (meillä)Todentaminen
SHA2-256s29 792 Bn. 2,6 sn. 3 ms
SHA2-256f49 856 Bn. 0,26 sn. 6 ms

256 tarkoittaa NIST-turvallisuusluokkaa 5 — samaa tasoa kuin FALCON-1024 ja ML-DSA-87.

Valitsimme ”f”:n, koska yritykset voivat myöntää jopa 500 QR-koodia kerralla. ”s”:llä allekirjoittaminen kestäisi yli 20 minuuttia, ”f”:llä alle minuutin. Vastineeksi allekirjoitus on suurempi — koska se ei ole QR-koodissa, sen voi hyväksyä.

SHA-2 SHAKEn sijaan, koska SHA-256 ja SHA-512 ovat kiihdytettyjä käytännössä kaikessa laitteistossa.


13. Satunnaisuus allekirjoitettaessa

FIPS 205 sallii kaksi tapaa tuottaa RR:

  • deterministisesti: sama viesti, sama allekirjoitus
  • satunnaistetusti (”hedged”): mukaan sekoitetaan tuore satunnaisluku

Käytämme satunnaistettua varianttia. Kaksi saman viestin allekirjoitusta näyttävät siksi erilaisilta — molemmat ovat kelvollisia. Tämä vaikeuttaa hyökkäyksiä, joissa laitteella tehtyjä mittauksia (virrankulutus, aika) yhdistetään toistuviin allekirjoituksiin.


14. Mitä McGesund tekee tällä käytännössä

Taso. PQ-Dual-Diversified on saatavilla paketeissa Arviot Premium ja Signaalit Premium. QR-koodi kantaa tällöin kolmea allekirjoitusta:

AllekirjoitusPerheSijainti
Ed25519elliptinen käyräQR-koodissa
ML-DSA-87hilatleima taustajärjestelmässä
SLH-DSA-SHA2-256ftiivistefunktiotleima taustajärjestelmässä

Allekirjoittaminen. Yksi SLH-DSA-allekirjoitus vie noin neljänneksen sekunnista laskenta-aikaa. Jotta palvelin pysyisi sillä välin kaikkien muiden tavoitettavissa, laskennan hoitavat erilliset taustasäikeet.

Todennus. Lukijan selain lataa molemmat leimat ja todentaa ne samalla WASM-moduulilla kuin kaikki muutkin PQ-allekirjoitukset. Me toimitamme tiedot, laskenta tapahtuu kävijän laitteella.

Vertailu NISTiin. Moduulimme läpäisee SLH-DSA-SHA2-256f:n viralliset NIST-testivektorit: NISTin lähtöarvoista syntyvät tavu tavulta samat avaimet, ja kaikki tahallisesti manipuloidut allekirjoitukset hylätään. Voitte tarkistaa tämän itse selaimessa NISTin testisivulla.

Aikaankkuri. Kuten kaikkien avainten kohdalla, SLH-DSA-avaimen sormenjälki ankkuroidaan OpenTimestampsin kautta Bitcoin-lohkoon.


15. SLH-DSA, ML-DSA ja FALCON rinnakkain

OminaisuusFALCON (FN-DSA)ML-DSA-87SLH-DSA-SHA2-256f
PerustaNTRU-hilatmoduulihilatvain tiivistefunktiot
StandardiFIPS 206 (työn alla)FIPS 204, valmisFIPS 205, valmis
Julkinen avain1 793 B2 592 B64 B
Allekirjoitus1 280 B4 627 B49 856 B
Allekirjoittaminenmillisekuntejamillisekuntejan. 0,26 s
Todentaminenmillisekuntejamillisekuntejamillisekunteja
Oletushilaongelmahilaongelmatiivistefunktio

Lyhyesti: SLH-DSA on kolmesta menetelmästä hitain ja suurin — ja konservatiivisin. Se ei nojaa mihinkään, mitä jokainen muu allekirjoitus ei joka tapauksessa jo edellyttäisi: turvalliseen tiivistefunktioon.


16. Yksi lause mukaan otettavaksi

SLH-DSA allekirjoittaa tiivisteketjuilla, niputtaa ne Merkle-puihinja valitsee lehden itse viestin perusteella — turvallinen niin kauankuin tiivistefunktio on turvallinen.\boxed{ \begin{array}{c} \text{SLH-DSA allekirjoittaa tiivisteketjuilla, niputtaa ne Merkle-puihin}\\ \text{ja valitsee lehden itse viestin perusteella — turvallinen niin kauan}\\ \text{kuin tiivistefunktio on turvallinen.} \end{array}}

Se, jolla on salainen lähtöarvo, allekirjoittaa neljänneksessä sekunnista. Sen, jolla sitä ei ole, pitäisi laskea SHA-256 tai SHA-512 taaksepäin — myös kvanttitietokoneella.

Arvion lukijalle se tarkoittaa: vaikka kaikki hilamenetelmät jonain päivänä kaatuisivat, tämä allekirjoitus pysyy todennettavissa. Hänen ei tarvitse uskoa meitä. Hän voi laskea itse.