Signaturverfahren

Ed25519 mathematisch erklärt

Die Unterschrift, die an jeder McGesund-Bewertung hängt — von der Kurve über den Schlüssel bis zu der Gleichung, die der Browser des Lesers nachrechnet.

Stand: 2026-09-07

1. Worum es hier geht

Eine Bewertung bei McGesund ist kein Textfeld in einer Datenbank, dem man glauben muss. Sie wird beim Absenden digital signiert, und jeder Besucher kann diese Signatur später im eigenen Browser nachrechnen.

Für diese Unterschrift verwenden wir Ed25519. Anders als FALCON und ML-DSA, die zusätzlich als Stempel danebengelegt werden können, ist Ed25519 keine Option: Jede signierte Bewertung trägt sie, unabhängig von Tarif und Abgabeweg.

Wichtig vorweg:

Ed25519 ist keine Verschlüsselung. Der Bewertungstext soll ja gelesen werden. Die Signatur beweist nicht Geheimhaltung, sondern Herkunft und Unversehrtheit.


2. Was genau unterschrieben wird

Signiert wird nicht der Fließtext, sondern ein kompaktes Datenobjekt, das den Text und alles Übrige eindeutig festnagelt:

{
  "v":   1,
  "typ": "rev-comment",
  "f":   "<Firmen-ID>",
  "c":   "<Bewertungs-ID>",
  "h":   "<SHA-256 des Bewertungstexts>",
  "rh":  "<SHA-256 des ganzen Abgabe-Datensatzes>",
  "rv":  1,
  "qh":  "<SHA-256 des QR-Envelopes, nur bei QR-Bewertungen>",
  "kid": "<Schlüssel-ID>",
  "iat": 1757203200
}

Dieses Objekt wird zu CBOR kodiert. Diese Bytefolge — nicht ihre hübsche Darstellung oben — ist unsere Nachricht mm. Signatur und Nachricht wandern zusammen in einen Umschlag:

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

Die 33 ist die Formatversion. Mehr steht nicht darin — insbesondere keine Post-Quanten-Signatur: Die liegt, wenn es sie gibt, am Datensatz daneben und nicht im Umschlag.


3. Was die Signatur leisten soll

Ein Leser, der auf ein Unternehmensprofil kommt, steht vor zwei Fragen:

  1. Stammt diese Bewertung wirklich aus dem McGesund-System?
  2. Wurde sie nachträglich verändert?

Dafür gibt es ein Schlüsselpaar:

  • einen privaten Schlüssel — bleibt im Signaturdienst
  • einen öffentlichen Schlüssel — darf jeder haben, wird über die Schlüssel-ID (kid) im Payload adressiert

Signiert wird mit dem privaten Schlüssel. Geprüft wird mit dem öffentlichen — und zwar im Browser des Lesers, nicht auf unserem Server. Das ist der Punkt: Eine Prüfung, die wir selbst durchführen und deren Ergebnis wir mitteilen, wäre keine Prüfung, sondern eine Behauptung.


4. Warum eine elliptische Kurve?

Jede Signatur braucht eine Rechnung, die in eine Richtung leicht und in die andere praktisch unmöglich ist. Bei Ed25519 ist das die Skalarmultiplikation auf einer elliptischen Kurve:

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

Aus der geheimen Zahl aa den öffentlichen Punkt AA zu berechnen, kostet Mikrosekunden. Aus AA zurück auf aa zu schließen, ist das diskrete Logarithmusproblem — dafür ist kein Verfahren bekannt, das bei dieser Größe in menschlichen Zeiträumen fertig wird.

Der praktische Gewinn gegenüber älteren Verfahren wie RSA ist die Größe:

öffentlicher SchlüsselSignatur
RSA-3072384 B384 B
Ed2551932 B64 B

Bei vergleichbarem Sicherheitsniveau. 64 Byte pro Bewertung sind auch bei Millionen Bewertungen keine Größe, über die man nachdenken muss.


5. Die Kurve edwards25519

Gerechnet wird modulo einer Primzahl:

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

Daher der Name. Die Kurve ist eine verdrehte Edwards-Kurve:

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

Ein „Punkt" ist ein Zahlenpaar (x,y)(x,y) aus {0,,p1}\{0,\dots,p-1\}, das diese Gleichung erfüllt. Es gibt keine Kurve zu sehen — die Zeichnung im nächsten Abschnitt ist eine Anschauungshilfe über den reellen Zahlen, kein Bild des tatsächlichen Rechenraums.

Zwei Größen kommen noch dazu:

  • ein fest vereinbarter Basispunkt BB,
  • die Ordnung \ell der von BB erzeugten Untergruppe:
=2252+27742317777372353535851937790883648493.\ell = 2^{252} + 27742317777372353535851937790883648493.

\ell ist prim. Das bedeutet: Rechnet man BB immer wieder zu sich selbst, durchläuft man genau \ell verschiedene Punkte und landet dann wieder am Anfang. Alle Rechnungen mit Skalaren laufen deshalb modulo \ell, alle Rechnungen mit Koordinaten modulo pp. Diese beiden Zahlen zu verwechseln, ist der klassische Anfängerfehler.


6. Punkte addieren

Zwei Punkte werden nach einer festen Formel zu einem dritten verrechnet:

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

Das neutrale Element ist (0,1)(0,1) — der Punkt, an dem das Rechnen anfängt.

Diese Formel hat eine Eigenschaft, die man ihr nicht ansieht und die für die Sicherheit wichtiger ist als jede Konstante: Sie ist vollständig. Sie funktioniert für alle Eingaben, ohne Sonderfälle für „beide Punkte gleich" oder „Ergebnis ist das neutrale Element". Bei den älteren Weierstraß-Kurven gibt es diese Sonderfälle, und jeder von ihnen ist ein Zweig im Programm — ein Zweig, dessen Laufzeit sich messen lässt. Wer misst, wie lange eine Signatur dauert, erfährt bei solchen Verfahren etwas über den geheimen Schlüssel.

Vollständige Formeln heißen: immer derselbe Rechenweg, immer dieselbe Zeit, nichts zu messen.


7. Skalarmultiplikation — die Einbahnstraße

nBn\cdot B heißt: BB genau nn-mal zu sich selbst addieren. Bei einem nn mit 253 Bit wäre das sinnlos viel Arbeit — deshalb wird verdoppelt:

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

und aus diesen Zwischenergebnissen das gewünschte nn zusammengesetzt. Rund 253 Verdopplungen genügen für jedes nn. Das ist der Weg vorwärts.

Rückwärts gibt es diese Abkürzung nicht. Aus dem Punkt AA die Zahl aa zu bestimmen, heißt das diskrete Logarithmusproblem zu lösen.

(0,1) — neutrales ElementB2B3B4B5B6B
Eine Edwards-Kurve mit den ersten Vielfachen des Basispunkts, gerechnet mit dem echten Additionsgesetz. Über den reellen Zahlen wandern sie noch sichtbar geordnet über die Kurve — man könnte den Weg zurückverfolgen. Modulo p verschwindet genau diese Ordnung, und darauf beruht die Sicherheit.

Im echten Verfahren wird modulo pp gerechnet. Dort gibt es kein „links", kein „rechts" und keine Nähe: Aus 17B17\,B und 18B18\,B werden zwei Zahlenpaare ohne jede erkennbare Verwandtschaft.


8. Das Schlüsselpaar des Signaturdienstes

Am Anfang stehen 32 zufällige Bytes, der Seed. Alles Weitere wird daraus abgeleitet:

h=SHA-512(Seed),h=h0..31  a    h32..63Pra¨fix.h = \mathrm{SHA\text{-}512}(\text{Seed}), \qquad h = \underbrace{h_{0..31}}_{\to\;a}\;\|\;\underbrace{h_{32..63}}_{\text{Präfix}}.

Aus der ersten Hälfte entsteht der geheime Skalar aa, allerdings nicht unverändert. Drei Bits werden gesetzt beziehungsweise gelöscht — das sogenannte Clamping:

  • die untersten drei Bits werden auf null gesetzt: aa wird dadurch ein Vielfaches von 8. Der Grund ist der Kofaktor 8 der Kurve — die volle Punktgruppe ist achtmal so groß wie die Untergruppe der Ordnung \ell. Ein durch 8 teilbares aa landet garantiert in der richtigen Untergruppe und verrät über Punkte kleiner Ordnung nichts.
  • das oberste Bit wird gelöscht, das zweitoberste gesetzt: aa hat damit immer dieselbe Bitlänge. Ein kürzeres aa bräuchte weniger Verdopplungen — und wieder wäre an der Laufzeit etwas abzulesen.

Der öffentliche Schlüssel ist dann schlicht

A=aB,A = a\cdot B,

gespeichert als 32 Byte: die yy-Koordinate, und im höchsten Bit das Vorzeichen von xx. Das xx rechnet der Prüfer selbst aus der Kurvengleichung zurück — beide Lösungen unterscheiden sich nur im Vorzeichen, und welche gemeint ist, sagt dieses eine Bit.

Die zweite Hälfte des Hashwerts, das Präfix, wird nicht für den Schlüssel gebraucht. Sie kommt im nächsten Abschnitt zum Einsatz.


9. Warum der Zufall hier kein Zufall ist

Jede Signatur dieser Bauart braucht einen einmaligen Wert rr, oft Nonce genannt. Er darf sich niemals wiederholen: Wer zwei Signaturen mit demselben rr hat, kann den geheimen Schlüssel mit Schulalgebra herausrechnen.

Genau daran sind reale Systeme gescheitert. Der bekannteste Fall ist die Signaturprüfung einer Spielkonsole, deren Hersteller 2010 immer denselben Nonce verwendete — der private Schlüssel war damit öffentlich rekonstruierbar.

Ed25519 löst das, indem es gar keinen Zufall verwendet:

r=SHA-512(Pra¨fix    m)mod.r = \mathrm{SHA\text{-}512}(\text{Präfix}\;\|\;m) \bmod \ell.

Der Nonce hängt am geheimen Präfix und an der Nachricht. Daraus folgt zweierlei:

  • Zwei verschiedene Bewertungen ergeben mit überwältigender Wahrscheinlichkeit verschiedene rr — der Wiederholungsfall tritt nicht ein.
  • Dieselbe Bewertung ergibt immer dieselbe Signatur. Ein Signiervorgang lässt sich damit nachvollziehen, und ein schlechter Zufallsgenerator auf dem Server kann nichts kaputt machen, weil keiner gebraucht wird.

Für ein Bewertungsportal mit vielen Signaturen pro Tag ist das kein akademischer Vorteil. Es ist der Unterschied zwischen „ein Fehler in der Zufallsquelle wäre fatal" und „es gibt keine Zufallsquelle, die ausfallen könnte".


10. Signieren

Drei Zeilen, mehr ist es nicht:

r=H(Pra¨fix    m)mod,R=rB,r = H(\text{Präfix}\;\|\;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.

Die Signatur ist das Paar

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

32 Byte für den Punkt RR, 32 Byte für die Zahl SS — zusammen 64 Byte.

Beachtenswert ist die zweite Zeile: In kk gehen RR, der öffentliche Schlüssel AA und die Nachricht ein. Dass AA mitgehasht wird, ist kein Beiwerk — es verhindert Angriffe, bei denen eine Signatur auf einen anderen Schlüssel umgedeutet wird.


11. Prüfen

Der Browser des Lesers kennt: die Bewertung mm, die Signatur (R,S)(R,S) und den öffentlichen Schlüssel AA. Er rechnet kk neu aus und prüft eine einzige Gleichung:

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

Stimmt sie, ist die Signatur gültig. RFC 8032 erlaubt zusätzlich die mit dem Kofaktor multiplizierte Fassung 8SB=8R+8kA8S\cdot B = 8R + 8k\cdot A, die einige Randfälle großzügiger behandelt.

Kein Server wird gefragt, kein Dienst muss verfügbar sein. Der öffentliche Schlüssel genügt.


12. Warum die Gleichung aufgeht

Einsetzen genügt:

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.

Der ganze Trick steckt in der mittleren Umformung: Die Skalarmultiplikation verträgt sich mit der Addition. Wer aa kennt, kann ein SS ausrechnen, das die Gleichung erfüllt. Wer aa nicht kennt, müsste zu einem selbst gewählten kk ein passendes SS finden — und das heißt, den diskreten Logarithmus zu lösen.


13. Ein vollständig durchgerechnetes Mini-Beispiel

Mit den echten Zahlen ist nichts nachzurechnen — 253-Bit-Werte lassen sich nicht im Kopf prüfen. Deshalb dasselbe Verfahren in einer winzigen Gruppe, in der jeder Schritt mit dem Taschenrechner nachvollziehbar ist.

Schritt 1: Die Gruppe

Wir rechnen mit den Resten modulo 2323 und nehmen g=2g = 2. Es gilt

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

gg erzeugt also eine Untergruppe der Ordnung =11\ell = 11. Die Potenzen sind:

nn1234567891011
gng^n248169181336121

gg übernimmt die Rolle des Basispunkts BB, die Multiplikation die der Punktaddition. Skalare rechnen modulo 1111, Werte modulo 2323.

Schritt 2: Das Schlüsselpaar

Geheim sei a=6a = 6. Dann ist

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

A=18A = 18 darf jeder wissen.

Schritt 3: Nonce und Commitment

Aus Präfix und Bewertung ergebe sich r=4r = 4. Daraus:

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

Schritt 4: Die Challenge

Der Hash über RR, AA und die Bewertung liefere

k=5.k = 5.

Schritt 5: Die Signatur

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.

Die Signatur ist das Paar (R,S)=(16,1)(R,S) = (16,\,1).

Schritt 6: Der Browser prüft

Er rechnet beide Seiten aus. Links:

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

Rechts, mit 1853(mod23)18^5 \equiv 3 \pmod{23}:

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

Beide Seiten ergeben 22:

Signatur gu¨ltig\boxed{\text{Signatur gültig}}

Schritt 7: Jemand ändert den Bewertungstext

Der Text wandert in den Hash, also ändert sich die Challenge — sagen wir auf k=7k' = 7. Die Signatur bleibt unverändert bei (16,1)(16,1), die rechte Seite aber nicht. Mit 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 ungu¨ltig\boxed{\text{Signatur ungültig}}

Wir können eine Bewertung löschen. Verändern können wir sie nicht, ohne dass es auffällt.

Ehrlichkeitshinweis zum Beispiel

Gerechnet wurde hier in der multiplikativen Gruppe modulo 2323, nicht auf einer Kurve: gSg^S steht für SBS\cdot B, das Produkt RAkR\cdot A^k für die Punktaddition R+kAR + k\cdot A. Die Struktur ist dieselbe, und genau darum geht es. Verschieden sind die Größenordnungen: =11\ell = 11 gegenüber 2252\ell \approx 2^{252}, und dort ist der Schlüssel nicht durch Ausprobieren der elf Möglichkeiten zu finden.


14. Was passiert, wenn jemand die Bewertung ändert

Angenommen, jemand mit Datenbankzugriff — auch jemand bei uns — ändert den Bewertungstext oder eines der Herzen. Dann ändert sich der Datensatz und damit mindestens einer der beiden Hashwerte h und rh im Payload. Damit ändert sich mm, damit die Challenge kk, damit die rechte Seite der Prüfgleichung. Die alte Signatur passt nicht mehr.

Der entscheidende Satz dazu: Wir können eine Bewertung löschen, aber wir können sie nicht unbemerkt verändern. Bei McGesund läuft dieselbe Prüfung zusätzlich nächtlich serverseitig über den Bestand — eine Bewertung, die sie nicht besteht, fließt nicht mehr in den Schnitt des Unternehmens ein.


15. Warum ein Angreifer scheitert

Er kennt den öffentlichen Schlüssel AA, den Basispunkt BB, die Kurve und jede bisher ausgestellte Signatur. Was ihm fehlt, ist aa.

Der beste bekannte klassische Angriff auf das diskrete Logarithmusproblem in einer Gruppe der Ordnung \ell braucht etwa \sqrt{\ell} Schritte. Bei 2252\ell \approx 2^{252} sind das rund

21262^{126}

Operationen. Zum Vergleich: Selbst eine Maschine, die eine Milliarde Milliarden (101810^{18}) Schritte pro Sekunde schafft, bräuchte dafür ein Vielfaches des Alters des Universums.

Fälschen ohne den Schlüssel hieße, zu einem selbst gewählten kk ein passendes SS zu finden — dieselbe Aufgabe in anderer Verkleidung.


16. Warum Ed25519 und nicht ECDSA

Beide beruhen auf demselben Problem. Der Unterschied liegt in allem, was drumherum passiert:

ECDSA (NIST-Kurven)Ed25519
Noncefrischer Zufall nötigdeterministisch aus Präfix und Nachricht
FormelnSonderfälle, datenabhängige Zweigevollständig, ein Rechenweg
KurvenparameterHerkunft der Konstanten nie vollständig erklärtaus nachvollziehbaren Kriterien gewählt
Signaturgröße64–72 B, variable Kodierungfest 64 B
Im Browserseit langem verfügbarseit 2023/2024 nativ, sonst als JS-Bibliothek

Für uns war der Nonce das Ausschlagargument. Ein Bewertungsportal signiert oft und automatisiert; ein Verfahren, bei dem ein einziger schwacher Zufallswert den Schlüssel preisgibt, ist dafür die falsche Wahl.


17. Was Ed25519 nicht leistet

Ed25519 beruht auf dem diskreten Logarithmus — und genau dieses Problem löst ein hinreichend großer Quantencomputer mit dem Algorithmus von Shor effizient. Ob und wann es solche Maschinen gibt, ist offen. Für eine Bewertung, die in zehn Jahren noch nachprüfbar sein soll, ist das trotzdem eine Frage, die man heute beantworten muss.

Deshalb kann neben die Ed25519-Signatur ein quantenresistenter Stempel treten:

Beide ersetzen Ed25519 nicht, sie legen sich daneben. Bricht eines der Verfahren, trägt das andere weiter.


18. Der Ablauf im Bild

SIGNATURDIENST (MCGESUND)BROWSER DES BESUCHERSprivater Skalar a + Präfix (aus dem Seed)Payload m = {Firma, Bewertung, h, rh, iat}r = H(Präfix ‖ m) mod ℓR = r · Bk = H(R ‖ A ‖ m) mod ℓS = (r + k · a) mod ℓSignatur σ = (R, S) + kidBewertung + σ + öffentlicher Schlüssel Ak neu berechnen aus R, A und mS · B = R + k · A ?gültigungültig
Vom Payload bis zum Häkchen im Browser. Oberhalb der Trennlinie passiert alles einmal beim Absenden, darunter bei jedem Leser neu — auf seinem Gerät, allein mit dem öffentlichen Schlüssel.

19. Was McGesund konkret damit macht

Der Envelope. Jede signierte Bewertung trägt einen MCG1:-Umschlag mit Formatversion, Payload und Ed25519-Signatur. Die kid im Payload sagt, welcher Schlüssel gemeint ist; den zugehörigen öffentlichen Schlüssel liefert der Server auf Anfrage aus — er ist öffentlich, es gibt daran nichts zu schützen.

Die Prüfung im Browser. Chrome und Firefox können Ed25519 seit 2023/2024 nativ über die WebCrypto-Schnittstelle. Safari nicht — dort wirft der Aufruf, statt zu prüfen. Deshalb fällt unser Prüfcode auf eine reine JavaScript-Implementierung zurück, die nur dort nachgeladen wird, wo sie gebraucht wird. Die Signaturprüfung läuft damit in jedem Browser durch, und zwar auf dem Gerät des Lesers.

Der Zeitanker. Der Fingerabdruck des Signaturschlüssels wird über OpenTimestamps in einem Bitcoin-Block verankert. Damit lässt sich nicht nur belegen, dass die Signatur echt ist, sondern auch, dass der Schlüssel zu einem bestimmten Zeitpunkt bereits existierte — ohne dass jemand unserem Zeitstempel glauben müsste.

Die Inhaltsbindung. Der Payload trägt rh, den Hash über den gesamten Abgabe-Datensatz: Text, Herzen, Geo-Status, Anlass-Angaben und Herkunft. Die Ed25519-Signatur bindet damit nicht nur den Text, sondern alles, was neben der Bewertung angezeigt wird.


20. Ein Satz zum Mitnehmen

Ed25519 macht aus einer geheimen Zahl eine Gleichung,die jeder nachrechnen und niemand erfinden kann.\boxed{ \begin{array}{c} \text{Ed25519 macht aus einer geheimen Zahl eine Gleichung,}\\ \text{die jeder nachrechnen und niemand erfinden kann.} \end{array}}

Wer den geheimen Skalar besitzt, unterschreibt in Mikrosekunden. Wer ihn nicht besitzt, müsste einen diskreten Logarithmus in einer Gruppe mit rund 22522^{252} Elementen lösen.

Für den Leser einer Bewertung heißt das schlicht: Er muss uns nicht glauben. Er kann nachrechnen.