Signaturmetoder

Ed25519 matematiskt förklarat

Signaturen som följer med varje omdöme på McGesund — från kurvan över nyckeln till ekvationen som läsarens webbläsare räknar efter.

Uppdaterat: 2026-09-07

1. Vad det handlar om

Ett omdöme på McGesund är inte ett textfält i en databas som man bara får tro på. Det signeras digitalt när det skickas in, och varje besökare kan senare räkna efter signaturen i sin egen webbläsare.

För denna signatur använder vi Ed25519. Till skillnad från FALCON och ML-DSA, som dessutom kan läggas bredvid som stämpel, är Ed25519 inget tillval: varje signerat omdöme bär den, oberoende av abonnemang och inlämningsväg.

Viktigt att slå fast först:

Ed25519 är ingen kryptering. Omdömestexten ska ju läsas. Signaturen bevisar inte sekretess, utan ursprung och oförändrat innehåll.


2. Vad som exakt signeras

Det som signeras är inte den löpande texten, utan ett kompakt dataobjekt som entydigt spikar fast texten och allt övrigt:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<Företags-ID>",
  "c":   "<Omdömes-ID>",
  "h":   "<SHA-256 av omdömestexten>",
  "rh":  "<SHA-256 av hela den inskickade datamängden>",
  "rv":  1,
  "qh":  "<SHA-256 av QR-envelopen, endast vid QR-omdömen>",
  "kid": "<Nyckel-ID>",
  "iat": 1757203200
}

Detta objekt kodas till CBOR. Den byteföljden — inte den prydliga framställningen ovan — är vårt meddelande mm. Signatur och meddelande vandrar tillsammans in i ett kuvert:

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

Trean 33 är formatversionen. Mer står inte i den — i synnerhet ingen post-kvantsignatur: den ligger, om den finns, bredvid datamängden och inte i kuvertet.


3. Vad signaturen ska åstadkomma

En läsare som kommer till en företagsprofil står inför två frågor:

  1. Kommer detta omdöme verkligen från McGesund-systemet?
  2. Har det ändrats i efterhand?

För detta finns ett nyckelpar:

  • en privat nyckel — stannar i signaturtjänsten
  • en offentlig nyckel — får alla ha, adresseras via nyckel-ID:t (kid) i nyttolasten

Signeringen sker med den privata nyckeln. Verifieringen sker med den offentliga — och det i läsarens webbläsare, inte på vår server. Det är just poängen: en kontroll som vi själva utför och vars resultat vi meddelar vore ingen kontroll, utan ett påstående.


4. Varför en elliptisk kurva?

Varje signatur behöver en beräkning som är lätt åt ena hållet och praktiskt taget omöjlig åt det andra. Hos Ed25519 är det skalärmultiplikationen på en elliptisk kurva:

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

Att beräkna den offentliga punkten AA ur det hemliga talet aa kostar mikrosekunder. Att sluta sig tillbaka från AA till aa är det diskreta logaritmproblemet — för det känner man inte till någon metod som blir klar inom mänskliga tidsrymder vid denna storlek.

Den praktiska vinsten jämfört med äldre metoder som RSA är storleken:

offentlig nyckelsignatur
RSA-3072384 B384 B
Ed2551932 B64 B

Vid jämförbar säkerhetsnivå. 64 byte per omdöme är inte heller vid miljontals omdömen en storhet man behöver fundera över.


5. Kurvan edwards25519

Räkningen sker modulo ett primtal:

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

Därav namnet. Kurvan är en vriden Edwards-kurva:

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

En "punkt" är ett talpar (x,y)(x,y) ur {0,,p1}\{0,\dots,p-1\} som uppfyller denna ekvation. Det finns ingen kurva att se — teckningen i nästa avsnitt är ett åskådningsstöd över de reella talen, inte en bild av det faktiska räknerummet.

Två storheter tillkommer:

  • en fast överenskommen baspunkt BB,
  • ordningen \ell för den delgrupp som BB genererar:
=2252+27742317777372353535851937790883648493.\ell = 2^{252} + 27742317777372353535851937790883648493.

\ell är ett primtal. Det betyder: adderar man BB till sig själv om och om igen genomlöper man exakt \ell olika punkter och hamnar sedan i utgångsläget igen. Alla beräkningar med skalärer sker därför modulo \ell, alla beräkningar med koordinater modulo pp. Att förväxla dessa två tal är det klassiska nybörjarfelet.


6. Addera punkter

Två punkter räknas samman till en tredje enligt en fast formel:

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}.

Det neutrala elementet är (0,1)(0,1) — punkten där räknandet börjar.

Denna formel har en egenskap som inte syns på den och som är viktigare för säkerheten än någon konstant: den är fullständig. Den fungerar för alla indata, utan specialfall för "båda punkterna lika" eller "resultatet är det neutrala elementet". Hos de äldre Weierstrass-kurvorna finns dessa specialfall, och vart och ett av dem är en gren i programmet — en gren vars körtid går att mäta. Den som mäter hur lång tid en signatur tar får hos sådana metoder veta något om den hemliga nyckeln.

Fullständiga formler betyder: alltid samma räkneväg, alltid samma tid, ingenting att mäta.


7. Skalärmultiplikation — enkelriktade gatan

nBn\cdot B betyder: addera BB exakt nn gånger till sig själv. Vid ett nn med 253 bitar vore det orimligt mycket arbete — därför fördubblar man:

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

och sätter samman det önskade nn ur dessa mellanresultat. Runt 253 fördubblingar räcker för varje nn. Det är vägen framåt.

Bakåt finns ingen sådan genväg. Att bestämma talet aa ur punkten AA innebär att lösa det diskreta logaritmproblemet.

(0,1) — neutralt elementB2B3B4B5B6B
En Edwards-kurva med baspunktens första multipler, beräknade med den verkliga additionslagen. Över de reella talen vandrar de fortfarande synligt ordnat över kurvan — man skulle kunna spåra vägen tillbaka. Modulo p försvinner just denna ordning, och på det vilar säkerheten.

I den verkliga metoden räknas det modulo pp. Där finns inget "vänster", inget "höger" och ingen närhet: av 17B17\,B och 18B18\,B blir två talpar utan något igenkännbart släktskap.


8. Signaturtjänstens nyckelpar

I början står 32 slumpmässiga byte, seeden. Allt övrigt härleds ur den:

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}}.

Ur den första halvan uppstår den hemliga skalären aa, dock inte oförändrad. Tre bitar sätts respektive nollställs — den så kallade clampingen:

  • de understa tre bitarna nollställs: aa blir därigenom en multipel av 8. Skälet är kurvans kofaktor 8 — hela punktgruppen är åtta gånger så stor som delgruppen av ordning \ell. Ett aa delbart med 8 hamnar garanterat i rätt delgrupp och avslöjar ingenting om punkter av liten ordning.
  • den översta biten nollställs, den näst översta sätts: aa har därmed alltid samma bitlängd. Ett kortare aa skulle behöva färre fördubblingar — och åter vore något avläsbart ur körtiden.

Den offentliga nyckeln är sedan helt enkelt

A=aB,A = a\cdot B,

lagrad som 32 byte: yy-koordinaten, och i den högsta biten tecknet för xx. Sitt xx räknar verifieraren själv tillbaka ur kurvekvationen — båda lösningarna skiljer sig endast i tecknet, och vilken som avses säger denna enda bit.

Hashvärdets andra halva, prefixet, behövs inte för nyckeln. Den kommer till användning i nästa avsnitt.


9. Varför slumpen här inte är någon slump

Varje signatur av detta slag behöver ett engångsvärde rr, ofta kallat nonce. Det får aldrig upprepas: den som har två signaturer med samma rr kan räkna fram den hemliga nyckeln med skolalgebra.

Just på detta har verkliga system gått bet. Det mest kända fallet är signaturkontrollen i en spelkonsol, vars tillverkare 2010 alltid använde samma nonce — den privata nyckeln gick därmed att rekonstruera offentligt.

Ed25519 löser det genom att inte använda någon slump alls:

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

Noncen hänger på det hemliga prefixet och på meddelandet. Av detta följer två saker:

  • Två olika omdömen ger med överväldigande sannolikhet olika rr — upprepningsfallet inträffar inte.
  • Samma omdöme ger alltid samma signatur. En signering går därmed att följa upp, och en dålig slumpgenerator på servern kan inte förstöra något, eftersom ingen behövs.

För en omdömesportal med många signaturer per dag är det ingen akademisk fördel. Det är skillnaden mellan "ett fel i slumpkällan vore ödesdigert" och "det finns ingen slumpkälla som kan fallera".


10. Signera

Tre rader, mer är det inte:

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.

Signaturen är paret

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

32 byte för punkten RR, 32 byte för talet SS — tillsammans 64 byte.

Värd att notera är den andra raden: i kk ingår RR, den offentliga nyckeln AA och meddelandet. Att AA hashas med är ingen utsmyckning — det förhindrar angrepp där en signatur omtolkas till att gälla en annan nyckel.


11. Verifiera

Läsarens webbläsare känner till: omdömet mm, signaturen (R,S)(R,S) och den offentliga nyckeln AA. Den räknar fram kk på nytt och prövar en enda ekvation:

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

Stämmer den är signaturen giltig. RFC 8032 tillåter dessutom den med kofaktorn multiplicerade varianten 8SB=8R+8kA8S\cdot B = 8R + 8k\cdot A, som behandlar vissa gränsfall mer generöst.

Ingen server tillfrågas, ingen tjänst måste vara tillgänglig. Den offentliga nyckeln räcker.


12. Varför ekvationen går ihop

Det räcker att sätta in:

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.

Hela knepet ligger i omformningen i mitten: skalärmultiplikationen förlikar sig med additionen. Den som känner aa kan räkna fram ett SS som uppfyller ekvationen. Den som inte känner aa skulle behöva hitta ett passande SS till ett självvalt kk — och det innebär att lösa den diskreta logaritmen.


13. Ett fullständigt genomräknat miniexempel

Med de verkliga talen finns inget att räkna efter — 253-bitarsvärden går inte att pröva i huvudet. Därför samma metod i en pytteliten grupp, där varje steg går att följa med fickräknare.

Steg 1: Gruppen

Vi räknar med resterna modulo 2323 och tar g=2g = 2. Det gäller att

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

gg genererar alltså en delgrupp av ordning =11\ell = 11. Potenserna är:

nn1234567891011
gng^n248169181336121

gg övertar baspunkten BB:s roll, multiplikationen punktadditionens. Skalärer räknas modulo 1111, värden modulo 2323.

Steg 2: Nyckelparet

Låt a=6a = 6 vara hemligt. Då är

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

A=18A = 18 får alla veta.

Steg 3: Nonce och commitment

Låt prefix och omdöme ge r=4r = 4. Därav:

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

Steg 4: Utmaningen

Låt hashen över RR, AA och omdömet ge

k=5.k = 5.

Steg 5: Signaturen

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.

Signaturen är paret (R,S)=(16,1)(R,S) = (16,\,1).

Steg 6: Webbläsaren verifierar

Den räknar ut båda sidorna. Vänster:

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

Höger, med 1853(mod23)18^5 \equiv 3 \pmod{23}:

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

Båda sidorna ger 22:

Signatur giltig\boxed{\text{Signatur giltig}}

Steg 7: Någon ändrar omdömestexten

Texten vandrar in i hashen, alltså ändras utmaningen — säg till k=7k' = 7. Signaturen förblir oförändrad vid (16,1)(16,1), men det gör inte högerledet. Med 1876(mod23)18^7 \equiv 6 \pmod{23}:

RAk=166=964(mod23)    2=gSR\cdot A^{k'} = 16\cdot 6 = 96 \equiv 4 \pmod{23} \;\neq\; 2 = g^S
Signatur ogiltig\boxed{\text{Signatur ogiltig}}

Vi kan radera ett omdöme. Ändra det kan vi inte utan att det märks.

Ärlighetsanmärkning om exemplet

Här räknades det i den multiplikativa gruppen modulo 2323, inte på en kurva: gSg^S står för SBS\cdot B, produkten RAkR\cdot A^k för punktadditionen R+kAR + k\cdot A. Strukturen är densamma, och det är just den det handlar om. Olika är storleksordningarna: =11\ell = 11 mot 2252\ell \approx 2^{252}, och där går nyckeln inte att finna genom att pröva elva möjligheter.


14. Vad som händer om någon ändrar omdömet

Anta att någon med databasåtkomst — även någon hos oss — ändrar omdömestexten eller ett av hjärtana. Då ändras datamängden och därmed minst ett av de båda hashvärdena h och rh i nyttolasten. Därmed ändras mm, därmed utmaningen kk, därmed högerledet i verifieringsekvationen. Den gamla signaturen passar inte längre.

Den avgörande meningen om detta: vi kan radera ett omdöme, men vi kan inte ändra det obemärkt. Hos McGesund körs samma kontroll dessutom nattetid på serversidan över hela beståndet — ett omdöme som inte klarar den räknas inte längre in i företagets snittbetyg.


15. Varför en angripare misslyckas

Han känner till den offentliga nyckeln AA, baspunkten BB, kurvan och varje hittills utfärdad signatur. Vad han saknar är aa.

Det bästa kända klassiska angreppet på det diskreta logaritmproblemet i en grupp av ordning \ell behöver ungefär \sqrt{\ell} steg. Vid 2252\ell \approx 2^{252} är det runt

21262^{126}

operationer. Som jämförelse: även en maskin som klarar en miljard miljarder (101810^{18}) steg per sekund skulle behöva ett antal gånger universums ålder.

Att förfalska utan nyckeln vore detsamma som att hitta ett passande SS till ett självvalt kk — samma uppgift i annan förklädnad.


16. Varför Ed25519 och inte ECDSA

Båda vilar på samma problem. Skillnaden ligger i allt som händer runtomkring:

ECDSA (NIST-kurvor)Ed25519
Noncekräver färsk slumpdeterministisk ur prefix och meddelande
Formlerspecialfall, databeroende grenarfullständiga, en räkneväg
Kurvparametrarkonstanternas ursprung aldrig fullt förklaratvalda efter spårbara kriterier
Signaturstorlek64–72 B, variabel kodningfast 64 B
I webbläsarentillgängligt sedan längenativt sedan 2023/2024, annars som JS-bibliotek

För oss var noncen det utslagsgivande argumentet. En omdömesportal signerar ofta och automatiserat; en metod där ett enda svagt slumpvärde röjer nyckeln är fel val för det.


17. Vad Ed25519 inte klarar

Ed25519 vilar på den diskreta logaritmen — och just detta problem löser en tillräckligt stor kvantdator effektivt med Shors algoritm. Om och när sådana maskiner finns är öppet. För ett omdöme som ska gå att kontrollera om tio år är det ändå en fråga som måste besvaras i dag.

Därför kan en kvantresistent stämpel läggas bredvid Ed25519-signaturen:

Ingen av dem ersätter Ed25519, de lägger sig bredvid. Brister en av metoderna bär den andra vidare.


18. Förloppet i bild

SIGNATURTJÄNST (MCGESUND)BESÖKARENS WEBBLÄSAREprivat skalär a + prefix (ur seeden)Nyttolast m = {företag, omdöme, h, rh, iat}r = H(prefix ‖ m) mod ℓR = r · Bk = H(R ‖ A ‖ m) mod ℓS = (r + k · a) mod ℓSignatur σ = (R, S) + kidOmdöme + σ + offentlig nyckel Aräkna om k ur R, A och mS · B = R + k · A ?giltigogiltig
Från nyttolast till bocken i webbläsaren. Ovanför skiljelinjen sker allt en gång vid inskickandet, därunder på nytt hos varje läsare — på hans enhet, ensam med den offentliga nyckeln.

19. Vad McGesund konkret gör med detta

Envelopen. Varje signerat omdöme bär ett MCG1:-kuvert med formatversion, nyttolast och Ed25519-signatur. kid i nyttolasten säger vilken nyckel som avses; den tillhörande offentliga nyckeln levererar servern på begäran — den är offentlig, det finns inget att skydda där.

Verifieringen i webbläsaren. Chrome och Firefox klarar Ed25519 nativt via WebCrypto-gränssnittet sedan 2023/2024. Safari gör det inte — där kastar anropet ett fel i stället för att verifiera. Därför faller vår verifieringskod tillbaka på en ren JavaScript-implementation som bara laddas där den behövs. Signaturkontrollen går därmed igenom i varje webbläsare, och det på läsarens enhet.

Tidsankaret. Signaturnyckelns fingeravtryck förankras via OpenTimestamps i ett Bitcoin-block. Därmed går det inte bara att belägga att signaturen är äkta, utan också att nyckeln redan fanns vid en bestämd tidpunkt — utan att någon behöver tro på vår tidsstämpel.

Innehållsbindningen. Nyttolasten bär rh, hashen över hela den inskickade datamängden: text, hjärtan, geostatus, uppgifter om anledning och ursprung. Ed25519-signaturen binder därmed inte bara texten, utan allt som visas bredvid omdömet.


20. En mening att ta med sig

Ed25519 go¨r ett hemligt tal till en ekvation,som alla kan ra¨kna efter och ingen kan hitta pa˚.\boxed{ \begin{array}{c} \text{Ed25519 gör ett hemligt tal till en ekvation,}\\ \text{som alla kan räkna efter och ingen kan hitta på.} \end{array}}

Den som äger den hemliga skalären signerar på mikrosekunder. Den som inte äger den skulle behöva lösa en diskret logaritm i en grupp med runt 22522^{252} element.

För läsaren av ett omdöme betyder det helt enkelt: han behöver inte tro oss. Han kan räkna efter.