Signaturverfahren
ML-DSA-87 mathematisch erklärt
Wie ML-DSA-87 (FIPS 204) eine McGesund-Bewertung unterschreibt — von Module-LWE über Rejection Sampling bis zur Prüfung im Browser.
Stand: 2026-09-07
1. Worum es hier geht
Wenn jemand bei McGesund eine Bewertung abgibt, passiert im Hintergrund mehr, als der Text vermuten lässt. Die Bewertung wird beim Absenden digital signiert. Diese Signatur kann jeder Besucher später im eigenen Browser nachrechnen — ohne uns zu vertrauen und ohne uns zu fragen.
Für Kunden ab dem Tarif Pro geschieht das unter anderem mit ML-DSA-87. Dieser Beitrag erklärt, was dabei mathematisch passiert.
Wichtig vorweg:
ML-DSA ist keine Verschlüsselung. Der Bewertungstext bleibt öffentlich lesbar — das ist ja der Sinn einer Bewertung. ML-DSA beweist nicht Geheimhaltung, sondern Herkunft und Unversehrtheit.
ML-DSA wurde aus CRYSTALS-Dilithium entwickelt und ist als FIPS 204 standardisiert. Die Zahl 87 bezeichnet die Parameterstufe. Es gibt drei:
- ML-DSA-44
- ML-DSA-65
- ML-DSA-87
ML-DSA-87 ist die höchste und liegt in NIST-Sicherheitskategorie 5.
2. Was genau wird signiert?
Nicht der Bewertungstext selbst wandert in die Signatur, sondern ein kompaktes Datenobjekt, das den Text eindeutig festnagelt. Bei McGesund sieht es im Kern so aus:
{
"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>",
"iat": 1757203200
}
Dieses Objekt ist unsere Nachricht . Es bindet sechs Aussagen zusammen:
- Zu welchem Unternehmen die Bewertung gehört (
f) - Welche Bewertung gemeint ist (
c) - Welcher Text dahinterstand — als Hashwert (
h) - Welcher Datensatz insgesamt abgegeben wurde (
rh): Text, Herzen, Geo-Status und Anlass-Angaben, kanonisch serialisiert und gehasht — in der Schema-Versionrv - Aus welchem QR-Code die Bewertung stammt (
qh); ohne QR entfällt das Feld - Wann signiert wurde (
iat)
Ändert jemand später ein einziges Zeichen am Bewertungstext, passt h nicht mehr — und rh ebenfalls nicht. Wer stattdessen nur an den Herzen dreht, lässt h unberührt, bricht aber rh. Ändert jemand einen dieser Hashwerte, passt die Signatur nicht mehr. Genau diese Kette ist der Punkt.
3. Was die Signatur leisten soll
Ein Besucher, der die Bewertung liest, soll drei Dinge selbst überprüfen können:
- Die Bewertung wurde tatsächlich von McGesund ausgestellt.
- Der Text wurde seit dem Absenden nicht verändert.
- Niemand kann eine neue, gültig aussehende Bewertung erfinden.
Dafür gibt es ein Schlüsselpaar:
- einen privaten Schlüssel — liegt ausschließlich im Signaturdienst
- einen öffentlichen Schlüssel — darf jeder haben, wird über die Key-ID (
kid) im Envelope adressiert
Signiert wird mit dem privaten Schlüssel. Geprüft wird mit dem öffentlichen — und zwar im Browser des Lesers, nicht auf unserem Server.
4. Warum überhaupt ein Post-Quanten-Verfahren?
Viele heute übliche Signaturverfahren beruhen auf der Faktorisierung großer Zahlen oder auf diskreten Logarithmen. Ein ausreichend leistungsfähiger Quantencomputer könnte genau diese Probleme mit bekannten Algorithmen erheblich schneller lösen.
Für eine Bewertung ist das keine akademische Frage. Eine Bewertung soll noch in zehn Jahren nachprüfbar sein. Wer heute unterschreibt, unterschreibt für die gesamte Lebensdauer des Eintrags.
ML-DSA verwendet deshalb eine andere Grundlage:
Genauer: Module-LWE und Module-SIS.
5. Was ist ein Gitter?
Zunächst nur Punkte im Raum. Nehmen wir zwei Vektoren:
Alle ganzzahligen Kombinationen
bilden das Gitter. Zum Beispiel:
Das Entscheidende:
In kleinen Dimensionen sind Gitterprobleme leicht. In sehr hohen Dimensionen werden bestimmte Aufgaben extrem schwierig.
6. Polynome statt einzelner Zahlen
ML-DSA rechnet nicht mit 2D-Vektoren, sondern mit Polynomen und Vektoren von Polynomen.
Ein Polynom wie
lässt sich als Koeffizientenliste schreiben:
Gerechnet wird in einem Ring:
Das bedeutet zweierlei:
- : Rechnen modulo
- : eine Zusatzregel, die die Polynomlänge fixiert
Für alle drei ML-DSA-Stufen gilt:
Ein Polynom hat also 256 Koeffizienten, betrachtet modulo 8.380.417. Was sich zwischen den Stufen ändert, ist nicht oder , sondern die Größe der Matrizen — dazu später mehr.
Nebenbei: Polynommultiplikation in diesem Ring läuft in der Praxis über die NTT, die zahlentheoretische Variante der schnellen Fourier-Transformation. ML-DSA kommt also keineswegs ohne FFT-Ideen aus; sie stecken nur in der Arithmetik statt im Signaturprinzip.
7. Der zentrale Trick: Module-LWE
Die Kernidee ist Module Learning With Errors:
Dabei sind:
- — öffentliche, scheinbar zufällige Matrix aus Polynomen
- — kleine geheime Vektoren
- — öffentlicher Wert
Ein Angreifer kennt und , aber nicht . Die Gleichung sieht für ihn aus wie eine zufällige Gleichung mit Rauschen. Die kleinen Geheimnisse soll er daraus nicht effizient zurückrechnen können.
8. Ein winziges Zahlenbeispiel
Wir nehmen absichtlich eine lächerlich kleine Variante — normale Zahlen statt Polynome, Dimension 2 statt 256, und
Sei
Dann:
In diesem Miniformat könnte man alle Möglichkeiten durchprobieren. Bei ML-DSA-87 ist eine -Matrix aus Polynomen mit je 256 Koeffizienten — das sind über 14.000 Unbekannte in der Gitterstruktur.
9. Das Schlüsselpaar des Signaturdienstes
Der private Schlüssel enthält unter anderem die kleinen Vektoren . Bei ML-DSA-87 stammen deren Koeffizienten aus dem Intervall
also aus . Diese Kleinheit ist kein Detail, sondern der Kern: Nur weil die Geheimnisse klein sind, entsteht überhaupt ein schwieriges Gitterproblem.
Der öffentliche Schlüssel ist vereinfacht
ist ein Seed, aus dem sich deterministisch rekonstruieren lässt — die Matrix muss also nicht übertragen werden. sind die oberen Bits von ; die unteren Bits bleiben weg, was den Schlüssel deutlich verkleinert. Diese Auslassung ist später der Grund für die sogenannten Hints.
Damit entsteht die gewünschte Asymmetrie:
10. Die Bewertung wird zur Zahl
Der Signaturdienst hasht zuerst das Payload-Objekt aus Abschnitt 2:
In unserem Spielzeugbeispiel nehmen wir einen künstlichen Mini-Hash. Im echten System ist 512 Bit lang und bindet zusätzlich den öffentlichen Schlüssel mit ein — dadurch lässt sich eine Signatur nicht auf einen anderen Schlüssel umdeuten.
11. Commitment
Der Signaturdienst zieht einen zufälligen kleinen Vektor . In unserem Beispiel:
Daraus entsteht ein Zwischenwert, das Commitment:
Das ist noch keine Signatur.
12. Aus der Bewertung wird eine Challenge
Nachricht und Commitment werden zusammengehasht:
Bei ML-DSA-87 ist ein Polynom mit genau Koeffizienten aus , alle übrigen 196 sind null. Diese Struktur ist gewollt: Sie hält klein.
In unserem Spielzeugbeispiel setzen wir schlicht
13. Die eigentliche Signatur
Mit unseren Werten:
14. Der Schritt, den man leicht übersieht: Rejection Sampling
Hier liegt der Punkt, an dem ML-DSA sich von einer naiven Konstruktion unterscheidet — und er ist nicht optional.
enthält das Geheimnis . Würde man einfach immer herausgeben, ließe sich aus genügend vielen Signaturen statistisch herausrechnen. Bei einem Bewertungsportal mit sehr vielen Signaturen pro Tag ist das kein theoretisches Risiko.
Deshalb prüft der Signaturdienst vor der Ausgabe, ob zu viel verrät, und verwirft die Signatur andernfalls — dann wird mit einem neuen zufälligen von vorn begonnen. Man nennt das Fiat-Shamir with Aborts.
Die Bedingung lautet im Wesentlichen:
Für ML-DSA-87 gilt und . Dazu kommt eine zweite Schranke auf den unteren Bits. In der Praxis sind mehrere Durchläufe normal — das Signieren ist also ein Schleifenverfahren, kein Einmalschritt.
Für die Verifikation ist wichtig: Genau diese Schranke prüft der Browser später mit. Eine Signatur mit zu großen Koeffizienten wird abgelehnt, selbst wenn die Gleichung aufgeht.
15. Warum der Browser das prüfen kann
Der Browser des Lesers kennt:
- die Bewertung und damit
- den öffentlichen Schlüssel
- die Signatur
Er kennt nicht. Der Zusammenhang, der ihn trotzdem weiterbringt:
Und weil
gilt, lässt sich das unbekannte durch den öffentlichen Wert ersetzen:
Das ist die zentrale Gleichung — und sie sagt etwas Wichtiges: Der Browser rekonstruiert nicht exakt, sondern nur bis auf den kleinen Term .
16. Das Mini-Beispiel bis zum Ende
Wir hatten:
Rechnen wir nach:
Das ursprüngliche Commitment war
Die Differenz beträgt
Also exakt der vorhergesagte kleine Fehlerterm. Der Verifier bekommt nicht , sondern etwas, das nahe bei liegt.
Genau deshalb vergleicht ML-DSA nicht die Werte selbst, sondern deren obere Bits. Und genau deshalb enthält die Signatur zusätzlich einen Hint-Vektor : Er teilt kompakt mit, an welchen Stellen die Rundung durch den kleinen Fehlerterm über eine Grenze gekippt ist. Bei ML-DSA-87 sind höchstens solcher Hinweise erlaubt. Sie verraten das Geheimnis nicht — sie reparieren nur die Rundung.
Am Ende berechnet der Browser die Challenge neu. Stimmt sie überein,
und liegen alle Normen in den Schranken, ist die Signatur gültig.
17. 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 mindestens einer der beiden Hashwerte im Payload (h beim Text, rh bei jedem Feld des Datensatzes):
Damit ändert sich die Challenge:
Die vorhandene Signatur wurde aber für die alte Challenge erzeugt. Der Browser rechnet nach und stellt fest:
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 diese Prüfung nicht besteht, fließt nicht mehr in den Schnitt des Unternehmens ein.
18. Warum kann niemand eine Signatur erfinden?
Ein Angreifer kennt und , aber nicht . Um eine gültige Signatur zu bauen, müsste er ein Tripel finden, das
- die Verifikationsgleichung erfüllt und
- die Normschranken einhält und
- zu der Challenge passt, die sich aus genau diesen Werten selbst ergibt.
Das läuft im Kern auf ein schwieriges Gitterproblem hinaus — konkret auf Module-SIS: kurze Lösungen einer homogenen Gleichung modulo zu finden. Die Kleinheitsbedingung ist dabei nicht Beiwerk, sondern der eigentliche Schwierigkeitsgrad. Ohne sie wäre eine Lösung trivial.
19. Warum „Module"?
Das Wort beschreibt die Struktur zwischen einfachen Vektoren und allgemeinen Gittern. Statt mit einzelnen Zahlen zu rechnen, arbeitet ML-DSA mit Vektoren von Polynomen:
und mit Matrizen daraus:
Der Vorteil: Man bekommt die hohe Dimension eines Gitters, behält aber eine kompakte, effizient rechenbare Darstellung. Die Sicherheit lässt sich über die Matrixgröße feinjustieren, ohne den Ring zu wechseln.
20. Warum ausgerechnet 87?
Die drei Stufen unterscheiden sich nicht im Ring, sondern in den Dimensionen:
| Parameter | ML-DSA-44 | ML-DSA-65 | ML-DSA-87 |
|---|---|---|---|
| Matrixgröße | |||
| Geheimnisbereich | 2 | 4 | 2 |
| Challenge-Gewicht | 39 | 49 | 60 |
| Öffentlicher Schlüssel | 1.312 B | 1.952 B | 2.592 B |
| Signatur | 2.420 B | 3.309 B | 4.627 B |
| NIST-Kategorie | 2 | 3 | 5 |
Bemerkenswert: ML-DSA-87 ist nicht einfach „ML-DSA-65, nur größer". Der Geheimnisbereich geht von 4 wieder auf 2 zurück; die Sicherheit kommt hier aus der größeren Matrix, nicht aus größeren Koeffizienten. Es handelt sich um eine eigenständige, standardisierte Parameterwahl.
Der Preis: 4.627 Byte pro Signatur — pro Stempel, der gespeichert und beim Prüfen an den Browser ausgeliefert wird. Deshalb steht bei McGesund neben ML-DSA-87 auch FALCON zur Wahl, das mit 1.280 Byte auskommt.
21. Fiat-Shamir: warum es ohne Gegenüber funktioniert
Ein interaktiver Beweis liefe so:
- Der Signaturdienst schickt ein Commitment.
- Der Prüfer schickt eine zufällige Challenge.
- Der Signaturdienst antwortet.
- Der Prüfer rechnet nach.
Bei einer Bewertung gibt es diesen Dialog nicht — der Leser kommt Monate später. Die Lösung ist die Fiat-Shamir-Transformation: Die Challenge wird nicht gewürfelt, sondern aus den Daten selbst gehasht:
Damit wird aus einem Dialog ein Dokument. Der Signaturdienst kann sich die Challenge nicht aussuchen, denn er müsste dazu den Hash kontrollieren.
22. Der gesamte Ablauf
23. Was McGesund konkret damit macht
Drei Ebenen greifen ineinander:
Der Envelope. Jede signierte Bewertung trägt eine Ed25519-Signatur. Das ist die Pflichtvariante — klassisch, winzig, in jedem Browser nativ prüfbar.
Die Post-Quanten-Stempel. Zusätzlich können ein oder zwei quantenresistente Signaturen danebengelegt werden. Welche, hängt am Tarif:
| Tarif | verfügbare Signaturstufen |
|---|---|
| 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, beide parallel |
Die parallele Variante ist bewusst redundant. Sollte sich eine der beiden mathematischen Familien — NTRU-Gitter bei FALCON, Module-Gitter bei ML-DSA — als schwächer erweisen als heute angenommen, trägt die andere weiter.
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 sie zu einem bestimmten Zeitpunkt bereits existierte — ohne dass jemand unserem Zeitstempel glauben müsste.
Geprüft wird all das im Browser des Lesers, über ein WASM-Modul. Wir liefern die Daten; nachgerechnet wird auf dem Gerät des Besuchers. Wenn wir morgen vom Netz gingen, bliebe eine einmal heruntergeladene Bewertung überprüfbar.
24. ML-DSA und FALCON nebeneinander
| Eigenschaft | FALCON (FN-DSA) | ML-DSA |
|---|---|---|
| Typ | digitale Signatur | digitale Signatur |
| Gitterfamilie | NTRU | Module-LWE / Module-SIS |
| Ring | , | , |
| Kernmechanismus | kurzer Vektor per Gauß-Sampling | Challenge-Antwort mit Abbrüchen |
| FFT / NTT | Fließkomma-FFT, sicherheitskritisch | NTT, nur Arithmetik |
| Signaturgröße (höchste Stufe) | 1.280 B | 4.627 B |
| Implementierung | anspruchsvoll (Fließkomma) | vergleichsweise geradlinig |
| Standardisierung | als FIPS 206 (FN-DSA) vorgesehen, noch nicht abgeschlossen | FIPS 204, abgeschlossen |
Kurz gesagt: ML-DSA ist leichter korrekt zu implementieren und zu prüfen, FALCON liefert deutlich kompaktere Signaturen. Im QR-Code steckt keine von beiden — dort steht allein der Ed25519-Envelope. Die Signaturgröße zählt deshalb bei Speicherung und Auslieferung, die Robustheit bei der Implementierung. Deshalb bieten wir beides an.
25. Ein Satz zum Mitnehmen
Wer den geheimen Vektor besitzt, unterschreibt in Millisekunden. Wer ihn nicht besitzt, müsste ein Gitterproblem in über 14.000 Dimensionen lösen — auch mit einem Quantencomputer.
Für den Leser einer Bewertung heißt das schlicht: Er muss uns nicht glauben. Er kann nachrechnen.