Zum Hauptinhalt springen

2.1. Merkle Hash Trees (Merkle-Hash-Bäume)

2.1. Merkle Hash Trees (Merkle-Hash-Bäume)

Logs verwenden einen binären Merkle Hash Tree (Merkle-Hash-Baum) für effiziente Prüfungen. Der Hash-Algorithmus ist SHA-256 [FIPS.180-4] (für dieses Experiment fest; es wird erwartet, dass jedes Log künftig einen Hash-Algorithmus angeben kann). Die Eingabe in den Merkle Tree Hash ist eine Liste von Dateneinträgen; diese Einträge werden gehasht, um die Blätter des Merkle Hash Tree zu bilden. Die Ausgabe ist ein einzelner 32-Byte-Merkle Tree Hash. Gegeben eine geordnete Liste von n Eingaben D[n] = {d(0), d(1), ..., d(n-1)}, ist der Merkle Tree Hash (MTH) wie folgt definiert:

Der Hash einer leeren Liste ist der Hash eines leeren Strings:

MTH({}) = SHA-256().

Der Hash einer Liste mit einem Eintrag (auch Leaf Hash (Blatt-Hash) genannt) ist:

MTH({d(0)}) = SHA-256(0x00 || d(0)).

Für n > 1 sei k die größte Zweierpotenz kleiner als n (d. h. k < n <= 2k). Der Merkle Tree Hash einer n-elementigen Liste D[n] ist dann rekursiv definiert als

MTH(D[n]) = SHA-256(0x01 || MTH(D[0:k]) || MTH(D[k:n])),

wobei || Konkatenation ist und D[k1:k2] die Liste {d(k1), d(k1+1),..., d(k2-1)} der Länge (k2 - k1) bezeichnet. (Beachten Sie, dass die Hash-Berechnungen für Blätter und innere Knoten unterschiedlich sind. Diese Domain Separation (Domänentrennung) ist für Second Preimage Resistance (Zweit-Präimage-Widerstand) erforderlich.)

Wir verlangen nicht, dass die Länge der Eingabeliste eine Zweierpotenz ist. Der resultierende Merkle Tree kann daher unausgeglichen sein; seine Form ist jedoch durch die Anzahl der Blätter eindeutig bestimmt. (Hinweis: Dieser Merkle Tree entspricht im Wesentlichen dem Vorschlag History Tree [CrosbyWallach], außer dass unsere Definition nicht volle Bäume anders behandelt.)