Схеми за подпис
ML-DSA-87, обяснен математически
Как ML-DSA-87 (FIPS 204) подписва един отзив в McGesund — от Module-LWE през rejection sampling до проверката в браузъра.
Актуално към: 2026-09-07
1. За какво става дума
Когато някой публикува отзив в McGesund, на заден план се случва повече, отколкото текстът подсказва. При изпращането отзивът се подписва цифрово. Този подпис всеки посетител може по-късно да преизчисли в собствения си браузър — без да ни се доверява и без да ни пита.
За клиенти от тарифа Pro нагоре това става наред с останалото и с ML-DSA-87. Тази статия обяснява какво се случва при това математически.
Важно предварително:
ML-DSA не е криптиране. Текстът на отзива остава публично четим — това е и смисълът на един отзив. ML-DSA не доказва поверителност, а произход и цялост.
ML-DSA е разработен от CRYSTALS-Dilithium и е стандартизиран като FIPS 204. Числото 87 обозначава нивото на параметрите. Има три:
- ML-DSA-44
- ML-DSA-65
- ML-DSA-87
ML-DSA-87 е най-високото и попада в категория 5 за сигурност на NIST.
2. Какво точно се подписва?
В подписа влиза не самият текст на отзива, а компактен обект от данни, който еднозначно приковава текста. При McGesund той изглежда в основата си така:
{
"v": 1,
"typ": "rev-comment",
"f": "<ID на фирмата>",
"c": "<ID на отзива>",
"h": "<SHA-256 на текста на отзива>",
"rh": "<SHA-256 на целия запис от подаването>",
"rv": 1,
"qh": "<SHA-256 на QR плика, само при QR отзиви>",
"iat": 1757203200
}
Този обект е нашето съобщение . То свързва шест твърдения:
- Към кое предприятие принадлежи отзивът (
f) - Кой отзив се има предвид (
c) - Какъв текст е стоял зад него — като хеш-стойност (
h) - Какъв запис като цяло е бил подаден (
rh): текст, сърца, гео статус и данни за повода, канонично сериализирани и хеширани — във версия на схематаrv - От кой QR код произхожда отзивът (
qh); без QR полето отпада - Кога е подписано (
iat)
Ако някой промени по-късно един-единствен знак в текста на отзива, h вече не пасва — а също и rh. Който вместо това само завърти сърцата, оставя h недокоснат, но разрушава rh. Промени ли някой една от тези хеш-стойности, подписът вече не пасва. Точно тази верига е същественото.
3. Какво трябва да постига подписът
Посетителят, който чете отзива, трябва да може сам да провери три неща:
- Отзивът действително е издаден от McGesund.
- Текстът не е променян от изпращането насам.
- Никой не може да измисли нов, изглеждащ валиден отзив.
За целта има двойка ключове:
- частен ключ — намира се изключително в услугата за подписване
- публичен ключ — може да е у всеки, адресира се чрез идентификатора на ключа (
kid) в плика
Подписва се с частния ключ. Проверява се с публичния — и то в браузъра на читателя, а не на нашия сървър.
4. Защо изобщо постквантов метод?
Много от днес обичайните схеми за подпис почиват на факторизацията на големи числа или на дискретни логаритми. Достатъчно мощен квантов компютър би могъл да решава именно тези задачи значително по-бързо с известни алгоритми.
За един отзив това не е академичен въпрос. Отзивът трябва да е проверим и след десет години. Който подписва днес, подписва за целия живот на записа.
Затова ML-DSA използва друга основа:
По-точно: Module-LWE и Module-SIS.
5. Какво е решетка?
Най-напред просто точки в пространството. Да вземем два вектора:
Всички целочислени комбинации
образуват решетката. Например:
Решаващото:
В малки размерности решетъчните задачи са лесни. В много високи размерности определени задачи стават изключително трудни.
6. Полиноми вместо отделни числа
ML-DSA не смята с двумерни вектори, а с полиноми и вектори от полиноми.
Полином като
може да се запише като списък от коефициенти:
Смята се в пръстен:
Това означава две неща:
- : смятане по модул
- : допълнително правило, което фиксира дължината на полинома
За всичките три нива на ML-DSA важи:
Един полином има следователно 256 коефициента, разглеждани по модул 8 380 417. Онова, което се променя между нивата, не е или , а размерът на матриците — за това по-нататък.
Между другото: умножението на полиноми в този пръстен на практика минава през NTT, теоретико-числовия вариант на бързото преобразувание на Фурие. Тоест ML-DSA съвсем не минава без идеите на FFT; те просто стоят в аритметиката, а не в принципа на подписа.
7. Централният трик: Module-LWE
Основната идея е Module Learning With Errors:
При това:
- — публична, привидно случайна матрица от полиноми
- — малки тайни вектори
- — публична стойност
Нападателят знае и , но не и . За него уравнението изглежда като случайно уравнение с шум. Малките тайни не бива да могат да се пресметнат обратно от него ефикасно.
8. Мъничък числов пример
Нарочно вземаме смехотворно малък вариант — обикновени числа вместо полиноми, размерност 2 вместо 256, и
Нека
Тогава:
В този миниформат всички възможности биха могли да се изпробват. При ML-DSA-87 е матрица от полиноми с по 256 коефициента — това са над 14 000 неизвестни в решетъчната структура.
9. Двойката ключове на услугата за подписване
Частният ключ съдържа наред с останалото малките вектори . При ML-DSA-87 техните коефициенти произхождат от интервала
тоест от . Тази малка големина не е подробност, а самата сърцевина: само защото тайните са малки, изобщо възниква трудна решетъчна задача.
Публичният ключ е опростено
е seed, от който може да се възстанови детерминирано — тоест матрицата не се налага да бъде предавана. са горните битове на ; долните бита отпадат, което смалява ключа значително. Точно това изпускане е по-късно причината за така наречените hints.
С това възниква желаната асиметрия:
10. Отзивът се превръща в число
Услугата за подписване първо хешира обекта на полезния товар от раздел 2:
В нашия пример играчка вземаме изкуствен мини хеш. В истинската система е с дължина 512 бита и обвързва допълнително публичния ключ — така подпис не може да бъде преиначен като валиден за друг ключ.
11. Commitment
Услугата за подписване тегли случаен малък вектор . В нашия пример:
От него възниква междинна стойност — commitment:
Това още не е подпис.
12. От отзива се получава предизвикателство
Съобщението и commitment се хешират заедно:
При ML-DSA-87 е полином с точно коефициента от , а всички останали 196 са нула. Тази структура е нарочна: тя държи малко.
В нашия пример играчка просто задаваме
13. Същинският подпис
С нашите стойности:
14. Стъпката, която лесно се пропуска: rejection sampling
Тук е мястото, на което ML-DSA се различава от една наивна конструкция — и то не е по избор.
съдържа тайната . Ако просто се издаваше винаги, би могло да се пресметне статистически от достатъчно много подписи. При портал за отзиви с много подписи на ден това не е теоретичен риск.
Затова услугата за подписване проверява преди издаването дали издава твърде много и в противен случай отхвърля подписа — тогава се започва отначало с ново случайно . Това се нарича Fiat-Shamir with Aborts.
Условието гласи по същество:
За ML-DSA-87 важи и . Към това идва втора граница върху долните битове. На практика няколко пробега са нормални — тоест подписването е циклична процедура, а не еднократна стъпка.
За верификацията е важно: точно тази граница браузърът проверява по-късно също. Подпис с твърде големи коефициенти се отхвърля дори когато уравнението излиза.
15. Защо браузърът може да провери това
Браузърът на читателя знае:
- отзива и с това
- публичния ключ
- подписа
Той не знае . Връзката, която въпреки това го придвижва напред:
И тъй като важи
неизвестното може да се замести с публичната стойност:
Това е централното уравнение — и то казва нещо важно: браузърът реконструира не точно, а само с точност до малкия член .
16. Мини примерът докрай
Имахме:
Да пресметнем:
Първоначалният commitment беше
Разликата възлиза на
Тоест точно предсказаният малък член на грешката. Верификаторът получава не , а нещо, което лежи близо до .
Именно затова ML-DSA сравнява не самите стойности, а техните горни битове. И именно затова подписът съдържа допълнително вектор с hints : той съобщава компактно на кои места закръглянето е прескочило граница заради малкия член на грешката. При ML-DSA-87 са позволени най-много такива указания. Те не издават тайната — само поправят закръглянето.
Накрая браузърът изчислява предизвикателството наново. Ако то съвпадне,
и всички норми лежат в границите, подписът е валиден.
17. Какво се случва, ако някой промени отзива?
Да допуснем, че някой с достъп до базата данни — включително някой при нас — променя текста на отзива или някое от сърцата. Тогава се променя поне една от двете хеш-стойности в полезния товар (h при текста, rh при всяко поле от записа):
С това се променя предизвикателството:
Наличният подпис обаче е бил създаден за старото предизвикателство. Браузърът пресмята и установява:
Решаващото изречение по темата: можем да изтрием отзив, но не можем да го променим незабелязано. При McGesund същата проверка се извършва допълнително всяка нощ и от страна на сървъра върху целия наличен обем — отзив, който не издържи тази проверка, повече не влиза в средната оценка на предприятието.
18. Защо никой не може да измисли подпис?
Нападателят знае и , но не и . За да построи валиден подпис, той би трябвало да намери тройка , която
- удовлетворява уравнението за верификация и
- спазва границите на нормата и
- пасва на предизвикателството, което се получава от точно тези стойности.
По същество това опира до трудна решетъчна задача — конкретно до Module-SIS: да се намерят къси решения на хомогенно уравнение по модул . Условието за малка големина при това не е украса, а самата степен на трудност. Без него решението би било тривиално.
19. Защо „Module“?
Думата описва структурата между простите вектори и общите решетки. Вместо с отделни числа, ML-DSA работи с вектори от полиноми:
и с матрици от тях:
Предимството: получава се високата размерност на решетка, но се запазва компактно, ефикасно пресметливо представяне. Сигурността може да се донастройва фино през размера на матрицата, без да се сменя пръстенът.
20. Защо точно 87?
Трите нива се различават не по пръстена, а по размерностите:
| Параметър | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Размер на матрицата | |||
| Обхват на тайната | 2 | 4 | 2 |
| Тегло на предизвикателството | 39 | 49 | 60 |
| Публичен ключ | 1312 B | 1952 B | 2592 B |
| Подпис | 2420 B | 3309 B | 4627 B |
| Категория на NIST | 2 | 3 | 5 |
Забележително: ML-DSA-87 не е просто „ML-DSA-65, само по-голям“. Обхватът на тайната се връща от 4 обратно на 2; сигурността тук идва от по-голямата матрица, а не от по-големи коефициенти. Става дума за самостоятелен, стандартизиран избор на параметри.
Цената: 4627 байта на подпис — на всеки печат, който се съхранява и при проверката се доставя до браузъра. Затова при McGesund наред с ML-DSA-87 е достъпен и FALCON, който се справя с 1280 байта.
21. Fiat-Shamir: защо работи без отсрещна страна
Едно интерактивно доказателство би протекло така:
- Услугата за подписване изпраща commitment.
- Проверяващият изпраща случайно предизвикателство.
- Услугата за подписване отговаря.
- Проверяващият пресмята.
При един отзив този диалог го няма — читателят идва месеци по-късно. Решението е трансформацията на Фиат-Шамир: предизвикателството не се хвърля на зарове, а се хешира от самите данни:
Така от диалог се получава документ. Услугата за подписване не може да си избере предизвикателството, защото за целта би трябвало да контролира хеша.
22. Целият процес
23. Какво прави McGesund конкретно с това
Три равнища се захващат едно за друго:
Пликът. Всеки подписан отзив носи подпис Ed25519. Това е задължителният вариант — класически, мъничък, проверим нативно във всеки браузър.
Постквантовите печати. Допълнително до него могат да бъдат положени един или два квантово устойчиви подписа. Кои — зависи от тарифата:
| Тарифа | налични нива на подпис |
|---|---|
| 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, и двата успоредно |
Успоредният вариант е съзнателно резервиран. Ако едно от двете математически семейства — решетки NTRU при FALCON, модулни решетки при ML-DSA — се окаже по-слабо от предполаганото днес, другото продължава да носи.
Времевата котва. Отпечатъкът на ключа за подписване се закотвя чрез OpenTimestamps в блок на Bitcoin. С това може да се докаже не само че подписът е истински, а и че той вече е съществувал в определен момент — без някой да трябва да вярва на нашия времеви печат.
Всичко това се проверява в браузъра на читателя, чрез модул WASM. Ние доставяме данните; пресмятането става на устройството на посетителя. Ако утре излезем от мрежата, веднъж изтеглен отзив би останал проверим.
24. ML-DSA и FALCON едно до друго
| Свойство | FALCON (FN-DSA) | ML-DSA |
|---|---|---|
| Тип | цифров подпис | цифров подпис |
| Решетъчно семейство | NTRU | Module-LWE / Module-SIS |
| Пръстен | , | , |
| Основен механизъм | къс вектор чрез гаусово семплиране | предизвикателство и отговор с прекъсвания |
| FFT / NTT | FFT с плаваща запетая, критична за сигурността | NTT, само аритметика |
| Размер на подписа (най-високо ниво) | 1280 B | 4627 B |
| Реализация | взискателна (плаваща запетая) | сравнително праволинейна |
| Стандартизация | предвиден като FIPS 206 (FN-DSA), още незавършен | FIPS 204, завършен |
Накратко: ML-DSA е по-лесен за коректна реализация и проверка, FALCON доставя значително по-компактни подписи. В QR кода не стои нито един от двата — там стои единствено пликът Ed25519. Затова размерът на подписа тежи при съхранението и доставката, а устойчивостта — при реализацията. Затова предлагаме и двете.
25. Едно изречение за накрая
Който притежава тайния вектор, подписва за милисекунди. Който не го притежава, би трябвало да реши решетъчна задача в над 14 000 измерения — дори с квантов компютър.
За читателя на един отзив това означава простичко: той не трябва да ни вярва. Може да провери сам.