En criptografía , una función de compresión unidireccional es una función que transforma dos entradas de longitud fija en una salida de longitud fija. [1] La transformación es "unidireccional" , lo que significa que es difícil, dada una salida particular, calcular las entradas que se comprimen en esa salida. Las funciones de compresión unidireccionales no están relacionadas con los algoritmos de compresión de datos convencionales , que en su lugar se pueden invertir exactamente (compresión sin pérdida) o aproximadamente (compresión con pérdida) a los datos originales.
Las funciones de compresión unidireccionales se utilizan, por ejemplo, en la construcción Merkle-Damgård dentro de las funciones hash criptográficas .
Las funciones de compresión unidireccionales a menudo se crean a partir de cifrados en bloque . Algunos métodos para convertir cualquier cifrado de bloque normal en una función de compresión unidireccional son Davies-Meyer , Matyas-Meyer-Oseas , Miyaguchi-Preneel (funciones de compresión de longitud de bloque único) y MDC-2 / Meyer-Schilling , MDC-4 , Hirose (funciones de compresión de longitud de bloque doble). Estos métodos se describen en detalle más abajo. ( MDC-2 también es el nombre de una función hash patentada por IBM ).
Una función de compresión mezcla dos entradas de longitud fija y produce una única salida de longitud fija del mismo tamaño que una de las entradas. Esto también puede verse como que la función de compresión transforma una entrada grande de longitud fija en una salida más corta de longitud fija.
Por ejemplo, la entrada A puede ser de 128 bits, la entrada B de 128 bits y se comprimen en una sola salida de 128 bits. Esto equivale a tener una única entrada de 256 bits comprimida en una única salida de 128 bits.
Algunas funciones de compresión no se comprimen a la mitad, sino a algún otro factor. Por ejemplo, la entrada A puede ser de 256 bits y la entrada B de 128 bits, que se comprimen en una única salida de 128 bits. Es decir, un total de 384 bits de entrada se comprimen juntos a 128 bits de salida.
La mezcla se realiza de tal manera que se logre un efecto de avalancha completo . Es decir, cada bit de salida depende de cada bit de entrada.
Una función unidireccional es una función que es fácil de calcular pero difícil de invertir. Una función de compresión unidireccional (también llamada función hash) debe tener las siguientes propiedades:
Idealmente, a uno le gustaría que la "inviabilidad" en la resistencia a la preimagen y la segunda resistencia a la preimagen significaran un trabajo de aproximadamente dónde está el número de bits en la salida de la función hash. Sin embargo, particularmente para la segunda preimagen-resistencia, este es un problema difícil. [ cita requerida ]
Un uso común de las funciones de compresión unidireccionales es la construcción Merkle-Damgård dentro de las funciones hash criptográficas. Las funciones hash más utilizadas, incluidas MD5 , SHA-1 (que está en desuso [2] ) y SHA-2 utilizan esta construcción.
Una función hash debe poder procesar un mensaje de longitud arbitraria en una salida de longitud fija. Esto se puede lograr dividiendo la entrada en una serie de bloques de igual tamaño y operando en ellos en secuencia usando una función de compresión unidireccional. La función de compresión puede diseñarse especialmente para hash o construirse a partir de un cifrado de bloque.
El último bloque procesado también debe tener una longitud acolchada , esto es crucial para la seguridad de esta construcción. Esta construcción se llama construcción Merkle-Damgård . Las funciones hash más utilizadas, incluidas SHA-1 y MD5 , adoptan esta forma.
Cuando se aplica el relleno de longitud (también llamada MD-refuerzo), los ataques no pueden encontrar colisiones más rápido que la paradoja del cumpleaños ( , siendo el tamaño de bloque en bits) si la función utilizada es resistente a colisiones. [3] [4] Por lo tanto, la construcción de hash Merkle-Damgård reduce el problema de encontrar una función hash adecuada para encontrar una función de compresión adecuada.
Un segundo ataque de preimagen (dado un mensaje, un atacante encuentra otro mensaje para satisfacer, se puede realizar de acuerdo con Kelsey y Schneier [5] para un mensaje de bloqueo de mensajes a tiempo . Tenga en cuenta que la complejidad de este ataque alcanza un mínimo de para mensajes largos cuándo y acerca de cuándo los mensajes son breves.
Las funciones de compresión unidireccionales a menudo se crean a partir de cifrados en bloque.
Los cifrados de bloque toman (como las funciones de compresión unidireccionales) dos entradas de tamaño fijo (la clave y el texto sin formato ) y devuelven una única salida (el texto cifrado ) que es del mismo tamaño que el texto sin formato de entrada.
Sin embargo, los cifrados de bloques modernos son solo parcialmente unidireccionales. Es decir, dado un texto sin formato y un texto cifrado, no es factible encontrar una clave que cifre el texto sin formato en el texto cifrado. Pero, dado un texto cifrado y una clave, se puede encontrar un texto plano coincidente simplemente usando la función de descifrado del cifrado en bloque. Por lo tanto, para convertir un cifrado de bloque en una función de compresión unidireccional, se deben agregar algunas operaciones adicionales.
Algunos métodos para convertir cualquier cifrado de bloque normal en una función de compresión unidireccional son Davies-Meyer, Matyas-Meyer-Oseas, Miyaguchi-Preneel (funciones de compresión de longitud de bloque simple) y MDC-2, MDC-4, Hirose (doble -Funciones de compresiones de longitud de bloque).
Las funciones de compresión de longitud de bloque único dan salida a la misma cantidad de bits que procesa el cifrado de bloque subyacente. En consecuencia, las funciones de compresión de longitud de bloque doble producen el doble de bits.
Si un cifrado de bloque tiene un tamaño de bloque de, digamos, 128 bits, los métodos de longitud de bloque único crean una función hash que tiene un tamaño de bloque de 128 bits y produce un hash de 128 bits. Los métodos de longitud de bloque doble hacen hash con el doble del tamaño de hash en comparación con el tamaño de bloque del cifrado de bloque utilizado. Por lo tanto, un cifrado de bloque de 128 bits se puede convertir en una función hash de 256 bits.
Estos métodos se utilizan luego dentro de la construcción Merkle-Damgård para construir la función hash real. Estos métodos se describen en detalle más abajo.
El uso de un cifrado de bloque para construir la función de compresión unidireccional para una función hash suele ser algo más lento que usar una función de compresión unidireccional especialmente diseñada en la función hash. Esto se debe a que todas las construcciones seguras conocidas realizan la programación clave para cada bloque del mensaje. Black, Cochran y Shrimpton han demostrado que es imposible construir una función de compresión unidireccional que realice una sola llamada a un cifrado de bloque con una clave fija. [6] En la práctica, se alcanzan velocidades razonables siempre que la programación clave del cifrado de bloque seleccionado no sea una operación demasiado pesada.
Pero, en algunos casos, es más fácil porque una sola implementación de un cifrado de bloque se puede usar tanto para un cifrado de bloque como para una función hash. También puede ahorrar espacio en el código en sistemas integrados muy pequeños como, por ejemplo, tarjetas inteligentes o nodos en automóviles u otras máquinas.
Por lo tanto, la tasa de hash o tasa da una idea de la eficiencia de una función de hash basada en una determinada función de compresión. La tasa de una función hash iterada describe la relación entre el número de operaciones de cifrado de bloques y la salida. Más precisamente, la tasa representa la relación entre el número de bits procesados de entrada , la longitud de bits de salida del cifrado de bloque y las operaciones de cifrado de bloque necesarias para producir estos bits de salida. Generalmente, el uso de menos operaciones de cifrado de bloques da como resultado un mejor rendimiento general de toda la función hash, pero también conduce a un valor hash más pequeño que podría ser indeseable. La tasa se expresa mediante la fórmula:
La función hash solo se puede considerar segura si se cumplen al menos las siguientes condiciones:
Las construcciones que se presentan a continuación: Davies-Meyer, Matyas-Meyer-Oseas, Miyaguchi-Preneel e Hirose han demostrado ser seguras bajo el análisis de caja negra . [7] [8] El objetivo es demostrar que cualquier ataque que se pueda encontrar es tan eficaz como el ataque de cumpleaños.bajo ciertos supuestos. El modelo de caja negra asume que se usa un cifrado de bloque que se elige al azar de un conjunto que contiene todos los cifrados de bloque apropiados. En este modelo, un atacante puede cifrar y descifrar libremente cualquier bloque, pero no tiene acceso a una implementación del cifrado de bloque. La función de cifrado y descifrado está representada por oráculos que reciben un par de un texto plano y una clave o un texto cifrado y una clave. Luego, los oráculos responden con un texto plano o cifrado elegido al azar, si se le preguntó al par por primera vez. Ambos comparten una tabla para estos tripletes, un par de la consulta y la respuesta correspondiente, y devuelven el registro si se recibió una consulta por segunda vez. Para la prueba, hay un algoritmo de búsqueda de colisiones que realiza consultas elegidas al azar a los oráculos. El algoritmo devuelve 1,si dos respuestas dan como resultado una colisión que involucra la función hash que se construye a partir de una función de compresión que aplica este cifrado de bloque (0 más). La probabilidad de que el algoritmo devuelva 1 depende del número de consultas que determinan el nivel de seguridad.
La función de compresión de longitud de bloque único de Davies-Meyer alimenta cada bloque del mensaje ( ) como clave para un cifrado de bloque. Alimenta el valor hash anterior ( ) como texto sin formato que se va a cifrar. El texto cifrado de salida también se XORed (⊕) con el valor hash anterior ( ) para producir el siguiente valor hash ( ). En la primera ronda, cuando no hay un valor hash previo, usa un valor inicial preestablecido constante ( ).
En notación matemática, Davies-Meyer se puede describir como:
El esquema tiene la tasa (k es el tamaño de la clave):
Si el cifrado de bloques utiliza, por ejemplo, claves de 256 bits, entonces cada bloque de mensaje ( ) es una parte del mensaje de 256 bits. Si el mismo cifrado de bloque usa un tamaño de bloque de 128 bits, entonces los valores hash de entrada y salida en cada ronda son 128 bits.
Las variaciones de este método reemplazan XOR con cualquier otra operación de grupo, como la suma de enteros sin signo de 32 bits.
Una propiedad notable de la construcción de Davies-Meyer es que incluso si el cifrado de bloque subyacente es totalmente seguro, es posible calcular puntos fijos para la construcción: para cualquiera , uno puede encontrar un valor de tal que : uno solo tiene que establecer . [9] Esta es una propiedad que las funciones aleatorias ciertamente no tienen. Hasta ahora, ningún ataque práctico se ha basado en esta propiedad, pero se debe tener en cuenta esta "característica". Los puntos fijos se pueden usar en un segundo ataque de preimagen (dado un mensaje , el atacante encuentra otro mensaje para satisfacer a Kelsey y Schneier [5] para un mensaje de bloqueo de -mensaje en el tiempo. Si la construcción no permite la creación fácil de puntos fijos (como Matyas – Meyer – Oseas o Miyaguchi – Preneel), este ataque se puede realizar a tiempo. Tenga en cuenta que en ambos casos la complejidad está por encima pero por debajo cuando los mensajes son largos y que cuando los mensajes se acortan, la complejidad del ataque se aproxima .
La seguridad de la construcción Davies-Meyer en el modelo de cifrado ideal fue probada por primera vez por R. Winternitz. [10]
La función de compresión unidireccional de longitud de bloque único de Matyas-Meyer-Oseas se puede considerar la dual (lo opuesto) de Davies-Meyer.
Alimenta cada bloque del mensaje ( ) como texto sin formato a cifrar. El texto cifrado de salida también se XORed (⊕) con el mismo bloque de mensaje ( ) para producir el siguiente valor hash ( ). El valor hash anterior ( ) se alimenta como clave para el cifrado de bloque. En la primera ronda, cuando no hay un valor hash previo, usa un valor inicial preestablecido constante ( ).
Si el cifrado de bloque tiene diferentes tamaños de bloque y clave, el valor hash ( ) tendrá el tamaño incorrecto para usarlo como clave. El cifrado también puede tener otros requisitos especiales en la clave. Luego, el valor hash se alimenta primero a través de la función que se convertirá / rellenará para que se ajuste como clave para el cifrado.
En notación matemática, Matyas-Meyer-Oseas se puede describir como:
El esquema tiene la tarifa:
Un segundo ataque de preimagen (dado un mensaje, un atacante encuentra otro mensaje para satisfacer ) se puede realizar de acuerdo con Kelsey y Schneier [5] para un mensaje de bloqueo de -mensaje en el tiempo . Tenga en cuenta que la complejidad está por encima pero por debajo cuando los mensajes son largos, y que cuando los mensajes se acortan, la complejidad del ataque se aproxima .
La función de compresión unidireccional de longitud de bloque único Miyaguchi – Preneel es una variante extendida de Matyas – Meyer – Oseas. Fue propuesto de forma independiente por Shoji Miyaguchi y Bart Preneel .
Alimenta cada bloque del mensaje ( ) como texto sin formato a cifrar. El texto cifrado de salida es luego XORed (⊕) con el mismo bloque de mensaje ( ) y luego también XORed con el valor hash anterior ( ) para producir el siguiente valor hash ( ). El valor hash anterior ( ) se alimenta como clave para el cifrado de bloque. En la primera ronda, cuando no hay un valor hash previo, usa un valor inicial preestablecido constante ( ).
Si el cifrado de bloque tiene diferentes tamaños de bloque y clave, el valor hash ( ) tendrá el tamaño incorrecto para usarlo como clave. El cifrado también puede tener otros requisitos especiales en la clave. Luego, el valor hash se alimenta primero a través de la función que se convertirá / rellenará para que se ajuste como clave para el cifrado.
En notación matemática, Miyaguchi – Preneel se puede describir como:
El esquema tiene la tarifa:
Los roles de y pueden cambiarse, de modo que se encripta bajo la clave , lo que convierte a este método en una extensión de Davies-Meyer.
Un segundo ataque de preimagen (dado un mensaje, un atacante encuentra otro mensaje para satisfacer ) se puede realizar de acuerdo con Kelsey y Schneier [5] para un mensaje de bloqueo de -mensaje en el tiempo . Tenga en cuenta que la complejidad está por encima pero por debajo cuando los mensajes son largos, y que cuando los mensajes se acortan, la complejidad del ataque se aproxima .
La función de compresión unidireccional de longitud de bloque doble de Hirose [8] consta de un cifrado de bloque más una permutación . Fue propuesto por Shoichi Hirose en 2006 y se basa en un trabajo [11] de Mridul Nandi .
Utiliza un cifrado de bloque cuya longitud de clave es mayor que la longitud del bloque y produce un hash de tamaño . Por ejemplo, cualquiera de los candidatos AES con una clave de 192 o 256 bits (y bloque de 128 bits).
Cada ronda acepta una parte del mensaje que tiene una longitud de bits y la usa para actualizar los valores de estado de dos bits y .
Primero, se concatena con para producir una clave . Luego, los dos valores de retroalimentación se actualizan de acuerdo con:
es una permutación arbitraria de punto fijo libre en un valor de -bit, típicamente definido como para una constante arbitraria distinta de cero (todos unos pueden ser una opción conveniente).
Cada cifrado se asemeja a la construcción estándar de Davies-Meyer. La ventaja de este esquema sobre otros esquemas propuestos de doble longitud de bloque es que ambos cifrados usan la misma clave y, por lo tanto, se puede compartir el esfuerzo de programación de claves.
La salida final es . El esquema tiene la tasa relativa al cifrado del mensaje con el cifrado.
Hirose también proporciona una prueba en el modelo de cifrado ideal.
La construcción de esponja se puede utilizar para construir funciones de compresión unidireccionales.