Merkle-Signatur

Die Merkle-Signatur ist ein digitales Signaturverfahren, das auf Merkle-Bäumen sowie Einmalsignaturen wie etwa den Lamport-Einmalsignaturen basiert. Es wurde von Ralph Merkle in den späten 1970er Jahren entwickelt und stellt eine Alternative zu traditionellen digitalen Signaturen wie dem Digital Signature Algorithm oder auf RSA basierenden Signaturen dar. Im Gegensatz zu diesen ist es resistent gegen Angriffe durch Quantencomputer, da seine Sicherheit nur von der Existenz sicherer Hashfunktionen abhängt.

Idee

Ein Problem von Einmalsignaturen, wie der Lamport-Signatur, ist die Übertragung des öffentlichen Schlüssels. Da jeder Schlüssel nur genau einmal verwendet werden kann, kommt eine größere Datenmenge zusammen, die zuverlässig an den Empfänger weitergegeben werden muss.

Das Merkle-Signaturverfahren löst dieses Problem, indem das gesamte (öffentliche) Schlüsselmaterial von 2n Einmalsignaturen in einem mehrstufigen Hash-Verfahren zu einem einzigen Hashwert pub zusammengefasst wird. Als öffentlicher Schlüssel braucht nur pub veröffentlicht zu werden, anschließend lassen sich mit ihm 2n Nachrichten signieren.

Die Signatur einer Nachricht besteht dann aus zwei Teilen:

Schlüsselerzeugung

Merkle-Baum mit 8 Blättern

Das Merkle-Signaturverfahren kann nur verwendet werden, um eine begrenzte Anzahl von Nachrichten mit einem öffentlichen Schlüssel pub zu signieren. Die Anzahl möglicher Nachrichten entspricht einer Zweierpotenz und wird daher als N=2n bezeichnet.

Der erste Schritt bei der Generierung des öffentlichen Schlüssels pub ist die Generierung des privaten Schlüssels Xi und des öffentlichen Schlüssels Yi von 2n Einmalsignaturen. Für jeden öffentlichen Schlüssel Yi mit 1≤i≤2n wird ein Hash-Wert hi=H(Yi) berechnet. Mit diesen Hash-Werten hi wird ein Hash-Baum aufgebaut.

Ein Knoten des Baums wird mit ai,j identifiziert, wobei i die Ebene des Knotens bezeichnet. Die Ebene eines Knotens ist über seinen Abstand zu den Blättern definiert. Somit hat ein Blatt die Ebene i=0 und die Wurzel die Ebene i=n. Die Knoten jeder Ebene sind von links nach rechts durchnummeriert, sodass ai,0 der Knoten ganz links auf Ebene i ist.

Im Merkle-Baum sind die Hash-Werte hi die Blätter des Binärbaums, sodass hi=a0,i. Jeder innere Knoten des Baums ist der Hash-Wert der Konkatenation seiner beiden Kinder. Beispielsweise ist a1,0=H(a0,0||a0,1) und a2,0=H(a1,0||a1,1).

Auf diese Weise wird ein Baum mit 2n Blättern und 2n+1−1 Knoten aufgebaut. Die Wurzel des Baums an,0 ist der öffentliche Schlüssel pub des Merkle-Signaturverfahrens.

Signierung

Merkle-Baum mit Pfad A und Authentifizierungspfad für i=2

Um eine Nachricht M mit dem Merkle-Signaturverfahren zu signieren, wird die Nachricht M zuerst mit einem Einmalsignaturverfahren signiert, wodurch die Signatur sig′ entsteht. Dazu wird eines der Schlüsselpaare aus privatem und öffentlichem Schlüssel (Xi,Yi,) verwendet.

Das einem privaten Einmalschlüssel Xi zugehörige Blatt des Hash-Baums ist a0,i=H(Yi). Der Pfad im Hash-Baum von a0,i zur Wurzel wird mit A bezeichnet. Der Pfad A besteht aus n+1 Knoten, A0,…,An, wobei A0=a0,i die Blätter sind und An=an,0=pub die Wurzel des Baums ist. Um diesen Pfad A zu berechnen, wird jedes Kind der Knoten A1,…,An benötigt. Es ist bekannt, dass Ai ein Kind von Ai+1 ist. Um den nächsten Knoten Ai+1 des Pfades A zu berechnen, müssen beide Kinder von Ai+1 bekannt sein. Daher wird der Bruder von Ai benötigt. Dieser Knoten wird mit authi bezeichnet, sodass Ai+1=H(Ai||authi). Deswegen werden n Knoten auth0,…,authn−1 benötigt, um jeden Knoten des Pfades A zu berechnen. Diese Knoten auth0,…,authn−1 werden berechnet und gespeichert. Sie bilden zusammen mit einer Einmalsignatur sig′ von M die Signatur sig=(sig′,auth0,auth1,…,authn−1) des Merkle-Signaturverfahrens.

Verifizierung

Der Empfänger kennt den öffentlichen Schlüssel pub, die Nachricht M, und die Signatur sig=(sig′,auth0,auth1,…,authn−1). Zuerst verifiziert der Empfänger die Einmalsignatur sig′ der Nachricht M. Falls sig′ eine gültige Signatur von M ist, berechnet der Empfänger A0=H(Yi), indem er den Hash-Wert des öffentlichen Schlüssels der Einmalsignatur berechnet. Für j=1,..,n−1 werden die Knoten Aj des Pfades A berechnet, mit Aj=H(aj−1||bj−1). Wenn An dem öffentlichen Schlüssel pub des Merkle-Signaturverfahrens entspricht, so ist die Signatur gültig.

Weiterentwicklungen

Im Zuge der Suche nach quantencomputerresistenten Signaturverfahren ist das Verfahren in der letzten Zeit wieder stärker in den Fokus gerückt. Inzwischen wurden verbesserte Varianten des Merkle-Signaturverfahrens veröffentlicht, u. a.

Literatur

Einzelnachweise

  1. ↑ RFC: 8391 – XMSS: eXtended Merkle Signature Scheme. September 2018 (englisch).
  2. ↑ Johannes Buchmann, Erik Dahmen, Andreas Hülsing: XMSS – A Practical Forward Secure Signature Scheme Based on Minimal Security Assumptions. In: Post-Quantum Cryptography. PQCrypto 2011 (= Lecture Notes in Computer Science. Band 7071). Springer, Berlin / Heidelberg 2011, S. 117–129, doi:10.1007/978-3-642-25405-5_8.
  3. ↑ D. McGrew, M. Curcio, S. Fluhrer: RFC: 8554 – Leighton-Micali Hash-Based Signatures. April 2019 (englisch).
  4. ↑ Daniel J. Bernstein, Daira Hopwood, Andreas Hülsing, Tanja Lange, Ruben Niederhagen, Louiza Papachristodoulou, Michael Schneider, Peter Schwabe, Zooko Wilcox-O’Hearn: SPHINCS: practical stateless hash-based signatures. In: Elisabeth Oswald, Marc Fischlin (Hrsg.): Advances in Cryptology – EUROCRYPT 2015 (= Lecture Notes in Computer Science. Band 9056). Springer, Berlin / Heidelberg 2015, ISBN 978-3-662-46799-2, S. 368–397, doi:10.1007/978-3-662-46800-5_15.
  5. ↑ SPHINCS: Introduction. In: sphincs.cr.yp.to. Abgerufen am 25. Januar 2019 (englisch).