Para las funciones hash criptográficas modernas, no, no existe un predicado de cercanía computable de manera eficiente, suponiendo que la distribución en xTiene suficiente entropía. La intuición es que estas funciones hash están diseñadas para "no tener estructura", por lo que no admiten nada como esto.
En términos técnicos, las funciones hash criptográficas modernas se comportan "como un oráculo aleatorio". Para un oráculo aleatorio, no existe dicho predicado de cercanía: lo mejor que puede hacer es invertir la función hash y luego enumerar todas las cadenas cerradas y hacerlas hash. Como resultado, no hay forma de hacer esto para las funciones hash criptográficas modernas.
Heurísticamente, es posible diseñar una función hash personalizada que admite un predicado de cercanía eficiente y que es (aproximadamente) "lo más seguro posible" dado este hecho. Supongamos que las cadenas que vamos a hacer hash son de longitud fija. Supongamos que tenemos un buen código de corrección de errores, y dejemosD ser el algoritmo de decodificación (por lo que puede asignar una cadena de bits a una palabra de código cercana, si puede).
Para obtener un esquema simple pero imperfecto, imagine definir h(x)=SHA256(D(x)). Six,y son dos cadenas aleatorias que están lo suficientemente cerca, entonces hay una posibilidad decente de que h(x)=h(y). Six,y no están cerca, entonces h(x) no se parecerá en nada h(y), y no obtendremos información más allá del hecho de que x,yNo están cerca. Esto es simple. Sin embargo, también es imperfecto. Hay muchos paresx,y que están cerca pero donde no podemos detectar este hecho h(x),h(y) (por ejemplo, porque la función de decodificación D falla).
Heurísticamente, parece posible mejorar esta construcción. En tiempo de diseño, elija cadenas de bits aleatoriasr1,…,rk. Ahora, defina la siguiente función hash:
h(x)=(SHA256(D(x⊕r1),…,SHA256(D(x⊕rk)).
Ahora si x,y están lo suficientemente cerca, es probable que exista i tal que D(x⊕ri)=D(y⊕ri), y por lo tanto h(x)i=h(y)i. Esto sugiere inmediatamente un predicado de cercanía: sih(x) partidos h(y) en cualquiera de sus k componentes, entonces x,yestán cerca; de lo contrario, infiera que no están cerca.
Si además desea resistencia a la colisión, una construcción simple es la siguiente: deje h1(⋅)ser una función hash con un predicado de cercanía; entoncesh(x)=(h1(x),SHA256(x)) es resistente a colisiones (cualquier colisión para esto también es una colisión para SHA256) y tiene un predicado de cercanía (simplemente use el predicado de cercanía para h1) Puedes dejarh1(⋅) ser la función hash definida anteriormente.
Esto es todo por la distancia de Hamming. Editar distancia es probablemente significativamente más difícil.
Al proponer la construcción anterior, me inspiré en el siguiente artículo:
Ari Juels, Martin Wattenberg. Un esquema de compromiso difuso .
Ari Juels, Madhi Sudhan. Un esquema de bóveda difusa . Diseños, códigos y criptografía 38 (2): 237-257, 2006.
Por cierto: en criptografía, las funciones hash no están tecleadas. Si quería algo con clave, es posible que desee echar un vistazo a las funciones pseudoaleatorias.