Parašo algoritmas
SLH-DSA paaiškintas matematiškai
Kaip SLH-DSA-SHA2-256f (FIPS 205) pasirašo, nesiremdamas jokiu kitu sunkiu uždaviniu, išskyrus maišos funkcijas — nuo maišos grandinių per Merkle medžius iki FORS medžių miško.
Būklė: 2026-11-09
1. Apie ką čia kalbama
McGesund klientai, turintys tarifą Atsiliepimai Premium ar Signalai Premium, gali pasirinkti parašo lygį PQ-Dual-Diversified. Tada kiekvienas QR kodas greta klasikinio Ed25519 parašo turi du kvantams atsparius parašus: ML-DSA-87 ir SLH-DSA-SHA2-256f.
Šis straipsnis paaiškina antrąjį. Jis sukurtas kitaip nei visa kita, ką naudojame.
SLH-DSA nėra šifravimas. Turinys lieka viešai skaitomas. SLH-DSA įrodo kilmę ir vientisumą — kaip ir bet kuris skaitmeninis parašas.
SLH-DSA visas pavadinimas — Stateless Hash-Based Digital Signature Algorithm. Jis išvystytas iš SPHINCS+ ir 2024 m. standartizuotas kaip FIPS 205. Pavadinimas jau išduoda ypatumą: algoritmas naudoja tik maišos funkcijas. Jokių gardelių, jokių elipsinių kreivių, jokių didelių pirminių skaičių.
2. Kas tiksliai pasirašoma?
McGesund sistemoje SLH-DSA pasirašo tą patį duomenų rinkinį, kurį apima ir Ed25519 parašas QR kode: QR kodo naudingąją apkrovą (payload). Joje, be kita ko, nurodyta, kuriai įmonei kodas priklauso (fid), kokios jis rūšies (typ), kada jis išduotas (iat) ir iki kada galioja (exp) — kaip kompaktiškai užkoduota baitų seka (CBOR).
Ši baitų seka yra mūsų pranešimas . Jei kas nors vėliau pakeičia bent vieną bitą, nė vienas parašas nebetinka.
SLH-DSA parašas nėra pačiame QR kode. Būdamas maždaug 49 KB, jis tam per didelis. Jis saugomas kaip atskiras „antspaudas“ prie QR duomenų rinkinio McGesund serverinėje dalyje (backend) ir įkeliamas į naršyklę paspaudus „Patikrinti autentiškumą“.
3. Kodėl algoritmas vien iš maišos funkcijų?
Kiekvienas parašo algoritmas remiasi uždaviniu, kurio be slaptojo rakto praktiškai neįmanoma išspręsti:
| Algoritmas | Saugumas remiasi |
|---|---|
| Ed25519 | diskrečiuoju logaritmu elipsinėje kreivėje |
| FALCON | trumpais vektoriais NTRU gardelėse |
| ML-DSA | Module-LWE ir Module-SIS (gardelės) |
| SLH-DSA | tik maišos funkcijos savybėmis |
Didelis kvantinis kompiuteris įveiktų Ed25519. FALCON ir ML-DSA laikomi atspariais kvantams — tačiau abu remiasi gardelių uždaviniais. Jei kada nors būtų rasta esminė ataka prieš gardeles, nukentėtų abu iš karto.
SLH-DSA, priešingai, tereikia, kad maišos funkcija darytų tai, kam ji sukurta:
Tai ilgiausiai ir nuodugniausiai ištirta visos kriptografijos prielaida. Net kvantinis kompiuteris čia padeda tik ribotai: Groverio algoritmas perpus sumažina saugumo bitų skaičių. Todėl 256 variantas naudoja baitų bitų maišos reikšmes — po Groverio vis tiek lieka 128 bitai.
Būtent todėl lygis vadinamas Diversified: ML-DSA (gardelės) ir SLH-DSA (maiša) kilę iš skirtingų matematikos šeimų. Jei viena žlugtų, kita išlaiko.
4. 1 blokas: pasirašymas maišos grandinėmis (WOTS+)
Pagrindinė idėja stebėtinai paprasta. Pradėkime nuo vieno skaitmens.
Paimkite slaptą atsitiktinę reikšmę ir vėl ir vėl skaičiuokite jos maišą:
Grandinės pabaiga paskelbiama. Tai viešasis raktas šiam vienam skaitmeniui.
Norint pasirašyti skaitmenį nuo 0 iki 15, atskleidžiama grandinės reikšmė pozicijoje :
Kas nori patikrinti, dar kartų skaičiuoja maišą. Jei gaunama lygiai , parašas tikras:
Mažas pavyzdys
Pasirašome skaitmenį :
- Pasirašantysis paskelbia .
- Tikrintojas apskaičiuoja ir palygina su . Sutampa.
Klastotojas, pamatęs , iš jo be vargo gali apskaičiuoti , ir t. t. — vadinasi, pasirašyti didesnius skaitmenis. Mažesnių jis negali, nes tam reikėtų skaičiuoti maišą atgal.
Kontrolinė suma prieš „skaičiavimą į viršų“
Kad niekas negalėtų tiesiog padidinti skaitmenų, papildomai pasirašoma kontrolinė suma:
Jei klastotojas padidina pranešimo skaitmenį, tampa mažesnė — o tam jam tektų skaičiuoti atgal kontrolinės sumos grandinėje. Taip užblokuotos abi kryptys.
Pritaikius visai maišos reikšmei
32 baitų maišos reikšmė turi 64 skaitmenis šešioliktainėje sistemoje. Prie jų pridedami 3 kontrolinės sumos skaitmenys:
Toks parašas vadinamas WOTS+ (Winternitz One-Time Signature). Didžiausias jo trūkumas slypi pavadinime: one-time, t. y. vienkartinis. Kas tuo pačiu raktu pasirašo du skirtingus pranešimus, atskleidžia tiek grandinių reikšmių, kad tampa įmanomos klastotės.
5. 2 blokas: daug vienkartinių raktų po vienu stogu (Merkle medis)
Jei kiekvienas raktas gali būti naudojamas tik kartą, jų reikia labai daug — tačiau norima paskelbti tik vieną viešąjį raktą.
Sprendimas — Merkle medis: WOTS+ porų viešieji raktai sudaro lapus. Kas du kaimynai kartu sumaišomi, rezultatai vėl poromis, kol viršuje lieka viena šaknis.
SLH-DSA-SHA2-256f kiekvieno medžio aukštis , taigi lapų.
Norint parodyti, kad tam tikras lapas priklauso medžiui, pateikiamas autentifikavimo kelias: 4 gretimi (seseriniai) mazgai kelyje į viršų. Su jais tikrintojas, skaičiuodamas maišas, kyla nuo lapo iki šaknies. Jei gaunama žinoma šaknis, lapas priklauso medžiui.
6. 3 blokas: medžiai ant medžių (hipermedis)
16 vienkartinių raktų, žinoma, nepakanka. Todėl SLH-DSA krauna medžius vieną ant kito: medžio šaknis pasirašoma aukščiau esančio medžio WOTS+ raktu. Šis bokštas vadinamas hipermedžiu (hypertree).
SLH-DSA-SHA2-256f turi sluoksnių, kiekvieno aukštis 4:
Taigi pačioje apačioje yra
lapų. Aukščiausiojo medžio šaknis vadinama — tai ir yra tikrasis viešasis raktas.
Svarbu: niekas šių medžių neapskaičiuoja iš anksto. Visos slaptos reikšmės prireikus išvedamos iš slaptos pradinės reikšmės . Saugomos tik keturios reikšmės po 32 baitus:
| Dalis | Turinys | Dydis |
|---|---|---|
| SK.seed | pradinė reikšmė visoms slaptoms grandinių reikšmėms | 32 B |
| SK.prf | pradinė reikšmė atsitiktiniam komponentui | 32 B |
| PK.seed | vieša pradinė reikšmė, atskirianti raktų poras vieną nuo kitos | 32 B |
| PK.root | aukščiausiojo medžio šaknis | 32 B |
Privatųjį raktą sudaro visos keturios (128 baitai), viešąjį — tik PK.seed ir PK.root (64 baitai).
7. 4 blokas: miškas prieš atsitiktinius sutapimus (FORS)
Dabar tikroji problema: iš kur pasirašantysis žino, kuris iš lapų dar nepanaudotas?
Senesni maiša grįsti algoritmai (XMSS, LMS) tam veda skaitiklį. Jo niekada negalima atstatyti atgal — nei iš atsarginės kopijos, nei antru serveriu. Jei taip vis dėlto nutinka, vienkartinis raktas panaudojamas du kartus, ir algoritmas palaužiamas. Tokie algoritmai vadinami būseniniais.
SLH-DSA yra bebūsenis: lapas pseudoatsitiktinai parenkamas iš paties pranešimo. Tada gali atsitikti, kad du pranešimai pataiko į tą patį lapą. Todėl pačioje apačioje kabo ne vienkartinis, o kelių kartų parašas: FORS (Forest of Random Subsets).
FORS sudaro maži Merkle medžiai, kurių kiekvienas turi lapų. Lapai yra slaptos atsitiktinės reikšmės.
Pasirašant pranešimo maiša suskaidoma į 35 skaičius po 9 bitus. Kiekvienas skaičius „savo“ medyje parenka lygiai vieną lapą. Kiekvienam medžiui parašas turi:
- to lapo slaptą reikšmę
- jo autentifikavimo kelią (9 mazgai)
Kitam pranešimui klastotojas turėtų visuose 35 medžiuose pataikyti į lapus, kurių paslaptys jau atskleistos. Net jei tas pats FORS egzempliorius buvo panaudotas kelis kartus, tai beviltiška.
8. Visa pasirašymo eiga
- Atsitiktinis komponentas. Iš , naujo atsitiktinio skaičiaus ir pranešimo gaunama 32 baitų reikšmė .
- Pranešimo maiša.
49 santraukos (digest) baitai padalijami: 40 baitų parenka 35 FORS lapus, likusi dalis nustato, kuris medis (
idx_tree) ir kuris lapas (idx_leaf) pačioje hipermedžio apačioje naudojami. - FORS parašas pranešimui. Iš jo gaunamas FORS viešasis raktas.
- Hipermedžio parašas šiam FORS raktui: 17 WOTS+ parašų, kiekvienas su autentifikavimo keliu, sluoksnis po sluoksnio iki pat .
Galutinis parašas yra tiesiog sujungimas:
9. Kodėl parašas užima 49 856 baitus
Su SLH-DSA-SHA2-256f parametrais dydį galima tiksliai perskaičiuoti ( baitai vienai maišos reikšmei):
| Dalis | Skaičiavimas | Baitai |
|---|---|---|
| 32 | ||
| FORS | 11 200 | |
| Hipermedis | 38 624 | |
| Iš viso | 49 856 |
Palyginimui: Ed25519 parašas užima 64 baitus, ML-DSA-87 — 4 627 baitus. Dydis yra kaina už tai, kad SLH-DSA apsieina vien maišos funkcijomis.
10. Kaip tikrina naršyklė
Tikrinti SLH-DSA atveju reiškia perskaičiuoti maišas.
- Iš naujo apskaičiuoti santrauką iš , viešojo rakto ir pranešimo.
- Iš 35 atskleistų FORS lapų ir jų kelių apskaičiuoti 35 medžių šaknis, o iš jų — FORS viešąjį raktą.
- Su kiekvienu iš 17 WOTS+ parašų baigti skaičiuoti grandinių maišas, sudaryti WOTS+ viešąjį raktą ir keliu pakilti iki medžio šaknies.
- Pabaigoje turi gautis lygiai .
Tai keli tūkstančiai maišos funkcijos iškvietimų — kompiuteriui menkniekis. Mūsų naršyklėje patikra trunka maždaug nuo 6 iki 12 milisekundžių.
11. Kas nutinka, jei kas nors pakeičia duomenis?
Jei pasikeičia bent vienas pranešimo bitas, santrauka pasikeičia visiškai. Tada 35 skaičiai rodo į kitus FORS lapus, o algoritmas — į kitą vietą hipermedyje.
Atskleistos paslaptys nebetinka: perskaičiuotos šaknys skiriasi, ir pabaigoje negaunama . Patikra nepavyksta.
Kad vis tiek sukurtų galiojantį parašą, užpuolikas turėtų žinoti niekada neskelbtas paslaptis — t. y. apskaičiuoti maišos funkciją atgal.
12. Kodėl būtent 256f?
FIPS 205 apibrėžia dvylika parametrų rinkinių: dvi maišos funkcijų šeimas (SHA-2 ir SHAKE), tris saugumo lygius (128, 192, 256) ir kiekvienam po greitą („f“) ir mažą („s“) variantą.
| Variantas | Parašas | Pasirašymas (pas mus) | Tikrinimas |
|---|---|---|---|
| SHA2-256s | 29 792 B | apie 2,6 s | apie 3 ms |
| SHA2-256f | 49 856 B | apie 0,26 s | apie 6 ms |
256 reiškia NIST 5 saugumo kategoriją — tą patį lygį kaip FALCON-1024 ir ML-DSA-87.
„f“ pasirinkome todėl, kad įmonės vienu kartu gali išduoti iki 500 QR kodų. Su „s“ pasirašymas truktų daugiau nei 20 minučių, su „f“ — mažiau nei minutę. Užtat parašas didesnis — kadangi jis nėra QR kode, tai pakeliama.
SHA-2, o ne SHAKE, nes SHA-256 ir SHA-512 aparatiškai spartinami praktiškai bet kurioje įrangoje.
13. Atsitiktinumas pasirašant
FIPS 205 leidžia du generavimo būdus:
- deterministinį: tas pats pranešimas, tas pats parašas
- atsitiktinį („hedged“): įmaišomas naujas atsitiktinis skaičius
Mes naudojame atsitiktinį variantą. Todėl du to paties pranešimo parašai atrodo skirtingai — abu galioja. Tai apsunkina atakas, derinančias matavimus įrenginyje (energijos sąnaudas, laiką) su pakartotiniais parašais.
14. Ką konkrečiai su tuo daro McGesund
Lygis. PQ-Dual-Diversified galimas tarifuose Atsiliepimai Premium ir Signalai Premium. Tada QR kodas turi tris parašus:
| Parašas | Šeima | Vieta |
|---|---|---|
| Ed25519 | elipsinė kreivė | QR kode |
| ML-DSA-87 | gardelės | antspaudas serverinėje dalyje |
| SLH-DSA-SHA2-256f | maišos funkcijos | antspaudas serverinėje dalyje |
Pasirašymas. Vienas SLH-DSA parašas kainuoja maždaug ketvirtį sekundės skaičiavimo laiko. Kad serveris tuo metu liktų pasiekiamas visiems kitiems, skaičiuoja atskiros foninės gijos.
Patikra. Skaitytojo naršyklė įkelia abu antspaudus ir patikrina juos tuo pačiu WASM moduliu kaip ir visus kitus PQ parašus. Mes pateikiame duomenis, o skaičiuojama lankytojo įrenginyje.
Sutikrinimas su NIST. Mūsų modulis išlaiko oficialius NIST testinius vektorius SLH-DSA-SHA2-256f algoritmui: iš NIST pradinių reikšmių baitas į baitą gaunami tie patys raktai, o visi tyčia pakeisti parašai atmetami. Tai galite patys patikrinti naršyklėje NIST testų puslapyje.
Laiko inkaras. Kaip ir visų raktų atveju, SLH-DSA rakto kontrolinis atspaudas per OpenTimestamps įtvirtinamas Bitcoin bloke.
15. SLH-DSA, ML-DSA ir FALCON greta
| Savybė | FALCON (FN-DSA) | ML-DSA-87 | SLH-DSA-SHA2-256f |
|---|---|---|---|
| Pagrindas | NTRU gardelės | modulinės gardelės | tik maišos funkcijos |
| Standartas | FIPS 206 (rengiamas) | FIPS 204, galutinis | FIPS 205, galutinis |
| Viešasis raktas | 1 793 B | 2 592 B | 64 B |
| Parašas | 1 280 B | 4 627 B | 49 856 B |
| Pasirašymas | milisekundės | milisekundės | apie 0,26 s |
| Tikrinimas | milisekundės | milisekundės | milisekundės |
| Prielaida | gardelės uždavinys | gardelės uždavinys | maišos funkcija |
Trumpai tariant: SLH-DSA yra lėčiausias ir didžiausias iš trijų algoritmų — ir konservatyviausias. Jis nesiremia niekuo, ko ir taip jau nereikalautų bet kuris kitas parašas: saugia maišos funkcija.
16. Vienas sakinys įsidėmėti
Kas turi slaptąją pradinę reikšmę, pasirašo per ketvirtį sekundės. Kas jos neturi, turėtų skaičiuoti SHA-256 ar SHA-512 atgal — net ir su kvantiniu kompiuteriu.
Atsiliepimo skaitytojui tai reiškia: net jei kada nors žlugtų visi gardelėmis grįsti algoritmai, šis parašas liktų patikrinamas. Jam nereikia mumis tikėti. Jis gali perskaičiuoti.