Für moderne kryptografische Hash-Funktionen gibt es kein effizient berechenbares Prädikat für die Nähe, vorausgesetzt, die Verteilung auf weist eine ausreichende Entropie auf. Die Intuition ist, dass diese Hash-Funktionen so konzipiert sind, dass sie "keine Struktur haben", also lassen sie so etwas nicht zu.x
In technischer Hinsicht verhalten sich moderne kryptografische Hash-Funktionen "wie ein zufälliges Orakel". Für ein zufälliges Orakel gibt es kein solches Prädikat für die Nähe: Das Beste, was Sie tun können, scheint darin zu bestehen, die Hash-Funktion zu invertieren und dann alle engen Zeichenfolgen aufzulisten und zu hashen. Daher gibt es für moderne kryptografische Hash-Funktionen keine Möglichkeit, dies zu tun.
Heuristisch ist es möglich, eine benutzerdefinierte Hash-Funktion zu entwerfen, die ein effizientes Prädikat für die Nähe zulässt und die angesichts dieser Tatsache (ungefähr) "so sicher wie möglich" ist. Nehmen wir an, die Zeichenfolgen, die wir hashen werden, haben eine feste Länge. Angenommen, wir haben einen guten Fehlerkorrekturcode und lassen den Decodierungsalgorithmus sein (also ordnet er eine Bitfolge einem nahe gelegenen Codewort zu, wenn dies möglich ist).D.
Stellen Sie sich vor, Sie definieren um ein einfaches, aber unvollständiges Schema zu erhalten . Wenn x , y zwei zufällige Zeichenfolgen sind, die ausreichend nahe beieinander liegen, besteht eine gute Chance, dass h ( x ) = h ( y ) ist . Wenn x , y nicht nahe beieinander liegen, sieht h ( x ) nicht wie h ( y ) aus , und wir erhalten keine Informationen über die Tatsache hinaus, dass xh ( x ) = SHA256 ( D ( x ) )x , yh ( x ) = h ( y)x , yh ( x )h ( y) sind nicht nah. Das ist einfach. Es ist jedoch auch unvollkommen. Es gibt viele Paare x , y , die nahe beieinander liegen, bei denen wir diese Tatsache jedoch nicht anhand von h ( x ) , h ( y ) erkennen können (z. B. weil die Decodierungsfunktion D fehlschlägt).x , yx , yh ( x ) , h ( y)D.
Heuristisch scheint es möglich zu sein, diese Konstruktion zu verbessern. Wählen Sie zur Entwurfszeit zufällige Bitfolgen . Definieren Sie nun die folgende Hash-Funktion:r1, … , R.k
h ( x ) = ( SHA256 ( D ( x ⊕ r1) , … , SHA256 ( D ( x ⊕ rk) ) .
Wenn nun ausreichend nahe sind, ist es wahrscheinlich, dass i so existiert , dass D ( x ⊕ r i ) = D ( y ⊕ r i ) und somit h ( x ) i = h ( y ) i . Dies legt nahe , unmittelbar eine Nähe Prädikat: wenn h ( x ) übereinstimmt h ( y ) in einer ihrer k - Komponenten, dann x ,x , yichD ( x ⊕ rich) = D ( y⊕ rich)h ( x )ich= h ( y)ichh ( x )h ( y)k sind nah; Andernfalls schließen Sie, dass sie nicht nahe sind.x , y
Wenn Sie zusätzlich Kollisionsfestigkeit wünschen, ist eine einfache Konstruktion die folgende: Sei eine Hash-Funktion mit einem Prädikat für die Nähe; dann ist h ( x ) = ( h 1 ( x ) , SHA256 ( x ) ) kollisionssicher (jede Kollision hierfür ist auch eine Kollision für SHA256) und hat ein Prädikat für die Nähe (verwenden Sie einfach das Prädikat für die Nähe für h 1 ). Sie können h 1 ( ⋅ ) die oben definierte Hash-Funktion sein lassen.h1( ⋅ )h ( x ) = ( h1( x ) , SHA256 ( x ) )h1h1( ⋅ )
Dies ist alles für die Hamming-Distanz. Der Bearbeitungsabstand ist wahrscheinlich erheblich schwieriger.
Bei der Entwicklung der obigen Konstruktion hat mich das folgende Papier inspiriert:
Ari Juels, Martin Wattenberg. Ein Fuzzy-Commitment-Schema .
Ari Juels, Madhi Sudhan. Ein Fuzzy-Vault-Schema . Designs, Codes und Kryptographie 38 (2): 237-257, 2006.
Übrigens: In der Kryptographie sind Hash-Funktionen nicht verschlüsselt. Wenn Sie eine Schlüsselsache möchten, sollten Sie sich Pseudozufallsfunktionen ansehen.