Hasta ahora hemos visto cifrados de bloque y de flujo en esta serie, incluyendo ejemplos de ellos. Antes de entrar en la criptografía asimétrica quiero explicar un poco acerca de las funciones resumen (o hash) criptográficas. Trataremos las funciones hash en general y la familia SHA-2 como un ejemplo de ellas.
Tened en cuenta que en esta serie de posts generalmente obviaré el adjetivo
criptográficas, pero siempre me referiré a funciones resumen criptográficas y nunca a funciones resumen
genéricas. Y como siempre, para nada se trata de posts completos sino que simplemente intentaré proporcionar un entendimiento básico de qué son las funciones hash y qué pinta tienen.
Además, debo decir que nunca he estudiado las funciones hash en demasiada profundidad, así que esto servirá también como recordatorio para mi mismo. Si hay algo que no es todo lo correcto que se desearía, hacedmelo saber en los comments

.
Funciones Hash Criptográficas: propiedades
Una función hash criptográfica se define como una serie de operaciones sobre un mensaje de entrada de tamaño arbitrario, que producen una salida de tamaño fijo (hash o resumen criptográfico del mensaje) de forma que un cambio en el mensaje no pueda pasar inadvertido. Debe ser sencillo calcular un hash a partir de un mensaje, pero dado un hash debería ser computacionalmente inviable encontrar un mensaje que lo produzca. Además, dado un mensaje debería ser inviable encontrar un segundo mensaje con el mismo hash y, como ya he dicho, debería ser inviable modificar un mensaje sin que se modifique su hash.
Por tanto, las propiedades que una función hash debe cumplir son:
- Resistencia pre-imagen: dado un hash h, debe ser inviable encontrar un mensaje m tal que h=hash(m). De lo contrario, la función hash sería vulnerable a ataques de pre-imagen.
- Resistencia a segunda pre-imagen: dado un mensaje
debería ser inviable encontrar un segundo mensaje,
, que produzca el mismo hash. Es decir, dado
debería ser difícil encontrar
tal que
. En caso contrario, se dice que la función es vulnerable a ataques de segunda pre-imagen.
- Resistencia a colisiones: Debería ser difícil encontrar dos mensajes con el mismo hash. Obviamente, dado una función hash con una salida de n bits, si probamos
mensajes seguro que encontraremos dos con el mismo hash. La teoría acerca de los ataques de cumpleaños nos dice que para un hash de n bits deberíamos probar unos
mensajes distintos para encontrar una colisión. Este número se conoce como la cota del cumpleaños (en inglés birthday bound).
Estructura típica de una función hash
Una función hash consiste típicamente de una función de compresión que toma bloques de datos de un tamaño fijo como entrada y produce bloques de un tamaño fijo (el tamaño de salida de la función hash). Adicionalmente, la salida del bloque previo es mandada como entrada junto con el bloque siguiente, de forma que la salida depende de todos los bloques previos. Si no se hiciera así, el hash solo sería función del último bloque

.

Construcción Merkle-Damgard
Esta estructura es conocida como construcción Merkle-Damgård, y las funciones hash más populares están basadas en esta construcción. Sin embargo, otras alternativas existan y muchas de las propuestas para el concurso SHA-3 están basadas en otras construcciones.
La familia SHA-2
Aunque MD5 y SHA-1 son mucho más populares, he decidido ojear y describir aquí la estructura de la familia de funciones hash SHA-2. La razón para ello es que MD5 fue roto hace tiempo, primero por el equipo de la dra. Wang y luego por un grupo de investigadores que incluía al dr. Benne de Weger. Ya hablé de ello
aquí 
.
Además, SHA-1 es muy similar a MD5 y se cree que padece el mismo tipo de problemas. Por tanto, he elegido tratar la siguiente familia de funciones hash, la familia SHA-2. Esta familia incluye varias funciones hash con distintos tamaños de salida: SHA-224, SHA-256, SHA-384 y SHA-512, donde el número define el número de bits de salida.
SHA-256 y SHA-512 utilizan tamaños de palabra de 32 y 64 bits respectivamente, mientras que SHA-224 y SHA-384 son versiones truncadas de las primeras. En esta sección explicaré SHA-256 puesto que la estructura de SHA-512 es básicamente la misma pero con distintos tamaños de palabra y valores iniciales.
Básicamente, el mensaje de entrada se divide en bloques de 512 bits,

, y se le añade información adicional que incluye la longitud del mensaje original. Para cada uno de estos bloques se ejecuta un
message schedule que produce 64 variables

-
Estas 64 variables son procesadas con la función de compresión mostrada en la figura siguiente, donde las variables a..f se inicializan con valores definidos por el estándar:

Función de compresión de SHA-2
Tras este procesado, el valir intermedio del hash es obtenido como la suma (módulo 32) de las variables a..f y el valor obtenido en la iteración anterior. Este proceso se ejecuta para cada bloque del mensaje de entrada y al final se obtiene el
resumen del mensaje.
Por supuesto, esta es una descripción de muy alto nivel del algoritmo. Si estás interesado en conocer los detalles, puedes acudir al
estándar FIPS 180-2.
El concurso SHA-3
Actualmente hay un concurso abierto mantenido por NIST para crear un nuevo estándar para funciones hash, SHA-3. En este momento, el concurso se encuentra en su segunda ronda y hay 14 candidatos para esta segunda ronda. La
Second SHA-3 Candidate Conference está planificada para Agosto de 2010 y la idea es publicar una revisión del estándar de funciones hash (
Hash Function Standard) para 2012.
Puedes encontrar más información respecto al concurso y las propuestas en la web del mismo:
NIST Hash competition.
Fuente