Схеми за подпис
Ed25519, обяснен математически
Подписът, който стои под всеки отзив в McGesund — от кривата през ключа до уравнението, което браузърът на читателя преизчислява.
Актуално към: 2026-09-07
1. За какво става дума
Отзивът в McGesund не е текстово поле в база данни, на което човек трябва просто да вярва. При изпращането той се подписва цифрово и всеки посетител може по-късно да преизчисли този подпис в собствения си браузър.
За този подпис използваме Ed25519. За разлика от FALCON и ML-DSA, които могат да бъдат положени допълнително като печат отстрани, Ed25519 не е въпрос на избор: всеки подписан отзив го носи, независимо от тарифата и начина на подаване.
Важно предварително:
Ed25519 не е криптиране. Текстът на отзива трябва да може да се чете. Подписът не доказва поверителност, а произход и цялост.
2. Какво точно се подписва
Подписва се не свободният текст, а компактен обект от данни, който еднозначно приковава текста и всичко останало:
{
"v": 1,
"typ": "rev-comment",
"f": "<ID на фирмата>",
"c": "<ID на отзива>",
"h": "<SHA-256 на текста на отзива>",
"rh": "<SHA-256 на целия запис от подаването>",
"rv": 1,
"qh": "<SHA-256 на QR плика, само при QR отзиви>",
"kid": "<ID на ключа>",
"iat": 1757203200
}
Този обект се кодира в CBOR. Точно тази последователност от байтове — а не красивото ѝ изображение по-горе — е нашето съобщение . Подписът и съобщението пътуват заедно в плик:
Тройката е версията на формата. Повече в плика няма — и по-специално няма постквантов подпис: той, ако съществува, стои до записа, а не в плика.
3. Какво трябва да постига подписът
Читателят, който попада на профил на предприятие, стои пред два въпроса:
- Наистина ли този отзив произхожда от системата на McGesund?
- Променян ли е след това?
За целта има двойка ключове:
- частен ключ — остава в услугата за подписване
- публичен ключ — може да е у всеки, адресира се чрез идентификатора на ключа (
kid) в полезния товар
Подписва се с частния ключ. Проверява се с публичния — и то в браузъра на читателя, а не на нашия сървър. Точно това е същественото: проверка, която извършваме ние и чийто резултат съобщаваме, не би била проверка, а твърдение.
4. Защо елиптична крива?
Всеки подпис се нуждае от сметка, която в едната посока е лесна, а в другата практически невъзможна. При Ed25519 това е скаларното умножение върху елиптична крива:
Изчисляването на публичната точка от тайното число отнема микросекунди. Обратното заключение от към е задачата за дискретния логаритъм — за нея не е известен метод, който при този размер да приключи в човешки срокове.
Практическата печалба спрямо по-стари методи като RSA е размерът:
| публичен ключ | подпис | |
|---|---|---|
| RSA-3072 | 384 B | 384 B |
| Ed25519 | 32 B | 64 B |
При съпоставимо ниво на сигурност. 64 байта на отзив не са величина, за която да се мисли, дори при милиони отзиви.
5. Кривата edwards25519
Смята се по модул на просто число:
Оттам идва и името. Кривата е усукана крива на Едуардс:
Една „точка“ е двойка числа от , която удовлетворява това уравнение. Няма крива, която да се види — рисунката в следващия раздел е нагледно помагало над реалните числа, а не изображение на действителното изчислително пространство.
Добавят се още две величини:
- твърдо уговорена базова точка ,
- редът на породената от подгрупа:
е просто число. Това означава: ако се събира отново и отново със себе си, се пробягват точно различни точки и се стига пак до началото. Затова всички сметки със скалари вървят по модул , а всички сметки с координати — по модул . Смесването на тези две числа е класическата грешка на начинаещия.
6. Събиране на точки
Две точки се преработват в трета по твърда формула:
Неутралният елемент е — точката, от която започва смятането.
Тази формула има свойство, което по нея не личи и което за сигурността е по-важно от всяка константа: тя е пълна. Работи за всички входове, без специални случаи за „двете точки съвпадат“ или „резултатът е неутралният елемент“. При по-старите криви на Вайерщрас тези специални случаи ги има и всеки от тях е разклонение в програмата — разклонение, чието времетраене може да бъде измерено. Който измерва колко дълго трае един подпис, научава при такива методи нещо за тайния ключ.
Пълни формули означава: винаги един и същ изчислителен път, винаги едно и също време, нищо за измерване.
7. Скаларно умножение — еднопосочната улица
означава: да се събере със себе си точно пъти. При с 253 бита това би било безсмислено много работа — затова се удвоява:
и от тези междинни резултати се сглобява желаното . Около 253 удвоявания стигат за всяко . Това е пътят напред.
Назад тази пряка път няма. Да се определи числото от точката означава да се реши задачата за дискретния логаритъм.
В истинския метод се смята по модул . Там няма „наляво“, няма „надясно“ и няма близост: от и се получават две двойки числа без каквато и да е разпознаваема връзка.
8. Двойката ключове на услугата за подписване
В началото стоят 32 случайни байта — seed. Всичко останало се извежда от тях:
От първата половина възниква тайният скалар , но не в непроменен вид. Три бита се задават, съответно изчистват — така нареченото clamping:
- най-долните три бита се нулират: така става кратно на 8. Причината е кофакторът 8 на кривата — пълната група от точки е осем пъти по-голяма от подгрупата от ред . Делящо се на 8 попада гарантирано в правилната подгрупа и не издава нищо чрез точки от малък ред.
- най-горният бит се изчиства, вторият отгоре се задава: така има винаги една и съща битова дължина. По-късо би изисквало по-малко удвоявания — и пак от времетраенето би могло да се прочете нещо.
Публичният ключ тогава е просто
записан като 32 байта: координатата , а в най-високия бит — знакът на . Самото проверяващият пресмята обратно от уравнението на кривата — двете решения се различават само по знак, а кое от тях се има предвид, казва точно този един бит.
Втората половина на хеш-стойността, префиксът, не е нужна за ключа. Тя влиза в употреба в следващия раздел.
9. Защо случайността тук не е случайност
Всеки подпис от този вид се нуждае от еднократна стойност , често наричана nonce. Тя никога не бива да се повтаря: който разполага с два подписа със същото , може да пресметне тайния ключ с училищна алгебра.
Точно на това са се провалили реални системи. Най-известният случай е проверката на подписи на една игрова конзола, чийто производител през 2010 г. използваше все един и същ nonce — с което частният ключ стана публично възстановим.
Ed25519 решава това, като изобщо не използва случайност:
Nonce зависи от тайния префикс и от съобщението. От това следват две неща:
- Два различни отзива дават с преобладаваща вероятност различни — случаят на повторение не настъпва.
- Един и същ отзив дава винаги един и същ подпис. Така един акт на подписване е проследим, а лош генератор на случайност на сървъра не може да развали нищо, защото такъв изобщо не е нужен.
За портал за отзиви с много подписи на ден това не е академично предимство. То е разликата между „грешка в източника на случайност би била фатална“ и „няма източник на случайност, който да откаже“.
10. Подписване
Три реда, повече не е:
Подписът е двойката
32 байта за точката , 32 байта за числото — общо 64 байта.
Заслужава внимание вторият ред: в влизат , публичният ключ и съобщението. Това, че също се хешира, не е украса — то предотвратява атаки, при които подпис се преиначава като валиден за друг ключ.
11. Проверка
Браузърът на читателя знае: отзива , подписа и публичния ключ . Той изчислява наново и проверява едно-единствено уравнение:
Ако то е вярно, подписът е валиден. RFC 8032 допуска допълнително умножения с кофактора вариант , който третира някои гранични случаи по-великодушно.
Никакъв сървър не се пита, никаква услуга не трябва да е достъпна. Публичният ключ е достатъчен.
12. Защо уравнението излиза
Достатъчно е да се замести:
Целият трик е в средното преобразуване: скаларното умножение се съгласува със събирането. Който знае , може да пресметне , което удовлетворява уравнението. Който не знае , би трябвало към самостоятелно избрано да намери подходящо — а това означава да реши дискретния логаритъм.
13. Напълно пресметнат мини пример
С истинските числа няма какво да се проверява — стойности от 253 бита не се проверяват наум. Затова същият метод в мъничка група, в която всяка стъпка е проследима с калкулатор.
Стъпка 1: Групата
Смятаме с остатъците по модул и вземаме . В сила е
тоест поражда подгрупа от ред . Степените са:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 4 | 8 | 16 | 9 | 18 | 13 | 3 | 6 | 12 | 1 |
поема ролята на базовата точка , а умножението — тази на събирането на точки. Скаларите се смятат по модул , стойностите — по модул .
Стъпка 2: Двойката ключове
Нека тайното е . Тогава
може да го знае всеки.
Стъпка 3: Nonce и commitment
От префикса и отзива нека се получи . Оттам:
Стъпка 4: Предизвикателството
Нека хешът над , и отзива даде
Стъпка 5: Подписът
Подписът е двойката .
Стъпка 6: Браузърът проверява
Той изчислява двете страни. Отляво:
Отдясно, при :
И двете страни дават :
Стъпка 7: Някой променя текста на отзива
Текстът влиза в хеша, тоест предизвикателството се променя — да кажем на . Подписът остава непроменен при , но дясната страна — не. При :
Можем да изтрием отзив. Не можем да го променим, без това да се забележи.
Бележка за честност към примера
Тук се смяташе в мултипликативната група по модул , а не върху крива: стои за , а произведението — за събирането на точки . Структурата е същата и точно за нея става дума. Различни са порядъците: срещу , а там ключът не се намира с изпробване на единайсет възможности.
14. Какво се случва, ако някой промени отзива
Да допуснем, че някой с достъп до базата данни — включително някой при нас — променя текста на отзива или някое от сърцата. Тогава се променя записът, а с него поне една от двете хеш-стойности h и rh в полезния товар. С това се променя , с него предизвикателството , с него дясната страна на проверочното уравнение. Старият подпис вече не пасва.
Решаващото изречение по темата: можем да изтрием отзив, но не можем да го променим незабелязано. При McGesund същата проверка се извършва допълнително всяка нощ и от страна на сървъра върху целия наличен обем — отзив, който не я издържи, повече не влиза в средната оценка на предприятието.
15. Защо нападателят се проваля
Той знае публичния ключ , базовата точка , кривата и всеки издаден досега подпис. Липсва му .
Най-добрата известна класическа атака срещу задачата за дискретния логаритъм в група от ред изисква около стъпки. При това са около
операции. За сравнение: дори машина, която успява с милиард милиарда () стъпки в секунда, би се нуждаела за това от многократната възраст на Вселената.
Фалшифициране без ключа би означавало към самостоятелно избрано да се намери подходящо — същата задача в друга маскировка.
16. Защо Ed25519, а не ECDSA
И двата почиват на един и същ проблем. Разликата е във всичко останало наоколо:
| ECDSA (криви на NIST) | Ed25519 | |
|---|---|---|
| Nonce | нужна е прясна случайност | детерминиран от префикс и съобщение |
| Формули | специални случаи, зависещи от данните разклонения | пълни, един изчислителен път |
| Параметри на кривата | произходът на константите така и не е обяснен докрай | избрани по проследими критерии |
| Размер на подписа | 64–72 B, променливо кодиране | твърдо 64 B |
| В браузъра | отдавна наличен | от 2023/2024 г. нативно, иначе като JS библиотека |
За нас решаващият аргумент беше nonce. Портал за отзиви подписва често и автоматизирано; метод, при който една-единствена слаба случайна стойност издава ключа, е за целта погрешен избор.
17. Какво Ed25519 не постига
Ed25519 почива на дискретния логаритъм — а точно този проблем достатъчно голям квантов компютър решава ефикасно с алгоритъма на Шор. Дали и кога ще съществуват такива машини, е открит въпрос. За отзив, който след десет години все още трябва да е проверим, това въпреки всичко е въпрос, на който трябва да се отговори днес.
Затова до подписа Ed25519 може да застане квантово устойчив печат:
- FALCON (FN-DSA) — компактни подписи от решетки NTRU
- ML-DSA-87 (FIPS 204) — завършеният стандарт на NIST
Двата не заместват Ed25519, а лягат до него. Ако единият метод бъде пробит, другият продължава да носи.
18. Процесът в картина
19. Какво прави McGesund конкретно с това
Пликът. Всеки подписан отзив носи плик MCG1: с версия на формата, полезен товар и подпис Ed25519. Полето kid в полезния товар казва кой ключ се има предвид; съответния публичен ключ сървърът доставя при запитване — той е публичен, там няма какво да се пази.
Проверката в браузъра. Chrome и Firefox могат да работят с Ed25519 нативно от 2023/2024 г. през интерфейса WebCrypto. Safari — не; там извикването хвърля грешка вместо да провери. Затова нашият проверяващ код се връща към чиста реализация на JavaScript, която се дозарежда само там, където е нужна. Така проверката на подписа минава във всеки браузър, и то на устройството на читателя.
Времевата котва. Отпечатъкът на ключа за подписване се закотвя чрез OpenTimestamps в блок на Bitcoin. С това може да се докаже не само че подписът е истински, а и че ключът вече е съществувал в определен момент — без някой да трябва да вярва на нашия времеви печат.
Обвързването със съдържанието. Полезният товар носи rh — хеша над целия запис от подаването: текст, сърца, гео статус, данни за повода и произход. Така подписът Ed25519 обвързва не само текста, а всичко, което се показва до отзива.
20. Едно изречение за накрая
Който притежава тайния скалар, подписва за микросекунди. Който не го притежава, би трябвало да реши дискретен логаритъм в група с около елемента.
За читателя на един отзив това означава простичко: той не трябва да ни вярва. Може да провери сам.