# Código de detección de manipulaciones

Los Códigos de detección de manipulaciones son también llamados Códigos de detección de modificaciones, MDC (siglas del los dos términos ingleses válidos: Modification Detection Codes y Manipulation Detection Codes), Código de integridad de mensajes y MIC (siglas del inglés Message Integrity Codes). Un código de detección de modificaciones es una función hash criptográfica sin clave secreta que puede ser usada para detectar cualquier modificación de la cadena a la cual se aplique, ya sea esta modificación accidental o malintencionada. Por tanto las MDC permiten proteger la integridad de la información.
El modo de funcionamiento consiste en calcular el valor hash de la cadena y que este sirva como evidencia para la verificación de si la cadena ha sido modificada o no.
Para cumplir su objetivo la función hash tiene que cumplir propiedades que la hagan resistente frente ataques de adversarios maliciosos cuyo objetivo es que la función no cumpla con su cometido. Según las propiedades que se exijan podemos distinguir dos tipos de códigos de detección de modificaciones:
* Las que requieren que la función hash sea OWHF. Por tanto es difícil encontrar un mensaje que tenga un valor hash pre-especificado.
* Las que requieren que la función hash sea CRHF. Por tanto es difícil encontrar dos mensajes con el mismo valor hash.

## Métodos de construcción

Atendiendo a en que basan su algoritmo podemos clasificar los códigos de detección de modificaciones en:

### Basadas en aritmética modular

Estos códigos de detección de modificaciones basan su construcción y por tanto su seguridad en la dificultad de problemas de la aritmética modular. Al poder cambiar fácilmente el valor de referencia con el que se calcula el módulo, es fácil variar la longitud de las cadenas de salida. Estas funciones aprovechan la facilidad de implementación de la función módulo. Suelen ser muy lentos comparados con otro tipo de construcciones.Ejemplo de este tipo de algoritmos es MASH-1 (Modular Arithmetic Secure Hash Algorithm-1).

### Basadas en cifradores de bloque

Este tipo de códigos de detección de modificaciones basan su construcción en la reutilización de cifradores de bloque. De esta forma se minimiza el esfuerzo de diseño e implementación y además aprovechan la fiabilidad en la seguridad de esos cifradores para transformar en seguridad en la función hash. En general suelen ser lentos comparados con las llamadas funciones hash dedicadas.
Los siguientes esquemas son los más habituales:
* Davies-Meyer(DM): $H_{i}=E_{Mi}(Hi-1)\oplus H_{i-1}$
* Matyas-Meyer-Oseas (MMO): $H_{i}=E_{Hi-1}(M_{i})\oplus M_{i}$
* Miyaguchi-Preenel: $H_{i}=E_{Hi-1}(M_{i})\oplus M_{i}\oplus H_{i-1}$
Donde:
* $\oplus$ representa al xor
* $E_{A}(B)$ representa a aplicar el cifrador de bloque E con la clave A sobre el dato B.
* $M_{i}$ es el bloque i del mensaje al que se le aplica la función hash en cada paso.
* $H_{i-1}$ es el valor hash obtenido en el paso previo al paso i.

### Funciones hash dedicadas

Son códigos de detección de modificaciones especialmente diseñadas desde el principio para este propósito teniendo en cuenta que tengan un rendimiento optimizado y sin tener que reutilizar componentes previamente construidos. Estas funciones no están basadas en problemas difíciles como factorización o logaritmos discretos. Suelen ser construidas usando la construcción de Merkle-Damgård.
Ejemplos: MD2, MD4, MD5, SHA-1, SHA-2, SHA-3, TIGER, HAVAL, RIPEMD, RIPEMD-160, HAIFA, FORK256 y WHIRLPOOL

## Ataques

Los código de detección de manipulaciones son sometidos a distintos tipos de ataques. Cada tipo tiene como objetivo debilitar la seguridad desde un punto de vista distintos. Los principales son los siguiente:
* Ataque de colisiones.- Se llama ataque de colisiones al proceso de encontrar dos valores arbitrarios cuyos hashes colisionan. Por tanto se ataca la resistencia a colisiones de la función hash.
* Ataque preimagen.- Se llama ataque preimagen al proceso de encontrar un valor arbitrario cuyo hash colisione con otro hash dado. Por tanto se ataca la resistencia a preimagen de la función hash. Ejemplos exitosos de este tipo de ataques se han hecho utilizando o apoyándose en estrategias meet in the middle.
Un ataque preimagen exitoso es mucho más serio que un ataque de colisiones exitoso ya que la seguridad de muchas de las aplicaciones que emplean este tipo de funciones están basada en la resistencia a preimagen. Además romper la resistencia a preimagen implica muchas veces romper la resistencia a colisiones.
En el estudio de las colisiones son importantes:
* Principio de Dirichlet también llamado Principio del palomar.
* Paradoja del cumpleaños.