Aláírási eljárás

Az Ed25519 matematikai magyarázata

Az az aláírás, amely minden McGesund-értékeléshez hozzátartozik — a görbétől a kulcson át egészen addig az egyenletig, amelyet az olvasó böngészője újraszámol.

Állapot: 2026-09-07

1. Miről van szó

A McGesundnál egy értékelés nem pusztán egy szövegmező az adatbázisban, amelynek hinni kell. Beküldéskor digitálisan aláírjuk, és ezt az aláírást később bármelyik látogató újraszámolhatja a saját böngészőjében.

Ehhez az aláíráshoz az Ed25519 eljárást használjuk. A FALCON-nal és az ML-DSA-val ellentétben, amelyek további bélyegzőként helyezhetők mellé, az Ed25519 nem opció: minden aláírt értékelés hordozza, függetlenül a csomagtól és a beküldés módjától.

Fontos előrebocsátani:

Az Ed25519 nem titkosítás. Az értékelés szövegét éppen hogy el kell tudni olvasni. Az aláírás nem a titkosságot bizonyítja, hanem az eredetet és a sértetlenséget.


2. Mit írunk alá pontosan

Nem a folyószöveget írjuk alá, hanem egy tömör adatobjektumot, amely a szöveget és minden továbbit egyértelműen rögzít:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<cégazonosító>",
  "c":   "<értékelésazonosító>",
  "h":   "<az értékelés szövegének SHA-256 hasítóértéke>",
  "rh":  "<a teljes beküldött adatrekord SHA-256 hasítóértéke>",
  "rv":  1,
  "qh":  "<a QR-envelope SHA-256 hasítóértéke, csak QR-értékeléseknél>",
  "kid": "<kulcsazonosító>",
  "iat": 1757203200
}

Ezt az objektumot CBOR formátumba kódoljuk. Ez a bájtsorozat — nem a fenti szép megjelenítése — a mi mm üzenetünk. Az aláírás és az üzenet együtt kerül egy borítékba:

Envelope=MCG1:    base64url(CBOR[3,  m,  σ])\text{Envelope} = \texttt{MCG1:} \;\|\; \mathrm{base64url}\bigl(\mathrm{CBOR}[\,3,\; m,\; \sigma\,]\bigr)

A 33 a formátum verziószáma. Több nincs benne — különösen nincs benne poszt-kvantum aláírás: az, ha van ilyen, az adatrekord mellett található, nem a borítékban.


3. Mit kell teljesítenie az aláírásnak

Az olvasó, aki egy cégprofilra érkezik, két kérdés előtt áll:

  1. Valóban a McGesund rendszeréből származik ez az értékelés?
  2. Módosították-e utólag?

Ehhez egy kulcspár tartozik:

  • egy titkos kulcs — az aláíró szolgáltatásban marad
  • egy nyilvános kulcs — bárkinél lehet, a payloadban lévő kulcsazonosítón (kid) keresztül címezhető

Az aláírás a titkos kulccsal készül. Az ellenőrzés a nyilvánossal — méghozzá az olvasó böngészőjében, nem a mi szerverünkön. Éppen ez a lényeg: az az ellenőrzés, amelyet mi magunk végzünk el, és amelynek eredményét közöljük, nem ellenőrzés volna, hanem állítás.


4. Miért elliptikus görbe?

Minden aláíráshoz olyan számítás kell, amely az egyik irányban könnyű, a másikban gyakorlatilag lehetetlen. Az Ed25519 esetében ez a skalárszorzás egy elliptikus görbén:

a    A=aB.a \;\longmapsto\; A = a\cdot B.

A titkos aa számból kiszámolni az AA nyilvános pontot mikromásodpercekbe kerül. Az AA-ból visszakövetkeztetni aa-ra a diszkrét logaritmus problémája — erre nem ismert olyan eljárás, amely ekkora méretnél emberi időtávon belül végezne.

Az RSA-hoz hasonló régebbi eljárásokkal szembeni gyakorlati nyereség a méret:

nyilvános kulcsaláírás
RSA-3072384 B384 B
Ed2551932 B64 B

Összehasonlítható biztonsági szint mellett. Az értékelésenkénti 64 bájt még milliónyi értékelés esetén sem olyan méret, amelyen gondolkodni kellene.


5. Az edwards25519 görbe

A számítás egy prímszám szerinti maradékokkal történik:

p=225519.p = 2^{255}-19.

Innen a név. A görbe egy csavart Edwards-görbe:

x2+y2  =  1+dx2y2,d=121665121666modp.-x^2+y^2 \;=\; 1 + d\,x^2y^2, \qquad d = -\frac{121665}{121666} \bmod p.

Egy „pont" egy (x,y)(x,y) számpár a {0,,p1}\{0,\dots,p-1\} halmazból, amely kielégíti ezt az egyenletet. Nincs látható görbe — a következő szakasz rajza szemléltetés a valós számok fölött, nem a tényleges számítási tér képe.

Két mennyiség jön még hozzá:

  • egy rögzített megállapodás szerinti bázispont, BB,
  • a BB által generált részcsoport rendje, \ell:
=2252+27742317777372353535851937790883648493.\ell = 2^{252} + 27742317777372353535851937790883648493.

Az \ell prím. Ez azt jelenti: ha BB-t újra és újra önmagához adjuk, pontosan \ell különböző ponton haladunk végig, majd ismét a kiindulóponton kötünk ki. Ezért a skalárokkal végzett minden számítás modulo \ell, a koordinátákkal végzett minden számítás pedig modulo pp történik. E két szám összekeverése a klasszikus kezdő hiba.


6. Pontok összeadása

Két pontot egy rögzített képlet szerint számolunk össze egy harmadikká:

x3=x1y2+y1x21+dx1x2y1y2,y3=y1y2x1x21dx1x2y1y2.x_3=\frac{x_1y_2+y_1x_2}{1+d\,x_1x_2y_1y_2}, \qquad y_3=\frac{y_1y_2-x_1x_2}{1-d\,x_1x_2y_1y_2}.

A semleges elem a (0,1)(0,1) — az a pont, ahol a számolás kezdődik.

Ennek a képletnek van egy olyan tulajdonsága, amely nem látszik rajta, és amely a biztonság szempontjából minden konstansnál fontosabb: teljes. Minden bemenetre működik, különleges esetek nélkül, tehát nincs külön ág arra, hogy „a két pont azonos" vagy „az eredmény a semleges elem". A régebbi Weierstrass-görbéknél léteznek ezek a különleges esetek, és mindegyikük egy-egy elágazás a programban — olyan elágazás, amelynek futásideje megmérhető. Aki megméri, mennyi ideig tart egy aláírás, ilyen eljárásoknál megtud valamit a titkos kulcsról.

A teljes képletek azt jelentik: mindig ugyanaz a számítási út, mindig ugyanannyi idő, nincs mit mérni.


7. Skalárszorzás — az egyirányú utca

Az nBn\cdot B azt jelenti: BB-t pontosan nn-szer önmagához adni. Egy 253 bites nn esetén ez értelmetlenül sok munka lenne — ezért duplázunk:

B2B4B8BB \to 2B \to 4B \to 8B \to \dots

és ezekből a részeredményekből állítjuk össze a kívánt nn-t. Nagyjából 253 duplázás elegendő bármely nn-hez. Ez az előrefelé vezető út.

Visszafelé nincs ilyen rövidítés. Az AA pontból meghatározni az aa számot annyit tesz, mint megoldani a diszkrét logaritmus problémáját.

(0,1) — semleges elemB2B3B4B5B6B
Egy Edwards-görbe a bázispont első többszöröseivel, a valódi összeadási törvénnyel számolva. A valós számok fölött ezek még láthatóan rendezetten vándorolnak a görbén — az út visszakövethető lenne. Modulo p éppen ez a rend tűnik el, és ezen alapul a biztonság.

A valódi eljárásban modulo pp számolunk. Ott nincs „bal", nincs „jobb" és nincs közelség: a 17B17\,B-ből és a 18B18\,B-ből két olyan számpár lesz, amelyek között semmiféle felismerhető rokonság nincs.


8. Az aláíró szolgáltatás kulcspárja

Az elején 32 véletlen bájt áll, a seed. Minden továbbit ebből vezetünk le:

h=SHA-512(seed),h=h0..31  a    h32..63prefix.h = \mathrm{SHA\text{-}512}(\text{seed}), \qquad h = \underbrace{h_{0..31}}_{\to\;a}\;\|\;\underbrace{h_{32..63}}_{\text{prefix}}.

Az első félből keletkezik az aa titkos skalár, de nem változatlanul. Három bitet beállítunk, illetve törlünk — ez az úgynevezett clamping:

  • a legalsó három bitet nullára állítjuk: ezáltal aa a 8 többszöröse lesz. Az ok a görbe 8-as kofaktora — a teljes pontcsoport nyolcszor akkora, mint az \ell rendű részcsoport. A 8-cal osztható aa garantáltan a megfelelő részcsoportba kerül, és nem árul el semmit a kis rendű pontokról.
  • a legfelső bitet töröljük, az alatta lévőt beállítjuk: ezzel aa bithossza mindig azonos. Egy rövidebb aa kevesebb duplázást igényelne — és megint le lehetne olvasni valamit a futásidőből.

A nyilvános kulcs ezután egyszerűen

A=aB,A = a\cdot B,

32 bájton tárolva: az yy-koordináta, a legmagasabb bitben pedig az xx előjele. Az xx-et az ellenőrző maga számolja vissza a görbeegyenletből — a két megoldás csak előjelben tér el, és hogy melyikről van szó, azt ez az egyetlen bit mondja meg.

A hasítóérték második fele, a prefix, nem kell a kulcshoz. A következő szakaszban kerül sorra.


9. Miért nem véletlen itt a véletlen

Minden ilyen felépítésű aláíráshoz kell egy egyszer használatos érték, rr, amelyet gyakran nonce-nak neveznek. Soha nem ismétlődhet: akinek két aláírása van ugyanazzal az rr-rel, az középiskolás algebrával kiszámolhatja a titkos kulcsot.

Pontosan ezen buktak el valós rendszerek. A legismertebb eset egy játékkonzol aláírás-ellenőrzése, amelynek gyártója 2010-ben mindig ugyanazt a nonce-ot használta — a titkos kulcs ezzel nyilvánosan rekonstruálható volt.

Az Ed25519 úgy oldja meg ezt, hogy egyáltalán nem használ véletlent:

r=SHA-512(prefix    m)mod.r = \mathrm{SHA\text{-}512}(\text{prefix}\;\|\;m) \bmod \ell.

A nonce a titkos prefixtől és az üzenettől függ. Ebből kettő következik:

  • Két különböző értékelés elsöprő valószínűséggel különböző rr-t ad — az ismétlődés esete nem áll elő.
  • Ugyanaz az értékelés mindig ugyanazt az aláírást adja. Egy aláírási művelet így utólag reprodukálható, és egy rossz véletlenszám-generátor a szerveren nem tehet kárt, mert nincs is rá szükség.

Egy naponta sok aláírást előállító értékelőportál esetében ez nem elméleti előny. Ez a különbség aközött, hogy „a véletlenforrás hibája végzetes volna" és aközött, hogy „nincs olyan véletlenforrás, amely kieshetne".


10. Aláírás

Három sor, nem több:

r=H(prefix    m)mod,R=rB,r = H(\text{prefix}\;\|\;m) \bmod \ell, \qquad R = r\cdot B,
k=H(R    A    m)mod,k = H(R \;\|\; A \;\|\; m) \bmod \ell,
S=(r+ka)mod.S = (r + k\,a) \bmod \ell.

Az aláírás a pár

σ=(R,S),\sigma = (R,\,S),

32 bájt az RR pontnak, 32 bájt az SS számnak — együtt 64 bájt.

Figyelemre méltó a második sor: a kk-ba beleszámít RR, az AA nyilvános kulcs és az üzenet. Az, hogy AA-t is hasheljük, nem mellékes díszítés — megakadályozza azokat a támadásokat, amelyekben egy aláírást egy másik kulcsra értelmeznek át.


11. Ellenőrzés

Az olvasó böngészője ismeri: az mm értékelést, az (R,S)(R,S) aláírást és az AA nyilvános kulcsot. Újraszámolja a kk-t, és egyetlen egyenletet ellenőriz:

SB  =  R+kA\boxed{S\cdot B \;=\; R + k\cdot A}

Ha teljesül, az aláírás érvényes. Az RFC 8032 megengedi ezenkívül a kofaktorral szorzott változatot is, 8SB=8R+8kA8S\cdot B = 8R + 8k\cdot A, amely néhány határesetet nagyvonalúbban kezel.

Semmilyen szervert nem kérdezünk meg, semmilyen szolgáltatásnak nem kell elérhetőnek lennie. A nyilvános kulcs elegendő.


12. Miért jön ki az egyenlet

Elég behelyettesíteni:

SB=(r+ka)B=rB+k(aB)=R+kA.S\cdot B = (r + k\,a)\cdot B = r\cdot B + k\,(a\cdot B) = R + k\cdot A.

Az egész trükk a középső átalakításban rejlik: a skalárszorzás összefér az összeadással. Aki ismeri aa-t, ki tud számolni olyan SS-t, amely kielégíti az egyenletet. Aki nem ismeri aa-t, annak egy maga választotta kk-hoz kellene megfelelő SS-t találnia — ez pedig azt jelenti, hogy meg kell oldania a diszkrét logaritmust.


13. Egy teljesen végigszámolt minipélda

A valódi számokkal nincs mit utánaszámolni — a 253 bites értékek fejben nem ellenőrizhetők. Ezért ugyanaz az eljárás egy parányi csoportban, ahol minden lépés zsebszámológéppel követhető.

1. lépés: A csoport

A 2323 szerinti maradékokkal számolunk, és g=2g = 2-t választunk. Fennáll, hogy

211=2048=8923+11(mod23),2^{11} = 2048 = 89\cdot 23 + 1 \equiv 1 \pmod{23},

tehát gg egy =11\ell = 11 rendű részcsoportot generál. A hatványok a következők:

nn1234567891011
gng^n248169181336121

A gg veszi át a BB bázispont szerepét, a szorzás pedig a pontösszeadásét. A skalárok modulo 1111, az értékek modulo 2323 számolódnak.

2. lépés: A kulcspár

Legyen a titok a=6a = 6. Ekkor

A=ga=26=6418(mod23).A = g^a = 2^6 = 64 \equiv 18 \pmod{23}.

Az A=18A = 18 bárki tudhatja.

3. lépés: Nonce és commitment

A prefixből és az értékelésből adódjon r=4r = 4. Ebből:

R=gr=24=16.R = g^r = 2^4 = 16.

4. lépés: A challenge

Az RR-re, AA-ra és az értékelésre vett hasítóérték adjon

k=5.k = 5.

5. lépés: Az aláírás

S=(r+ka)mod11=(4+56)mod11=34mod11=1.S = (r + k\,a) \bmod 11 = (4 + 5\cdot 6) \bmod 11 = 34 \bmod 11 = 1.

Az aláírás a (R,S)=(16,1)(R,S) = (16,\,1) pár.

6. lépés: A böngésző ellenőriz

Mindkét oldalt kiszámolja. Bal oldal:

gS=21=2.g^S = 2^1 = 2.

Jobb oldal, 1853(mod23)18^5 \equiv 3 \pmod{23} felhasználásával:

RAk=163=482(mod23).R\cdot A^{k} = 16\cdot 3 = 48 \equiv 2 \pmod{23}.

Mindkét oldal 22-t ad:

Az alaˊıˊraˊeˊrveˊnyes\boxed{\text{Az aláírás érvényes}}

7. lépés: Valaki megváltoztatja az értékelés szövegét

A szöveg bekerül a hasításba, tehát megváltozik a challenge — mondjuk k=7k' = 7 lesz. Az aláírás változatlanul (16,1)(16,1) marad, a jobb oldal viszont nem. A 1876(mod23)18^7 \equiv 6 \pmod{23} felhasználásával:

RAk=166=964(mod23)    2=gSR\cdot A^{k'} = 16\cdot 6 = 96 \equiv 4 \pmod{23} \;\neq\; 2 = g^S
Az alaˊıˊraˊeˊrveˊnytelen\boxed{\text{Az aláírás érvénytelen}}

Egy értékelést törölni tudunk. Megváltoztatni viszont nem tudjuk anélkül, hogy az feltűnne.

Őszinte megjegyzés a példához

Itt a 2323 szerinti multiplikatív csoportban számoltunk, nem görbén: a gSg^S áll az SBS\cdot B helyett, az RAkR\cdot A^k szorzat pedig az R+kAR + k\cdot A pontösszeadás helyett. A struktúra ugyanaz, és éppen erről van szó. A nagyságrendek különböznek: =11\ell = 11 szemben azzal, hogy 2252\ell \approx 2^{252}, és ott a kulcs nem található meg tizenegy lehetőség végigpróbálásával.


14. Mi történik, ha valaki megváltoztatja az értékelést

Tegyük fel, hogy valaki adatbázis-hozzáféréssel — akár nálunk valaki — megváltoztatja az értékelés szövegét vagy az egyik szívet. Ekkor megváltozik az adatrekord, és ezzel a payloadban lévő h és rh hasítóértékek közül legalább az egyik. Ezzel megváltozik mm, ezzel a kk challenge, ezzel az ellenőrző egyenlet jobb oldala. A régi aláírás már nem illeszkedik.

A döntő mondat ehhez: egy értékelést törölni tudunk, de észrevétlenül megváltoztatni nem. A McGesundnál ugyanez az ellenőrzés éjszakánként a szerveroldalon is végigfut az állományon — az az értékelés, amely nem felel meg neki, többé nem számít bele a cég átlagába.


15. Miért bukik el a támadó

Ismeri az AA nyilvános kulcsot, a BB bázispontot, a görbét és minden eddig kiállított aláírást. Ami hiányzik neki, az az aa.

A diszkrét logaritmus problémája elleni legjobb ismert klasszikus támadás egy \ell rendű csoportban körülbelül \sqrt{\ell} lépést igényel. 2252\ell \approx 2^{252} esetén ez nagyjából

21262^{126}

művelet. Összehasonlításképpen: még egy olyan gépnek is, amely másodpercenként milliárdszor milliárd (101810^{18}) lépést hajt végre, az univerzum korának többszörösére volna szüksége hozzá.

Hamisítani a kulcs nélkül azt jelentené, hogy egy maga választotta kk-hoz kell megfelelő SS-t találni — ugyanaz a feladat más álruhában.


16. Miért az Ed25519 és nem az ECDSA

Mindkettő ugyanazon a problémán alapul. A különbség mindabban rejlik, ami körülötte történik:

ECDSA (NIST-görbék)Ed25519
Noncefriss véletlen szükségesdeterminisztikus a prefixből és az üzenetből
Képletekkülönleges esetek, adatfüggő elágazásokteljes, egyetlen számítási út
Görbeparamétereka konstansok eredete sosem lett teljesen megmagyarázvakövethető kritériumok alapján választva
Aláírás mérete64–72 B, változó kódolásfixen 64 B
Böngészőbenrégóta elérhető2023/2024 óta natívan, egyébként JS-könyvtárként

Számunkra a nonce volt a döntő érv. Egy értékelőportál gyakran és automatizáltan ír alá; az az eljárás, amelynél egyetlen gyenge véletlen érték kiadja a kulcsot, erre rossz választás.


17. Amit az Ed25519 nem nyújt

Az Ed25519 a diszkrét logaritmuson alapul — és pontosan ezt a problémát oldja meg hatékonyan egy kellően nagy kvantumszámítógép Shor algoritmusával. Hogy léteznek-e és mikor ilyen gépek, nyitott kérdés. Egy olyan értékelésnél viszont, amelynek tíz év múlva is ellenőrizhetőnek kell lennie, ez mégis olyan kérdés, amelyre ma kell választ adni.

Ezért az Ed25519-aláírás mellé kvantumrezisztens bélyegző kerülhet:

Egyik sem váltja ki az Ed25519-et, hanem mellé kerül. Ha az egyik eljárás megtörik, a másik tovább visz.


18. A folyamat képben

ALÁÍRÓ SZOLGÁLTATÁS (MCGESUND)A LÁTOGATÓ BÖNGÉSZŐJEtitkos skalár a + prefix (a seedből)payload m = {cég, értékelés, h, rh, iat}r = H(prefix ‖ m) mod ℓR = r · Bk = H(R ‖ A ‖ m) mod ℓS = (r + k · a) mod ℓaláírás σ = (R, S) + kidértékelés + σ + A nyilvános kulcsk újraszámolása R, A és m alapjánS · B = R + k · A ?érvényesérvénytelen
A payloadtól a böngészőben megjelenő pipáig. Az elválasztó vonal fölött minden egyszer, a beküldéskor történik, alatta minden olvasónál újra — az ő eszközén, pusztán a nyilvános kulccsal.

19. Mit kezd ezzel konkrétan a McGesund

A boríték. Minden aláírt értékelés hordoz egy MCG1: borítékot a formátumverzióval, a payloaddal és az Ed25519-aláírással. A payloadban lévő kid megmondja, melyik kulcsról van szó; a hozzá tartozó nyilvános kulcsot a szerver kérésre kiadja — nyilvános, nincs rajta mit védeni.

Az ellenőrzés a böngészőben. A Chrome és a Firefox 2023/2024 óta natívan tudja az Ed25519-et a WebCrypto felületen keresztül. A Safari nem — ott a hívás ellenőrzés helyett kivételt dob. Ezért az ellenőrző kódunk visszaesik egy tiszta JavaScript-implementációra, amelyet csak ott töltünk be, ahol szükség van rá. Az aláírás-ellenőrzés így minden böngészőben lefut, méghozzá az olvasó eszközén.

Az időhorgony. Az aláírókulcs ujjlenyomatát az OpenTimestamps segítségével egy Bitcoin-blokkban rögzítjük. Ezzel nemcsak az igazolható, hogy az aláírás valódi, hanem az is, hogy a kulcs egy adott időpontban már létezett — anélkül, hogy bárkinek hinnie kellene a mi időbélyegünknek.

A tartalomhoz kötés. A payload hordozza az rh értéket, a teljes beküldött adatrekord hasítóértékét: szöveg, szívek, geostátusz, alkalomra vonatkozó adatok és eredet. Az Ed25519-aláírás így nemcsak a szöveget köti meg, hanem mindent, ami az értékelés mellett megjelenik.


20. Egy mondat, amit érdemes megjegyezni

Az Ed25519 egy titkos szaˊmboˊl olyan egyenletet keˊszıˊt,amelyet baˊrki elleno˝rizhet, de senki sem talaˊlhat ki.\boxed{ \begin{array}{c} \text{Az Ed25519 egy titkos számból olyan egyenletet készít,}\\ \text{amelyet bárki ellenőrizhet, de senki sem találhat ki.} \end{array}}

Aki birtokolja a titkos skalárt, mikromásodpercek alatt ír alá. Aki nem birtokolja, annak diszkrét logaritmust kellene megoldania egy nagyjából 22522^{252} elemű csoportban.

Egy értékelés olvasója számára ez egyszerűen azt jelenti: nem kell hinnie nekünk. Utánaszámolhat.