Da bei jeder Signatur die Hälfte des privaten Schlüssels veröffentlicht
werden muss, lässt sich, wie der Name bereits impliziert, das
Lamport-Einmal-Signaturverfahren nur einmal pro Schlüsselpaar verwenden.
Dasselbe gilt für das sogenannte "Winternitz Einmalsignaturverfahren",
ein weiteres grundlegendes Verfahren der hashbasierten Kryptografie (s.
4.1.). Es sind zwei
Methoden bekannt, die es ermöglichen, diese Einmalsignaturverfahren zu
Mehrfachsignaturverfahren zu modifizieren: Das Chaining von Nachrichten
und das Merkle-Baum Signaturverfahren.
Chaining
Beim Chaining veröffentlicht der Sender am Ende jeder signierten
Nachricht einen neuen öffentlichen Schlüssel, mit dem die jeweils
folgende Nachricht verifiziert werden kann.
Dadurch ist es zum Verifizieren der Signatur einer Nachricht jedoch
notwendig, dass dem Empfänger ebenfalls alle vorherigen Signaturen
vorliegen. Diese müssen bei jeder Nachricht angehängt werden. Das
bedeutet, dass die Länge der Signatur einer Nachricht mit jeder weiteren
Iteration des Verfahrens linear ansteigt. Darüber hinaus steigt auch der
Rechenaufwand, den der Empfänger beim Verifizieren leisten muss, da er
jede einzelne Nachricht der Kette prüfen muss. Außerdem wird mit jeder
Signatur zusätzliche Information veröffentlicht, nämlich wie viele
Signaturen bereits erstellt wurden. Aus diesen Gründen wird auf dieses
Verfahren in der Regel zugunsten des Merkle-Baum Signaturverfahrens
verzichtet.
Merkle-Baum Signaturverfahren
Das Merkle-Baum Signaturverfahren bietet eine Alternative zum Chaining,
bei der der Aufwand lediglich logarithmisch mit der Anzahl der
Signaturen steigt, indem ein Binärbaum anstelle einer Kette genutzt
wird. Allerdings muss zu Beginn die Anzahl der maximal möglichen
Signaturen festgelegt werden, was je nach Anwendungsfall Vor- und
Nachteile haben kann. Im Vergleich zu RSA ist dieses Verfahren zwar eher
ineffizient, jedoch stellt es eine vielversprechende Methode für
zukünftige digitale Signaturen dar, da es als sicher gegen Angriffe
mittels Quantencomputern gilt.
Als erstes muss eine Höhe \(H \in \mathbb{N} \geq 2\) des Binärbaumes
festgelegt werden. Jedes Blatt dieses Binärbaumes entspricht einer
möglichen Signatur. Bei einem Binärbaum der Höhe \(H\) sind also \(2^H\)
Signaturen möglich. Zusätzlich müssen ein Einmalsignaturverfahren und
eine kryptografische Hashfunktion \(f\) ausgewählt werden.
Jedem Blatt wird nun ein privater Schlüssel \(X_i\) und ein
entsprechender öffentlicher Schlüssel \(Y_i\), mit \(0 \leq i < 2^H\),
des gewählten Einmalsignaturverfahrens zugewiesen. Der Wert eines jeden
Blattes ist dann der Hashwert des entsprechenden öffentlichen
Schlüssels, den man mithilfe der kryptografischen Hashfunktion \(f\)
berechnet.
Die Knoten des Binärbaumes nennt man \(k_{j,i}\). Hier ist \(j\) die
Ebene im Binärbaum (also \(j = H\) bei den Blättern) und \(i\) deren
Index, wenn man beginnend bei \(0\) von links nach rechts zählt.
Für die Blätter gilt: \(k_{H,i} = f(Y_i\)).
Allen anderen Knoten im Binärbaum wird der Hashwert der
aneinandergehängten Werte seiner beiden Kindknoten zugewiesen: \(k_{j,i}
= f(k_{j+1,2i}||k_{j+1,2i+1})\).
Der Wert der Wurzel des Binärbaumes ist der übergeordnete öffentliche
Schlüssel des Verfahrens.
Abbildung 1: Merkle-Baum mit der Höhe \(H = 2\)
Um eine Nachricht zu signieren, wählt der Sender den nächsten
unbenutzten privaten Schlüssel und bildet die Signatur mithilfe des
Einmalsignaturverfahrens. Anschließend veröffentlicht er, wie immer, die
Nachricht, die Signatur und den passenden öffentlichen Schlüssel zum
genutzten privaten Schlüssel. Zusätzlich veröffentlicht er den Index des
genutzten Blattes und die Hashwerte der Geschwisterknoten aller Knoten,
die auf dem Pfad von dem genutzten Blatt zur Wurzel liegen.
Beispiel anhand Abbildung 1:
Wenn wir \(X_1\) verwendet haben, liegen \(k_{2,1}\) und \(k_{1,0}\) auf
dem Pfad zur Wurzel \(k_{0,0}\). Es müssen also die Werte der
Geschwisterknoten von \(k_{2,1}\) und \(k_{1,0}\), also \(k_{2,0}\) und
\(k_{1,1}\), mitveröffentlicht werden. Des Weiteren veröffentlichen wir
den Index des Blattes, also in diesem Fall \(i = 1\).
Um eine Signatur zu verifizieren, muss nun zuerst der mitgesendete
öffentliche Schlüssel verifiziert werden. Dazu wird der Hashwert von
diesem mittels der kryptografischen Hashfunktion \(f\) gebildet. Dieser
Hashwert wird nun mit dem ersten mitgesendeten Hashwert der
Geschwisterknoten konkateniert und von dem Ergebnis erneut der Hashwert
berechnet. Ist der mitgesendete Index dabei gerade, muss der
mitgesendete Hashwert hinten an den vorliegenden Hashwert angehängt
werden, ansonsten vorne. Anschließend wird der Index des Elternknotens
mit \(i_{Eltern} = \lfloor \frac {i_{Kind}}{2} \rfloor\) berechnet. Mit
dem neuen Hashwert wird der nächste mitgesendete Geschwisterknoten
konkateniert und gehasht, und so weiter. Erhält man am Ende einen Wert,
der mit dem des übergeordneten öffentlichen Schlüssels, also der Wurzel
des Binärbaumes, übereinstimmt, gilt der öffentliche Schlüssel als
gültig. Anschließend kann die Gültigkeit der Signatur entsprechend des
Einmalsignaturverfahrens mithilfe des verifizierten öffentlichen
Schlüssels geprüft werden.
Beispiel anhand Abbildung 1:
Der Empfänger bildet den Hashwert des mitgesendeten öffentlichen
Schlüssels \(Y_1\) und erhält \(k_{2,1}\). Da \(i=1\) ungerade ist, wird
der erste mitgesendete Hashwert \(k_{2,0}\) vorne an \(k_{2,1}\)
angehängt. Er bildet also den Hashwert \(f(k_{2,0}||k_{2,1})\) und
erhält \(k_{1,0}\). Den Index dieses Knotens berechnet er mittels
\(i_{Eltern} = \lfloor \frac {1}{2} \rfloor = 0\). Dann hängt er
\(k_{1,1}\) hinten an den neuen Hashwert, da der neue Index gerade ist.
Er bildet den Hashwert \(f(k_{1,0}||k_{1,1})\) und erhält \(k_{0,0}\).
Damit gilt \(Y_1\) gültig, da \(k_{0,0}\) der übergeordnete öffentliche
Schlüssel ist.
Der Mehraufwand setzt sich also daraus zusammen, dass bei jeder Signatur
\(H\) weitere Hashwerte und ein Index mitgesendet werden müssen und bei
jeder Verifikation \(H\) weitere Hashwerte gebildet werden müssen. Ein
weiterer nennenswerter Umstand ist, dass das Merkle-Baum
Signaturverfahren nicht zustandslos ist. Der Signierer muss also immer
den gesamten Binärbaum und die Information, welche Blätter bereits
genutzt wurden, speichern, um diesen weiter nutzen zu können.