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 mm. Es bindet sechs Aussagen zusammen:

  1. Zu welchem Unternehmen die Bewertung gehört (f)
  2. Welche Bewertung gemeint ist (c)
  3. Welcher Text dahinterstand — als Hashwert (h)
  4. Welcher Datensatz insgesamt abgegeben wurde (rh): Text, Herzen, Geo-Status und Anlass-Angaben, kanonisch serialisiert und gehasht — in der Schema-Version rv
  5. Aus welchem QR-Code die Bewertung stammt (qh); ohne QR entfällt das Feld
  6. 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:

  1. Die Bewertung wurde tatsächlich von McGesund ausgestellt.
  2. Der Text wurde seit dem Absenden nicht verändert.
  3. 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:

Gitterprobleme\boxed{\text{Gitterprobleme}}

Genauer: Module-LWE und Module-SIS.


5. Was ist ein Gitter?

Zunächst nur Punkte im Raum. Nehmen wir zwei Vektoren:

b1=(2,0),b2=(1,2).b_1=(2,0), \qquad b_2=(1,2).

Alle ganzzahligen Kombinationen

ab1+bb2,a,bZa\,b_1+b\,b_2, \qquad a,b\in\mathbb{Z}

bilden das Gitter. Zum Beispiel:

2b1+b2=(4,0)+(1,2)=(5,2).2b_1+b_2 = (4,0)+(1,2) = (5,2).
b₁ = (2,0)b₂ = (1,2)(5,2)0
Zwei Vektoren, alle ganzzahligen Kombinationen daraus: ein Gitter. Der markierte Punkt entsteht aus zweimal b₁ und einmal b₂.

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

a(x)=1+2x+x3a(x)=1+2x+x^3

lässt sich als Koeffizientenliste schreiben:

a=(1,2,0,1).a=(1,2,0,1).

Gerechnet wird in einem Ring:

Rq=Zq[x]/(xn+1).R_q=\mathbb{Z}_q[x]/(x^n+1).

Das bedeutet zweierlei:

  • Zq\mathbb{Z}_q: Rechnen modulo qq
  • xn=1x^n=-1: eine Zusatzregel, die die Polynomlänge fixiert

Für alle drei ML-DSA-Stufen gilt:

n=256,q=8380417.n=256, \qquad q=8380417.

Ein Polynom hat also 256 Koeffizienten, betrachtet modulo 8.380.417. Was sich zwischen den Stufen ändert, ist nicht nn oder qq, 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:

t=As1+s2(modq).\mathbf{t}=\mathbf{A}\mathbf{s}_1+\mathbf{s}_2 \pmod q.

Dabei sind:

  • A\mathbf{A} — öffentliche, scheinbar zufällige Matrix aus Polynomen
  • s1,s2\mathbf{s}_1,\mathbf{s}_2 — kleine geheime Vektoren
  • t\mathbf{t} — öffentlicher Wert

Ein Angreifer kennt A\mathbf{A} und t\mathbf{t}, aber nicht s1,s2\mathbf{s}_1,\mathbf{s}_2. 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

q=17.q=17.

Sei

A=(3572),s1=(11),s2=(10).A=\begin{pmatrix}3&5\\7&2\end{pmatrix}, \qquad \mathbf{s}_1=\begin{pmatrix}1\\-1\end{pmatrix}, \qquad \mathbf{s}_2=\begin{pmatrix}1\\0\end{pmatrix}.

Dann:

As1=(3572)=(25),A\mathbf{s}_1=\begin{pmatrix}3-5\\7-2\end{pmatrix}=\begin{pmatrix}-2\\5\end{pmatrix},
t=As1+s2=(25)+(10)=(15)    (165)(mod17).\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2=\begin{pmatrix}-2\\5\end{pmatrix}+\begin{pmatrix}1\\0\end{pmatrix}=\begin{pmatrix}-1\\5\end{pmatrix} \;\equiv\; \boxed{\begin{pmatrix}16\\5\end{pmatrix}} \pmod{17}.

In diesem Miniformat könnte man alle Möglichkeiten durchprobieren. Bei ML-DSA-87 ist A\mathbf{A} eine 8×78\times 7-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 s1,s2\mathbf{s}_1,\mathbf{s}_2. Bei ML-DSA-87 stammen deren Koeffizienten aus dem Intervall

[η,η]mitη=2,[-\eta,\eta] \quad\text{mit}\quad \eta=2,

also aus {2,1,0,1,2}\{-2,-1,0,1,2\}. 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

(ρ,t1).(\rho,\mathbf{t}_1).

ρ\rho ist ein Seed, aus dem sich A\mathbf{A} deterministisch rekonstruieren lässt — die Matrix muss also nicht übertragen werden. t1\mathbf{t}_1 sind die oberen Bits von t\mathbf{t}; die unteren d=13d=13 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:

o¨ffentlich pru¨fen    geheim signieren\boxed{\text{öffentlich prüfen}\;\neq\;\text{geheim signieren}}

10. Die Bewertung wird zur Zahl

Der Signaturdienst hasht zuerst das Payload-Objekt aus Abschnitt 2:

μ=H(m).\mu=H(m).

In unserem Spielzeugbeispiel nehmen wir einen künstlichen Mini-Hash. Im echten System ist μ\mu 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 y\mathbf{y}. In unserem Beispiel:

y=(21).\mathbf{y}=\begin{pmatrix}2\\-1\end{pmatrix}.

Daraus entsteht ein Zwischenwert, das Commitment:

w=Ay=(32+5(1)72+2(1))=(112).\mathbf{w}=A\mathbf{y} =\begin{pmatrix}3\cdot2+5\cdot(-1)\\7\cdot2+2\cdot(-1)\end{pmatrix} =\begin{pmatrix}1\\12\end{pmatrix}.

Das ist noch keine Signatur.


12. Aus der Bewertung wird eine Challenge

Nachricht und Commitment werden zusammengehasht:

c=H(μ,w).c=H(\mu,\mathbf{w}).

Bei ML-DSA-87 ist cc ein Polynom mit genau τ=60\tau=60 Koeffizienten aus {1,+1}\{-1,+1\}, alle übrigen 196 sind null. Diese Struktur ist gewollt: Sie hält cs1c\cdot\mathbf{s}_1 klein.

In unserem Spielzeugbeispiel setzen wir schlicht

c=2.c=2.

13. Die eigentliche Signatur

z=y+cs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1.

Mit unseren Werten:

cs1=2(11)=(22),c\,\mathbf{s}_1=2\begin{pmatrix}1\\-1\end{pmatrix}=\begin{pmatrix}2\\-2\end{pmatrix},
z=(21)+(22)=(43)\mathbf{z}=\begin{pmatrix}2\\-1\end{pmatrix}+\begin{pmatrix}2\\-2\end{pmatrix} =\boxed{\begin{pmatrix}4\\-3\end{pmatrix}}

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.

z=y+cs1\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 enthält das Geheimnis s1\mathbf{s}_1. Würde man z\mathbf{z} einfach immer herausgeben, ließe sich s1\mathbf{s}_1 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 z\mathbf{z} zu viel verrät, und verwirft die Signatur andernfalls — dann wird mit einem neuen zufälligen y\mathbf{y} von vorn begonnen. Man nennt das Fiat-Shamir with Aborts.

Die Bedingung lautet im Wesentlichen:

z<γ1β.\|\mathbf{z}\|_\infty < \gamma_1-\beta.
Commitment w = AyChallenge c = H(μ, w)Antwort z = y + c · s₁‖z‖∞ < γ₁ − β ?jaSignatur wird ausgegebennein — neues y
Drei Schritte und eine Schleife. Fällt z zu groß aus, wird nicht etwa nachgebessert — der ganze Durchlauf wird verworfen und mit einem frischen zufälligen y neu begonnen. Deshalb ist Signieren hier ein Schleifenverfahren.

Für ML-DSA-87 gilt γ1=219\gamma_1=2^{19} und β=τη=602=120\beta=\tau\cdot\eta=60\cdot2=120. 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 mm
  • den öffentlichen Schlüssel (ρ,t1)(\rho,\mathbf{t}_1)
  • die Signatur (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h})

Er kennt s1\mathbf{s}_1 nicht. Der Zusammenhang, der ihn trotzdem weiterbringt:

z=y+cs1Az=Ay+cAs1.\mathbf{z}=\mathbf{y}+c\,\mathbf{s}_1 \quad\Longrightarrow\quad A\mathbf{z}=A\mathbf{y}+c\,A\mathbf{s}_1.

Und weil

t=As1+s2\mathbf{t}=A\mathbf{s}_1+\mathbf{s}_2

gilt, lässt sich das unbekannte As1A\mathbf{s}_1 durch den öffentlichen Wert ersetzen:

Azct=Aycs2.A\mathbf{z}-c\,\mathbf{t}=A\mathbf{y}-c\,\mathbf{s}_2.

Das ist die zentrale Gleichung — und sie sagt etwas Wichtiges: Der Browser rekonstruiert AyA\mathbf{y} nicht exakt, sondern nur bis auf den kleinen Term cs2c\,\mathbf{s}_2.


16. Das Mini-Beispiel bis zum Ende

Wir hatten:

A=(3572),t=(15),c=2,z=(43).A=\begin{pmatrix}3&5\\7&2\end{pmatrix},\quad \mathbf{t}=\begin{pmatrix}-1\\5\end{pmatrix},\quad c=2,\quad \mathbf{z}=\begin{pmatrix}4\\-3\end{pmatrix}.

Rechnen wir nach:

Az=(1215286)=(322),ct=2(15)=(210),A\mathbf{z}=\begin{pmatrix}12-15\\28-6\end{pmatrix}=\begin{pmatrix}-3\\22\end{pmatrix}, \qquad c\,\mathbf{t}=2\begin{pmatrix}-1\\5\end{pmatrix}=\begin{pmatrix}-2\\10\end{pmatrix},
Azct=(112).A\mathbf{z}-c\,\mathbf{t}=\begin{pmatrix}-1\\12\end{pmatrix}.

Das ursprüngliche Commitment war

w=(112).\mathbf{w}=\begin{pmatrix}1\\12\end{pmatrix}.

Die Differenz beträgt

(112)(112)=(20)=cs2.\begin{pmatrix}-1\\12\end{pmatrix}-\begin{pmatrix}1\\12\end{pmatrix} =\begin{pmatrix}-2\\0\end{pmatrix} =-c\,\mathbf{s}_2.

Also exakt der vorhergesagte kleine Fehlerterm. Der Verifier bekommt nicht w\mathbf{w}, sondern etwas, das nahe bei w\mathbf{w} 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 h\mathbf{h}: 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 ω=75\omega=75 solcher Hinweise erlaubt. Sie verraten das Geheimnis nicht — sie reparieren nur die Rundung.

Am Ende berechnet der Browser die Challenge neu. Stimmt sie überein,

cneu=c,c_{\text{neu}}=c,

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):

H(m)H(m).H(m)\neq H(m').

Damit ändert sich die Challenge:

cc.c\neq c'.

Die vorhandene Signatur wurde aber für die alte Challenge erzeugt. Der Browser rechnet nach und stellt fest:

cneucSignaturSignatur ungu¨ltigc_{\text{neu}}\neq c_{\text{Signatur}} \quad\Longrightarrow\quad \boxed{\text{Signatur ungültig}}

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 A\mathbf{A} und t\mathbf{t}, aber nicht s1,s2\mathbf{s}_1,\mathbf{s}_2. Um eine gültige Signatur zu bauen, müsste er ein Tripel (c~,z,h)(\tilde c,\mathbf{z},\mathbf{h}) 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 qq zu finden. Die Kleinheitsbedingung ist dabei nicht Beiwerk, sondern der eigentliche Schwierigkeitsgrad. Ohne sie wäre eine Lösung trivial.

o¨ffentliche Daten    schweres Gitterproblem\boxed{\text{öffentliche Daten}\;\rightarrow\;\text{schweres Gitterproblem}}

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:

a=(a1(x),a2(x),,ak(x)),\mathbf{a}=(a_1(x),a_2(x),\ldots,a_k(x)),

und mit Matrizen daraus:

A=(a1,1(x)a1,2(x)a2,1(x)a2,2(x)).\mathbf{A}= \begin{pmatrix} a_{1,1}(x)&a_{1,2}(x)&\cdots\\ a_{2,1}(x)&a_{2,2}(x)&\cdots\\ \vdots&\vdots&\ddots \end{pmatrix}.

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:

ParameterML-DSA-44ML-DSA-65ML-DSA-87
Matrixgröße (k,)(k,\ell)4×44\times46×56\times58×78\times7
Geheimnisbereich η\eta242
Challenge-Gewicht τ\tau394960
Öffentlicher Schlüssel1.312 B1.952 B2.592 B
Signatur2.420 B3.309 B4.627 B
NIST-Kategorie235

Bemerkenswert: ML-DSA-87 ist nicht einfach „ML-DSA-65, nur größer". Der Geheimnisbereich η\eta 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.

gro¨ßere mathematische Strukturho¨here Sicherheitsmarge\boxed{\text{größere mathematische Struktur}\rightarrow\text{höhere Sicherheitsmarge}}

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:

  1. Der Signaturdienst schickt ein Commitment.
  2. Der Prüfer schickt eine zufällige Challenge.
  3. Der Signaturdienst antwortet.
  4. 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:

c=H(o¨ffentlicher Schlu¨ssel,  Nachricht,  Commitment).c=H(\text{öffentlicher Schlüssel},\;\text{Nachricht},\;\text{Commitment}).

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

SIGNATURDIENST (MCGESUND)BROWSER DES BESUCHERSprivater Schlüssel s₁, s₂Payload m = {Firma, Bewertung, h, rh, iat}Hash μzufälliger Vektor yCommitment w = AyChallenge c = H(μ, w)z = y + c · s₁Signatur (c, z, Hints) + kidBewertung + Signatur + öff. SchlüsselAz − c·t → obere Bits + HintsChallenge neu berechnenneu berechnete Challenge = mitgelieferte?gültigungültigverwerfen, falls z zu groß(Rejection Sampling)
Der ganze Weg einer Bewertung. Der gestrichelte Rücksprung ist das Rejection Sampling — er wird so oft genommen, bis z klein genug ist, um nichts über den geheimen Schlüssel zu verraten.

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:

Tarifverfügbare Signaturstufen
BasisEd25519, FN-DSA-512
KlassikEd25519, FN-DSA-512, FN-DSA-1024
ProEd25519, FN-DSA-1024, ML-DSA-87
PremiumEd25519, 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

EigenschaftFALCON (FN-DSA)ML-DSA
Typdigitale Signaturdigitale Signatur
GitterfamilieNTRUModule-LWE / Module-SIS
RingZq[x]/(xn+1)\mathbb{Z}_q[x]/(x^n+1), q=12289q=12289Zq[x]/(x256+1)\mathbb{Z}_q[x]/(x^{256}+1), q=8380417q=8380417
Kernmechanismuskurzer Vektor per Gauß-SamplingChallenge-Antwort mit Abbrüchen
FFT / NTTFließkomma-FFT, sicherheitskritischNTT, nur Arithmetik
Signaturgröße (höchste Stufe)1.280 B4.627 B
Implementierunganspruchsvoll (Fließkomma)vergleichsweise geradlinig
Standardisierungals FIPS 206 (FN-DSA) vorgesehen, noch nicht abgeschlossenFIPS 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

ML-DSA erzeugt aus einem kurzen geheimen Vektor eine Antwort auf eineChallenge, die aus der Bewertung selbst gehasht wurde — pru¨fbarfu¨r jeden mit dem o¨ffentlichen Schlu¨ssel.\boxed{ \begin{array}{c} \text{ML-DSA erzeugt aus einem kurzen geheimen Vektor eine Antwort auf eine}\\ \text{Challenge, die aus der Bewertung selbst gehasht wurde — prüfbar}\\ \text{für jeden mit dem öffentlichen Schlüssel.} \end{array}}

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.