Zum Verständnis des Dilithium-Signaturverfahrens ist es hilfreich, wenn Sie sich zunächst das Signaturverfahren von Schnorr noch einmal ansehen.
Vorgegeben ist eine zyklische Gruppe G der Ordnung n, ein festgelegtes erzeugendes Element g und eine Hashfunktion H.
Schlüssel erzeugen
Ausgabe:
Öffentlicher Schlüssel ga und privater Schlüssel a
Methode:
Signieren
Eingabe:
Dokument m ∈ {0, 1}*, privater Schlüssel a
Ausgabe:
Signatur s
Methode:
Die Operation || bedeutet hier Verkettung.
Signatur prüfen
Eingabe:
Dokument m, Signatur s = (c, z), öffentlicher Schlüssel ga
Methode:
Die Prüfung der Signatur funktioniert, denn es ist
y = z – ca mod n
und damit
w' = gz·(ga)-c = gz·g-ca = gz-ca = gy = w
Die Reduktion modulo n in Schritt 3 ist möglich, da n die Ordnung der Gruppe G ist und damit gn = 1 ist. Somit ist
gca mod n = gca-kn = gca · g-kn = gca · (gn)-k = gca · 1-k = gca
Die Sicherheit dieses Signaturverfahrens beruht auf der Schwierigkeit, das Diskrete-Logarithmus-Problems (DLP) zu lösen. Ein Angreifer kann keine gültige Signatur erstellen, ohne die Zahl a zu kennen, auch dann nicht, wenn er z kennt.
Sie kennen die Operation mod n, die den Rest bei Division durch n liefert. Hierbei liegt dieser Rest zwischen 0 und n-1. Die Operation mods n liefert ebenfalls den Rest bei Division durch n, wobei dieser Rest jedoch zwischen -(n-1) div 2 und n div 2 liegt.
Zum Beispiel liegt der Rest
Sie interpretieren also den Rest als negative Zahl, wenn er größer als n div 2 ist.
Definition: (Operation mods)
Für alle Zahlen a ∈ ℤ und n ∈ ℕ, n > 1 ist
a mods n = | ![]() |
|
Im Dilithium-Signaturverfahren spielen folgende Mengen eine Rolle:
ℤq | = | {0, ..., q-1} |
Rq | = | ℤq[x] / (xn +1) |
Sη | = | Teilmenge von Rq, Polynome mit Koeffizienten (mods q) in {-η, ..., η} |
S'γ1 | = | Teilmenge von Rq, Polynome mit Koeffizienten (mods q) in {-γ1+1, ..., γ1} |
Im Dilithium-Standard ML-DSA-87 haben die dabei auftretenden Parameter folgende Werte:
q | = | 223 – 213 +1 = 8.380.417 ![]() |
n | = | 256 |
(k, l) | = | (8, 7) |
η | = | 2 |
γ1 | = | 219 |
Das Dilithium-Signaturverfahren basiert auf Matrizen und Vektoren, deren Komponenten Polynome aus Rq sind. So ist etwa Rqk×l die Menge aller k×l-Matrizen mit Komponenten aus Rq. Und Sηk ist die Menge aller Vektoren der Länge k mit Komponenten aus der Menge Sη.
Schlüssel erzeugen
Ausgabe:
Öffentlicher Schlüssel (A, t) und privater Schlüssel (s1, s2)
Methode:
Signieren
Eingabe:
Dokument m ∈ {0, 1}*, privater Schlüssel (s1, s2)
Ausgabe:
Signatur s
Methode:
Hierbei sind w ∈ Rqk, z ∈ Rql, c ∈ Rq. Die Operation || bedeutet Verkettung.
Signatur prüfen
Eingabe:
Dokument m, Signatur s = (c, z), öffentlicher Schlüssel (A, t)
Methode:
Problem
Es ist z = y + c·s1, durch Multiplikation mit A ergibt sich
A·z = A·y + c·(A·s1) = w + c·(t – s2) = w + c·t – c·s2
Also ist
A·z – c·t = w – c·s2
Um die Signatur zu prüfen, ist es nicht möglich, w' direkt zu berechnen, sondern zunächst nur w' – c·s2.
Lösung
Zum Glück hat das Polynom c·s2 nur kleine Koeffizienten, denn sowohl c als auch s2 haben kleine Koeffizienten. Die Idee zur Lösung des Problems besteht darin, nur die HighBits, also die höchstsignifikanten Bits der Koeffizienten der Polynome zu betrachten.
Um dies zu erreichen, wird die Abfrage (challenge) nur mit den HighBits von w erzeugt. Mit w1 = HighBits(w) ergibt sich nun
c = H(m||w1).
Wenn die LowBits von w – c·s2 klein genug sind, ergibt sich somit
HighBits(w – c·s2) = HighBits(w)
In diesem Fall gilt
w1' = HighBits(A·z – c·t) = HighBits(w – c·s2) = HighBits(w) = w1
Signieren (modifiziert)
Eingabe:
Dokument m ∈ {0, 1}*, privater Schlüssel (s1, s2)
Ausgabe:
Signatur s
Methode:
Signatur prüfen (modifiziert)
Eingabe:
Dokument m, Signatur s = (c, z), öffentlicher Schlüssel (A, t)
Methode:
Die Sicherheit des Dilithium-Signaturverfahrens beruht auf der Schwierigkeit, das MLWE-Problem (Module Learning With Errors) zu lösen.
Der Aufwand des Verfahrens ist zunächst hoch, mit q 223 umfasst die Matrix A eine Datenmenge von 56·256·23 Bit
40 KByte und der Vektor t immerhin auch noch einmal 8·256·23 Bit
6 KByte.
Eine mögliche Lösung ist, nur den Startwert (seed) σ für einen vorgegebenen Zufallsbit-Generator zu veröffentlichen, d.h. der öffentliche Schlüssel ist nun (σ, t). Des Weiteren genügt es, nur die HighBits von t zu veröffentlichen.
Auch ist es aufwendig, in jeder Iteration der modifizierten Signatur-Erzeugung den Hashwert eines möglicherweise sehr großen Dokuments m zu berechnen. Daher wird zunächst μ = H(m) berechnet und dann in jeder Iteration nur noch c = H(μ||w1).
Dies sind nur die Grundzüge des Dilithium-Signaturverfahrens. Das komplette Verfahren ist quite involved (ziemlich verwickelt); es ist als ML-DSA (Module-Lattice-Based Digital Signature Algorithm) in FIPS 204 der NIST veröffentlicht.
Die hier gewählte Darstellung folgt dem Video von A. Menezes:
[Web 1] https://www.youtube.com/watch?v=DCtwD_mN680
Der Standard der NIST ist hier veröffentlicht:
[FIPS 204] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf
Weiter mit: [up]