Una función unidireccional es una función matemática que es fácil de evaluar para cualquier valor de entrada, pero difícil de encontrar el argumento dado el valor de la función. Aquí, "fácil" y "difícil" deben entenderse en términos de la teoría de la complejidad computacional . La brecha entre la complejidad de las transformaciones hacia adelante y hacia atrás determina la eficiencia criptográfica de una función unidireccional. La no inyectividad de una función no es condición suficiente para llamarla unidireccional. Las funciones unidireccionales también se pueden llamar difíciles de revertir o irreversibles.
La existencia de funciones unidireccionales aún no ha sido probada. Su existencia probará que las clases de complejidad P y NP no son iguales , resolviendo una serie de problemas en informática teórica en el camino . Moderno[ ¿cuándo? ] la criptografía asimétrica se basa en la suposición de que existen funciones unidireccionales.
Las funciones unidireccionales son herramientas fundamentales en criptografía , identificación personal, autenticación y otras áreas de seguridad de datos. Aunque la existencia de tales funciones es todavía una hipótesis no comprobada, existen varios contendientes que han resistido décadas de escrutinio. Muchos de ellos forman parte integral de la mayoría de los sistemas de telecomunicaciones , así como de los sistemas de comercio electrónico y banca por Internet de todo el mundo.
Sea el conjunto de todas las cadenas binarias de longitud n. Una función es una función unidireccional si se calcula eficientemente en tiempo polinomial en una máquina de Turing determinista , pero no existe una máquina de Turing probabilística polinomial que invierta esta función con una probabilidad más que exponencialmente pequeña. Es decir, para cualquier máquina de polinomios probabilísticos , para cualquier polinomio y suficientemente grande :
donde la fila se elige al azar en el conjunto de acuerdo con la ley de distribución uniforme. El tiempo de funcionamiento de la máquina está limitado por un polinomio en la longitud de la preimagen deseada [1] .
No se ha probado la existencia de funciones unidireccionales. Si f es una función unidireccional, entonces encontrar la función inversa es difícil (por definición) pero fácilmente verificable (evaluando f en ella). Así, de la existencia de una función unidireccional se sigue que P ≠ NP. Sin embargo, no se sabe si P ≠ NP implica la existencia de funciones unidireccionales.
La existencia de funciones unidireccionales implicará la existencia de muchos otros objetos criptográficos útiles, entre ellos:
Se dice que una función unidireccional conserva la longitud si la longitud en bits del valor de la función es igual a la longitud en bits del argumento. Estas funciones se utilizan, por ejemplo, en generadores pseudoaleatorios. Si la longitud en bits del valor de una función unidireccional es constante para cualquier longitud de argumento, se denomina función hash . Entonces, la función hash se usa para almacenar contraseñas o crear una firma electrónica [1] .
La dificultad del problema de construir esquemas criptográficos a partir de funciones unidireccionales puede ilustrarse con el siguiente ejemplo. Sea una función unidireccional y necesitamos construir un criptosistema con una clave secreta . En tal criptosistema, solo hay una clave, una secreta, que es conocida tanto por el remitente como por el destinatario del mensaje cifrado. Los algoritmos de cifrado y descifrado dependen de esta clave secreta y son tales que para cualquier texto sin formato . Está claro que si el criptograma del mensaje se calcula como , entonces el adversario que interceptó , puede calcular solo con una probabilidad insignificante. Pero, en primer lugar, no está claro cómo un destinatario legítimo puede recuperar un mensaje de un criptograma. En segundo lugar, del hecho de que la función es unidireccional, solo se deduce que el adversario no puede calcular el mensaje completo. Y este es un nivel muy bajo de resistencia. Es deseable que un adversario que conoce el criptograma no pueda calcular ni un solo bit del texto sin formato.
Para resolver el primer problema, se inventaron las funciones unidireccionales con entrada secreta . Este es un tipo especial de función unidireccional para el cual es fácil de calcular dado , pero difícil de calcular a partir de conocido . Sin embargo, hay cierta información secreta adicional que, si se conoce, se puede calcular fácilmente .
Otro ejemplo del uso de funciones unidireccionales en esquemas criptográficos es el siguiente esquema de autenticación:
El suscriptor genera la siguiente secuencia de mensajes: etc. , donde es una función unidireccional. Luego se transmite por un canal secreto (o en una reunión) al suscriptor . Cuando es necesario confirmar su identidad, transmite un mensaje por un canal abierto . cheques: . La próxima vez enviará y verificará: etc. La interceptación de mensajes en la i-ésima etapa en el canal abierto no le dará nada al atacante, ya que no podrá obtener el valor correspondiente para identificarse como el próximo suscriptor . tiempo _ Tales esquemas se utilizan para identificar "amigo/enemigo" [2] .
Para proteger los sistemas informáticos del abuso de los servicios, se le pide a la parte solicitante que resuelva un problema que requiere mucho tiempo para encontrar una solución, y la parte que presta el servicio verifica fácil y rápidamente el resultado. Un ejemplo de este tipo de protección antispam es el sistema Hashcash [3] , que solicita un hash de inversión parcial al remitente del correo electrónico.
El sistema Bitcoin requiere que la suma hash resultante sea menor que un parámetro especial. Para buscar la suma hash deseada, se requiere volver a calcularla varias veces con la enumeración de valores arbitrarios del parámetro adicional. Todas las computadoras del sistema tardan unos 10 minutos en buscar una suma hash, que regula la velocidad a la que se emiten nuevos bitcoins. La verificación requiere solo un único cálculo hash.
La existencia de funciones unidireccionales es una condición necesaria para la solidez de muchos tipos de esquemas criptográficos. En algunos casos, este hecho se establece de manera bastante simple. Considere una función tal que . Es computable por el algoritmo en tiempo polinomial. Demostremos que si no es una función unidireccional, entonces el criptosistema es inestable. Supongamos que hay un algoritmo probabilístico polinomial que invierte con probabilidad para al menos algún polinomio . Aquí está la longitud de la clave . Un atacante puede ingresar una clave para el algoritmo y obtener algún valor de la preimagen con la probabilidad especificada . A continuación, el atacante alimenta el algoritmo como entrada y recibe un par de claves . Si bien no es necesariamente lo mismo que , es, sin embargo, por definición, un sistema criptográfico para cualquier texto sin formato . Dado que se encuentra con una probabilidad de al menos , que no se considera despreciable en criptografía, el criptosistema es inestable.
De lo dicho se desprende que la suposición de la existencia de funciones unidireccionales es la suposición criptográfica más débil, que puede ser suficiente para probar la existencia de esquemas criptográficos fuertes de varios tipos. Para averiguar si esta condición es realmente suficiente, se dirigen esfuerzos considerables de especialistas.
Hoy en día[ ¿cuándo? ] se demuestra que la existencia de funciones unidireccionales es condición necesaria y suficiente para la existencia de criptosistemas fuertes con clave secreta, así como de protocolos criptográficos fuertes de varios tipos, incluidos los protocolos de firma electrónica. Por otro lado, está el resultado de Impagliazzo y Rudich, que es un argumento suficientemente fuerte de que ciertos tipos de esquemas criptográficos (incluidos los protocolos de distribución de claves tipo Diffie-Hellman) requieren suposiciones más fuertes que la suposición de función unidireccional [4] .
A continuación se describen varios contendientes para las funciones unidireccionales. Por el momento no se sabe si realmente son unidireccionales, pero una extensa investigación aún no ha podido encontrar un algoritmo inverso eficiente para cada uno de ellos.
La función toma como entrada dos números primos y en representación binaria y devuelve su producto . Esta función se puede calcular en tiempo de orden , donde es la longitud total (número de números binarios) de la entrada. Construir una función inversa requiere encontrar los factores de un número entero dado . La determinación de los factores es una operación computacional que consume mucho tiempo. Para estimar la complejidad de un algoritmo que descompone un número entero en factores primos, se suele utilizar la función:
Si el algoritmo tiene complejidad , entonces necesita un tiempo polinomial para ejecutarse (el tamaño del problema en la entrada, la cantidad de bits del número, ). Con la complejidad, requerirá un tiempo exponencial. Por lo tanto, la tasa de crecimiento de la función está entre polinomial y exponencial. Por lo tanto, se dice que los algoritmos con tal complejidad requieren un tiempo subexponencial [5] .
Hay varios métodos para factorizar un número con primos y . Algunos:
La función se puede generalizar a un rango de semiprimos . Tenga en cuenta que no puede ser unilateral para arbitraria , ya que su producto tiene un factor de 2 con probabilidad de ¾.
Tenga en cuenta que la factorización con complejidad polinomial es posible en una computadora cuántica usando el algoritmo de Shor ( clase BQP ).
La función toma dos números enteros: y , donde es el producto de dos números primos y . El resultado es el resto después de dividir por . Encontrar la función inversa requiere calcular el módulo de la raíz cuadrada , es decir, encontrar si también se sabe que . Se puede demostrar que el último problema es computacionalmente tan difícil como la factorización.
El criptosistema Rabin se basa en la suposición de que la función Rabin es unidireccional.
La función de exponente discreto toma como argumentos un número primo y un número entero en el rango de hasta y devuelve el resto después de dividir algunos por . Esta función se puede calcular fácilmente en el tiempo , donde es el número de bits en . La inversión de esta función requiere calcular el módulo del logaritmo discreto . Sea un grupo abeliano finito, por ejemplo, un grupo multiplicativo de un campo finito o una curva elíptica sobre un campo finito. La tarea de calcular logaritmos discretos es determinar un número entero que, dados los datos, satisfaga la relación:
Para algunos grupos , esta tarea es bastante sencilla. Por ejemplo, si es un grupo de números enteros módulo de suma. Para otros grupos, sin embargo, esta tarea es más difícil. Por ejemplo, en un grupo multiplicativo de campos finitos, el algoritmo más conocido para resolver el problema del logaritmo discreto es el método de la criba cuadrática en un campo numérico . La complejidad de calcular logaritmos discretos en este caso se estima como . El esquema de ElGamal se basa en este problema [6] .
Para grupos como la curva elíptica, el problema del logaritmo discreto es aún más difícil. El mejor método actualmente disponible para calcular logaritmos discretos sobre una curva elíptica general sobre un campo se llama método ρ de Pollard . Su complejidad . Este es un algoritmo exponencial, por lo que los criptosistemas de curva elíptica tienden a trabajar con una clave pequeña, alrededor de 160 bits. Mientras que los sistemas basados en factorización o cálculo de logaritmos discretos en campos finitos utilizan claves de 1024 bits [6] .
Varios problemas estrechamente relacionados también están relacionados con el problema del logaritmo discreto. Sea un grupo abeliano finito :
Se puede demostrar que el problema de selección de Diffie-Hellman no es más difícil que el problema de Diffie-Hellman, y que el problema de Diffie-Hellman no es más difícil que el problema del logaritmo discreto [6] .
Hay muchas funciones hash criptográficas (por ejemplo , SHA-256 ) que son rápidas de calcular. Algunas de las versiones más simples no pasaron por un análisis complejo, pero las versiones más sólidas continúan ofreciendo soluciones prácticas y rápidas para cálculos unidireccionales. Gran parte del apoyo teórico para estas características tiene como objetivo frustrar algunos de los ataques exitosos anteriores.
Otros contendientes para funciones unidireccionales se basan en la dificultad de decodificar códigos lineales aleatorios y otros problemas.