2012-04-10 17 views
3

Ich muss einen einfachen Hash-Algorithmus implementieren.Kurzer (6 Bit) kryptografischer Schlüssel Hash

Eingabedaten:

  • Wert (16-Bit-Ganzzahl).
  • Schlüssel (beliebiger Länge).

Ausgangsdaten:

  • 6-Bit-Hash- (Zahl 0-63).

Anforderungen:

  • Es sollte praktisch unmöglich sein Hash-Wert vorherzusagen, wenn Sie den Eingabewert haben, aber nicht den Schlüssel. Genauer gesagt: Wenn ich Hash (x) für x < M kenne, sollte es schwierig sein, Hash (M) vorherzusagen, ohne den Schlüssel zu kennen.

Mögliche Lösungen:

  1. Halten vollständige Abbildung als Schlüssel. Also hat der Schlüssel die Länge 2^16 * 6 Bits. Es ist zu lang für meinen Fall.
  2. Linearer Code. Key ist eine Generatormatrix. Es ist Länge 16 * 6. Aber es ist einfach, eine Generatormatrix zu finden, die mehrere bekannte Hash-Werte verwendet.

Gibt es noch andere Möglichkeiten?

Antwort

5

Ein HMAC scheint, was Sie wollen. Eine Möglichkeit für Sie könnte also sein, einen SHA-basierten HMAC zu verwenden und nur einen Teilstring des resultierenden Hash zu verwenden. Dies sollte relativ sicher sein, da die Bits eines kryptografischen Hashs so unabhängig und unvorhersehbar wie möglich sein sollten.

Abhängig von Ihrer Umgebung könnte dies jedoch zu viel Verarbeitungszeit erfordern. Daher müssen Sie möglicherweise ein einfacheres Hashing-Schema wählen, um Ihren HMAC zu erstellen.

Original-Antwort die Diskussion in den Kommentaren zu beruhen:

Da Sie ohnehin Verschlüsselungseigenschaften vergessen können (es ist trivial Kollisionen über Brute-Force-Angriffe auf einer 5-Bit-Hash zu finden) Sie auch nutzen können etwas wie CRC oder Hamming-Codes und erhalten Fehlererkennung kostenlos

+0

CRCs sind keine Hashes. Das OP sagt nicht, wofür er es will, aber es gibt Situationen, in denen ein CRC ein besonders schlechter Ersatz für einen Hash ist - wie in einer Hashtabelle. –

+1

@NickJohnson warum sollte CRC nicht für eine Hashtable geeignet sein (außer dass es schnellere Methoden gibt, um einen passenden Hash zu erhalten)? – mensi

+0

Wie Sie selbst angemerkt haben, enthalten CRCs Redundanz für eine zuverlässige Fehlererkennung, die ihre Verteilungseigenschaften beeinflusst. –

1

Mensi 'Vorschlag zu abgeschnitten HMAC ist eine gute, aber wenn Sie zufällig auf einem stark eingeschränkten System zu sein und etwas schneller oder einfacher wollen, könnten Sie Nehmen Sie eine block cipher, verschlüsseln Sie Ihren 16-Bit-Wert (aufgefüllt zu einem vollständigen Block) damit und kürzen Sie die Ergebnis zu 6 Bits.

Im Gegensatz zu HMAC, das eine pseudorandom function berechnet, ist eine Blockchiffre pseudorandom permutation — jeder Eingang auf einen anderen Ausgang zugeordnet. Wenn Sie jedoch alle bis auf sechs Bits der Ausgabe der Blockchiffre wegwerfen, wird das, was übrig bleibt, einer Pseudozufallsfunktion sehr ähnlich sein.Es wird eine sehr winzige Verzerrung gegen wiederholte Ausgaben geben, aber (unter der Annahme, dass die Blockchiffre die Blockgröße viel größer als 6 Bits ist, was es sein sollte), wird sie so klein sein, dass sie alle nicht detektierbar ist.

Eine gute Blockchiffre für sehr Low-End-Systeme könnte TEA oder seine Nachfolger XTEA und XXTEA sein. Zwar gibt es einige bekannte Angriffe auf diese Chiffren, aber sie alle erfordern einen wesentlich umfassenderen Zugriff auf die Chiffre, als dies in Ihrer Anwendung möglich sein sollte.

Verwandte Themen