Pour les fonctions de hachage cryptographiques modernes, non, il n'y a pas de prédicat de proximité efficacement calculable, en supposant que la distribution sur Xa une entropie suffisante. L'intuition est que ces fonctions de hachage sont conçues pour "ne pas avoir de structure", donc elles n'admettent rien de tel.
En termes techniques, les fonctions de hachage cryptographiques modernes se comportent "comme un oracle aléatoire". Pour un oracle aléatoire, il n'y a pas un tel prédicat de proximité: le mieux que vous puissiez faire semble être d'inverser la fonction de hachage, puis d'énumérer toutes les chaînes proches et de les hacher. En conséquence, il n'y a aucun moyen de le faire pour les fonctions de hachage cryptographiques modernes.
Heuristiquement, il est possible de concevoir une fonction de hachage personnalisée qui admet un prédicat de proximité efficace et qui est (à peu près) "aussi sécurisé que possible" étant donné ce fait. Supposons que les chaînes que nous allons hacher sont de longueur fixe. Supposons que nous ayons un bon code correcteur d'erreurs, et laissonsré être l'algorithme de décodage (donc il mappe une chaîne de bits à un mot de code à proximité, s'il le peut).
Pour obtenir un schéma simple mais imparfait, imaginez définir h ( x ) = SHA256 ( D ( x ) ). Six , y sont deux chaînes aléatoires qui sont suffisamment proches, alors il y a une chance décente que h ( x ) = h ( y). Six , y ne sont pas proches, alors h ( x ) ne ressemblera en rien h ( y), et nous n'obtiendrons aucune information au-delà du fait que x , yne sont pas proches. C’est simple. Cependant, il est également imparfait. Il y a plusieurs pairesx , y qui sont proches, mais où nous ne pouvons pas détecter ce fait h ( x ) , h ( y) (par exemple, parce que la fonction de décodage ré échoue).
Heuristiquement, il semble possible d'améliorer cette construction. Au moment de la conception, choisissez des chaînes de bits aléatoiresr1, … ,rk. Maintenant, définissez la fonction de hachage suivante:
h ( x ) = ( SHA256 ( D ( x ⊕r1) , … , SHA256 ( D ( x ⊕rk) ) .
Maintenant si x , y sont suffisamment proches, il est probable qu'il existe je tel que D ( x ⊕rje) = D ( y⊕rje), Et ainsi h ( x)je= h ( y)je. Cela suggère immédiatement un prédicat de proximité: sih ( x ) allumettes h ( y) dans l'un de ses k composants, puis x , ysont proches; sinon, déduisez qu'ils ne sont pas proches.
Si vous souhaitez en outre une résistance aux collisions, une construction simple est la suivante: laissez h1( ⋅ )être une fonction de hachage avec un prédicat de proximité; puish ( x ) = (h1( x ) , SHA256 ( x ) ) est résistant aux collisions (toute collision pour cela est également une collision pour SHA256) et a un prédicat de proximité (utilisez simplement le prédicat de proximité pour h1). Vous pouvez laisserh1( ⋅ ) être la fonction de hachage définie ci-dessus.
C'est tout pour la distance de Hamming. La distance d'édition est probablement beaucoup plus difficile.
En proposant la construction ci-dessus, je me suis inspiré du document suivant:
Ari Juels, Martin Wattenberg. Un plan d'engagement flou .
Ari Juels, Madhi Sudhan. Un système de voûte floue . Dessins, codes et cryptographie 38 (2): 237-257, 2006.
Incidemment: en cryptographie, les fonctions de hachage sont sans clé. Si vous vouliez une chose à clé, vous voudrez peut-être jeter un œil aux fonctions pseudo-aléatoires.