Betrachten Sie eine haben Hash - Funktion die Strings der Länge nimmt und kehrt Strings der Länge und hat die schöne Eigenschaft , dass es resistent gegen Kollisionen , dh es ist schwierig , zwei verschiedene Zeichenketten zu finden mit dem gleichen Hash - .
Sie möchten jetzt eine neue Hash-Funktion erstellen , die Zeichenfolgen beliebiger Länge auf Zeichenfolgen der Länge abbildet und dabei trotzdem kollisionssicher ist.
Zum Glück schon 1979 eine Methode, die heute als Merkle-Damgård-Konstruktion bekannt ist genau dies erreicht.
Die Aufgabe dieser Herausforderung wird es sein, diesen Algorithmus zu implementieren. Wir werden uns daher zunächst die formale Beschreibung der Merkle-Damgård-Konstruktion ansehen, bevor wir uns einem schrittweisen Beispiel zuwenden, das zeigen soll, dass der Ansatz einfacher ist als es könnte zuerst erscheinen.
Wenn eine ganze Zahl , eine Hash-Funktion wie oben beschrieben und eine Eingabezeichenfolge beliebiger Länge gegeben sind, führt die neue Hash-Funktion Folgendes aus:
- Setze , die Länge von und die Aufteilung von in Abschnitte der Länge , wobei der letzte Abschnitt bei Bedarf mit nachgestellten Nullen aufgefüllt wird. Dies ergibt viele Stücke, die mit.
- Hinzufügen eines vorderen und einen hinteren chunk und , wobei eine Zeichenfolge ist , die aus Nullen und ist , im Binär-, aufgefüllt mit führenden Nullen auf Länge .
- Wenden Sie nun iterativ auf den aktuellen Block an, der an das vorherige Ergebnis angehängt ist : , wobei . (Dieser Schritt ist möglicherweise klarer, nachdem Sie sich das folgende Beispiel angesehen haben.)
- Die Ausgabe von ist das Endergebnis .
Die Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die eine positive ganze Zahl , eine Hash-Funktion als Blackbox und eine nicht leere Zeichenfolge als Eingabe verwendet und an denselben Eingängen dasselbe Ergebnis wie zurückgibt .
Das ist Code-Golf , also gewinnt die kürzeste Antwort in jeder Sprache.
Beispiel
Nehmen wir an, , also nimmt unsere gegebene Hash-Funktion Zeichenfolgen der Länge 10 und gibt Zeichenfolgen der Länge 5 zurück.
- Bei einer Eingabe von wir die folgenden Blöcke: , , und . Beachten Sie, dass mit einer nachgestellten Null auf Länge 5 aufgefüllt werden musste.
- ist nur eine Folge von fünf Nullen und ist fünf in binär ( ), aufgefüllt mit zwei führenden Nullen.
- Nun werden die Brocken mit kombiniertem :
- ist unser Output.
Lassen Sie uns einen Blick darauf werfen, wie diese Ausgabe aussehen würde, abhängig von einigen Optionen 1 für :
- Wenn , dh nur jedes zweite Zeichen zurück, erhalten wir:
So Bedürfnisse der Ausgang auf, wennsolches als BlackBoxFunktion gegeben ist. - Wenn einfach die ersten 5 Zeichen seines Eingangszurückkehrt, die Ausgabe des ist . In ähnlicher Weise ist die Ausgabe "00101", wenn die letzten 5 Zeichen .
- Wenn die Zeichencodes seiner Eingabe multipliziert und die ersten fünf Ziffern dieser Zahl zurückgibt, z. B. , dann ist .
1 Der Einfachheit halber sind diese tatsächlich nicht kollisionssicher, obwohl dies für die Prüfung Ihres Beitrags keine Rolle spielt.
omgPzzles0
. Gut gewählter Beispieleingang!