Schematy podpisu
ML-DSA-87 wyjaśniony matematycznie
Jak ML-DSA-87 (FIPS 204) podpisuje opinię w McGesund — od Module-LWE przez rejection sampling aż po weryfikację w przeglądarce.
Stan: 2026-09-07
1. O co tutaj chodzi
Gdy ktoś wystawia opinię w McGesund, w tle dzieje się więcej, niż sugeruje tekst. Opinia zostaje przy wysłaniu podpisana cyfrowo. Ten podpis może później przeliczyć każdy odwiedzający w swojej własnej przeglądarce — bez zaufania do nas i bez pytania nas o zgodę.
Dla klientów od taryfy Pro dzieje się to między innymi za pomocą ML-DSA-87. Ten artykuł wyjaśnia, co przy tym dzieje się matematycznie.
Ważna uwaga na wstępie:
ML-DSA nie jest szyfrowaniem. Tekst opinii pozostaje publicznie czytelny — na tym przecież polega sens opinii. ML-DSA nie dowodzi poufności, lecz pochodzenia i nienaruszalności.
ML-DSA powstał z CRYSTALS-Dilithium i jest znormalizowany jako FIPS 204. Liczba 87 oznacza poziom parametrów. Są trzy:
- ML-DSA-44
- ML-DSA-65
- ML-DSA-87
ML-DSA-87 jest najwyższym i mieści się w kategorii bezpieczeństwa NIST 5.
2. Co dokładnie jest podpisywane?
Do podpisu wędruje nie sam tekst opinii, lecz kompaktowy obiekt danych, który jednoznacznie przybija tekst. W McGesund wygląda on w rdzeniu tak:
{
"v": 1,
"typ": "rev-comment",
"f": "<ID firmy>",
"c": "<ID opinii>",
"h": "<SHA-256 tekstu opinii>",
"rh": "<SHA-256 całego rekordu przesłanej opinii>",
"rv": 1,
"qh": "<SHA-256 koperty QR, tylko przy opiniach z QR>",
"iat": 1757203200
}
Ten obiekt jest naszą wiadomością . Wiąże ze sobą sześć stwierdzeń:
- Do jakiej firmy należy opinia (
f) - O którą opinię chodzi (
c) - Jaki tekst za nią stał — jako wartość skrótu (
h) - Jaki rekord w całości został przesłany (
rh): tekst, serduszka, status geolokalizacji i informacje o okoliczności, kanonicznie zserializowane i zhaszowane — w wersji schematurv - Z którego kodu QR pochodzi opinia (
qh); bez QR pole odpada - Kiedy podpisano (
iat)
Jeśli ktoś zmieni później choćby jeden znak w tekście opinii, h już nie pasuje — a rh również nie. Kto zamiast tego pokręci tylko serduszkami, zostawia h nietknięte, ale łamie rh. Jeśli ktoś zmieni jedną z tych wartości skrótu, podpis już nie pasuje. Dokładnie ten łańcuch jest sednem.
3. Co ma zapewniać podpis
Odwiedzający, który czyta opinię, ma móc sam sprawdzić trzy rzeczy:
- Opinia rzeczywiście została wystawiona przez McGesund.
- Tekst nie został zmieniony od chwili wysłania.
- Nikt nie może wymyślić nowej, ważnie wyglądającej opinii.
Służy do tego para kluczy:
- klucz prywatny — leży wyłącznie w usłudze podpisującej
- klucz publiczny — może go mieć każdy, adresowany przez identyfikator klucza (
kid) w kopercie
Podpisuje się kluczem prywatnym. Weryfikuje się publicznym — i to w przeglądarce czytelnika, a nie na naszym serwerze.
4. Po co w ogóle metoda postkwantowa?
Wiele dziś powszechnych metod podpisu opiera się na faktoryzacji dużych liczb albo na logarytmach dyskretnych. Dostatecznie wydajny komputer kwantowy mógłby właśnie te problemy rozwiązywać znanymi algorytmami znacznie szybciej.
Dla opinii nie jest to pytanie akademickie. Opinia ma być sprawdzalna jeszcze za dziesięć lat. Kto podpisuje dziś, podpisuje na cały okres życia wpisu.
ML-DSA używa dlatego innej podstawy:
Dokładniej: Module-LWE i Module-SIS.
5. Czym jest krata?
Na razie tylko punkty w przestrzeni. Weźmy dwa wektory:
Wszystkie całkowitoliczbowe kombinacje
tworzą kratę. Na przykład:
Rozstrzygające jest to, że:
W małych wymiarach problemy kratowe są łatwe. W bardzo wysokich wymiarach pewne zadania stają się ekstremalnie trudne.
6. Wielomiany zamiast pojedynczych liczb
ML-DSA liczy nie na wektorach dwuwymiarowych, lecz na wielomianach i wektorach wielomianów.
Wielomian taki jak
da się zapisać jako lista współczynników:
Obliczenia prowadzone są w pierścieniu:
To oznacza dwie rzeczy:
- : liczenie modulo
- : dodatkowa reguła, która ustala długość wielomianu
Dla wszystkich trzech poziomów ML-DSA zachodzi:
Wielomian ma więc 256 współczynników, rozpatrywanych modulo 8 380 417. Tym, co zmienia się między poziomami, nie jest ani , lecz rozmiar macierzy — o tym dalej.
Na marginesie: mnożenie wielomianów w tym pierścieniu przebiega w praktyce przez NTT, teorioliczbowy wariant szybkiej transformaty Fouriera. ML-DSA bynajmniej nie obywa się więc bez idei FFT; tkwią one tylko w arytmetyce, a nie w zasadzie podpisu.
7. Centralna sztuczka: Module-LWE
Rdzeniem jest Module Learning With Errors:
Przy czym:
- — publiczna, pozornie losowa macierz z wielomianów
- — małe tajne wektory
- — wartość publiczna
Atakujący zna i , ale nie . Równanie wygląda dla niego jak losowe równanie z szumem. Małych sekretów nie powinien z niego efektywnie odzyskać.
8. Maleńki przykład liczbowy
Bierzemy celowo śmiesznie małą wersję — zwykłe liczby zamiast wielomianów, wymiar 2 zamiast 256, oraz
Niech
Wtedy:
W tym miniformacie dałoby się wypróbować wszystkie możliwości. Przy ML-DSA-87 jest macierzą z wielomianów po 256 współczynników — to ponad 14 000 niewiadomych w strukturze kratowej.
9. Para kluczy usługi podpisującej
Klucz prywatny zawiera między innymi małe wektory . Przy ML-DSA-87 ich współczynniki pochodzą z przedziału
czyli ze zbioru . Ta małość nie jest szczegółem, lecz sednem: dopiero dlatego, że sekrety są małe, w ogóle powstaje trudny problem kratowy.
Klucz publiczny to w uproszczeniu
jest seedem, z którego da się deterministycznie zrekonstruować — macierzy nie trzeba więc przesyłać. to górne bity ; dolne bitów odpada, co znacznie zmniejsza klucz. To pominięcie jest później powodem istnienia tak zwanych hintów.
Powstaje tym samym pożądana asymetria:
10. Opinia staje się liczbą
Usługa podpisująca haszuje najpierw obiekt payload z rozdziału 2:
W naszym przykładzie zabawkowym bierzemy sztuczny miniskrót. W prawdziwym systemie ma 512 bitów i wiąże dodatkowo klucz publiczny — dzięki temu podpisu nie da się przeinterpretować na inny klucz.
11. Commitment
Usługa podpisująca losuje mały wektor . W naszym przykładzie:
Powstaje z niego wartość pośrednia, commitment:
To jeszcze nie jest podpis.
12. Z opinii powstaje challenge
Wiadomość i commitment zostają zhaszowane razem:
Przy ML-DSA-87 jest wielomianem z dokładnie współczynnikami ze zbioru , wszystkie pozostałe 196 są zerowe. Ta struktura jest zamierzona: utrzymuje małym.
W naszym przykładzie zabawkowym przyjmujemy po prostu
13. Właściwy podpis
Z naszymi wartościami:
14. Krok, który łatwo przeoczyć: rejection sampling
Tu leży punkt, w którym ML-DSA różni się od naiwnej konstrukcji — i nie jest on opcjonalny.
zawiera sekret . Gdyby po prostu zawsze wydawać, dałoby się statystycznie wyliczyć z dostatecznie wielu podpisów. Przy portalu z opiniami o bardzo wielu podpisach dziennie nie jest to ryzyko teoretyczne.
Dlatego usługa podpisująca sprawdza przed wydaniem, czy zdradza za dużo, i w przeciwnym razie odrzuca podpis — wtedy zaczyna od nowa z nowym losowym . Nazywa się to Fiat-Shamir with Aborts.
Warunek brzmi w istocie:
Dla ML-DSA-87 zachodzi oraz . Dochodzi do tego druga granica na dolnych bitach. W praktyce kilka przebiegów jest normą — podpisywanie jest więc metodą pętlową, a nie jednorazowym krokiem.
Dla weryfikacji ważne jest: dokładnie tę granicę przeglądarka sprawdza później również. Podpis o zbyt dużych współczynnikach zostaje odrzucony, nawet jeśli równanie się zgadza.
15. Dlaczego przeglądarka może to sprawdzić
Przeglądarka czytelnika zna:
- opinię, a tym samym
- klucz publiczny
- podpis
Nie zna . Zależność, która mimo to prowadzi ją dalej:
A ponieważ zachodzi
nieznane da się zastąpić wartością publiczną:
To jest centralne równanie — i mówi ono coś ważnego: przeglądarka rekonstruuje nie dokładnie, lecz tylko z dokładnością do małego składnika .
16. Miniprzykład do końca
Mieliśmy:
Przeliczmy:
Pierwotny commitment wynosił
Różnica wynosi
A więc dokładnie przewidziany mały składnik błędu. Weryfikator dostaje nie , lecz coś, co leży blisko .
Właśnie dlatego ML-DSA porównuje nie same wartości, lecz ich górne bity. I właśnie dlatego podpis zawiera dodatkowo wektor hintów : informuje on kompaktowo, w których miejscach zaokrąglenie przechyliło się przez granicę za sprawą małego składnika błędu. Przy ML-DSA-87 dopuszczalnych jest najwyżej takich wskazówek. Nie zdradzają one sekretu — naprawiają jedynie zaokrąglenie.
Na koniec przeglądarka przelicza challenge na nowo. Jeśli się zgadza,
i wszystkie normy mieszczą się w granicach, podpis jest ważny.
17. Co się dzieje, gdy ktoś zmieni opinię?
Załóżmy, że ktoś z dostępem do bazy danych — także ktoś u nas — zmienia tekst opinii albo jedno z serduszek. Wtedy zmienia się co najmniej jedna z dwóch wartości skrótu w payloadzie (h przy tekście, rh przy każdym polu rekordu):
Tym samym zmienia się challenge:
Istniejący podpis został jednak wytworzony dla starego challenge. Przeglądarka przelicza i stwierdza:
Rozstrzygające zdanie brzmi: opinię możemy usunąć, ale nie możemy jej zmienić niepostrzeżenie. W McGesund ta sama weryfikacja przebiega dodatkowo co noc po stronie serwera na całym zasobie — opinia, która jej nie przejdzie, nie wlicza się już do średniej firmy.
18. Dlaczego nikt nie może wymyślić podpisu?
Atakujący zna i , ale nie . Aby zbudować ważny podpis, musiałby znaleźć trójkę , która
- spełnia równanie weryfikacyjne oraz
- dotrzymuje granic norm oraz
- pasuje do challenge wynikającego z dokładnie tych wartości.
To sprowadza się w rdzeniu do trudnego problemu kratowego — konkretnie do Module-SIS: znalezienia krótkich rozwiązań jednorodnego równania modulo . Warunek małości nie jest przy tym dodatkiem, lecz właściwym źródłem trudności. Bez niego rozwiązanie byłoby trywialne.
19. Dlaczego „Module"?
Słowo to opisuje strukturę pomiędzy zwykłymi wektorami a ogólnymi kratami. Zamiast liczyć na pojedynczych liczbach, ML-DSA pracuje na wektorach wielomianów:
i na macierzach z nich:
Zaleta: dostaje się wysoki wymiar kraty, a zachowuje kompaktową, efektywnie obliczalną reprezentację. Bezpieczeństwo da się precyzyjnie regulować rozmiarem macierzy, bez zmiany pierścienia.
20. Dlaczego akurat 87?
Trzy poziomy różnią się nie pierścieniem, lecz wymiarami:
| Parametr | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Rozmiar macierzy | |||
| Zakres sekretu | 2 | 4 | 2 |
| Waga challenge | 39 | 49 | 60 |
| Klucz publiczny | 1312 B | 1952 B | 2592 B |
| Podpis | 2420 B | 3309 B | 4627 B |
| Kategoria NIST | 2 | 3 | 5 |
Godne uwagi: ML-DSA-87 nie jest po prostu „ML-DSA-65, tylko większym". Zakres sekretu wraca z 4 znów do 2; bezpieczeństwo bierze się tu z większej macierzy, a nie z większych współczynników. Chodzi o samodzielny, znormalizowany dobór parametrów.
Cena: 4627 bajtów na podpis — na każdy stempel, który jest przechowywany i przy weryfikacji dostarczany do przeglądarki. Dlatego w McGesund obok ML-DSA-87 do wyboru jest także FALCON, któremu wystarcza 1280 bajtów.
21. Fiat-Shamir: dlaczego działa bez rozmówcy
Dowód interaktywny przebiegałby tak:
- Usługa podpisująca wysyła commitment.
- Weryfikator wysyła losowy challenge.
- Usługa podpisująca odpowiada.
- Weryfikator przelicza.
Przy opinii tego dialogu nie ma — czytelnik przychodzi miesiące później. Rozwiązaniem jest transformacja Fiata-Shamira: challenge nie jest losowany, lecz haszowany z samych danych:
Dialog staje się dzięki temu dokumentem. Usługa podpisująca nie może sobie wybrać challenge, bo musiałaby do tego kontrolować skrót.
22. Cały przebieg
23. Co konkretnie robi z tym McGesund
Trzy poziomy zazębiają się ze sobą:
Koperta. Każda podpisana opinia niesie podpis Ed25519. To wariant obowiązkowy — klasyczny, malutki, natywnie weryfikowalny w każdej przeglądarce.
Stemple postkwantowe. Dodatkowo można obok dołożyć jeden albo dwa podpisy odporne na ataki kwantowe. Które, zależy od taryfy:
| Taryfa | dostępne poziomy podpisu |
|---|---|
| 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, oba równolegle |
Wariant równoległy jest świadomie nadmiarowy. Gdyby jedna z obu rodzin matematycznych — kraty NTRU przy FALCON, kraty modułowe przy ML-DSA — okazała się słabsza, niż dziś się przyjmuje, druga niesie dowód dalej.
Kotwica czasu. Odcisk klucza podpisującego zostaje zakotwiczony przez OpenTimestamps w bloku Bitcoina. Pozwala to wykazać nie tylko, że podpis jest prawdziwy, lecz także, że istniał już w określonym momencie — bez konieczności wiary komukolwiek w nasz znacznik czasu.
Weryfikowane jest to wszystko w przeglądarce czytelnika, przez moduł WASM. My dostarczamy dane; przeliczane jest na urządzeniu odwiedzającego. Gdybyśmy jutro zniknęli z sieci, raz pobrana opinia pozostałaby sprawdzalna.
24. ML-DSA i FALCON obok siebie
| Właściwość | FALCON (FN-DSA) | ML-DSA |
|---|---|---|
| Typ | podpis cyfrowy | podpis cyfrowy |
| Rodzina krat | NTRU | Module-LWE / Module-SIS |
| Pierścień | , | , |
| Mechanizm rdzenia | krótki wektor przez próbkowanie gaussowskie | pytanie i odpowiedź z przerwaniami |
| FFT / NTT | FFT zmiennoprzecinkowa, krytyczna dla bezpieczeństwa | NTT, tylko arytmetyka |
| Rozmiar podpisu (najwyższy poziom) | 1280 B | 4627 B |
| Implementacja | wymagająca (liczby zmiennoprzecinkowe) | stosunkowo prostoliniowa |
| Normalizacja | przewidziana jako FIPS 206 (FN-DSA), jeszcze niezamknięta | FIPS 204, zamknięta |
Krótko mówiąc: ML-DSA łatwiej poprawnie zaimplementować i sprawdzić, FALCON dostarcza wyraźnie bardziej kompaktowe podpisy. W kodzie QR nie tkwi żaden z nich — tam stoi wyłącznie koperta Ed25519. Rozmiar podpisu liczy się dlatego przy przechowywaniu i dostarczaniu, a odporność przy implementacji. Dlatego oferujemy oba.
25. Jedno zdanie na wynos
Kto posiada tajny wektor, podpisuje w milisekundach. Kto go nie posiada, musiałby rozwiązać problem kratowy w ponad 14 000 wymiarach — także komputerem kwantowym.
Dla czytelnika opinii oznacza to po prostu: nie musi nam wierzyć. Może przeliczyć.