title: Ataque de cumpleaños
text: # Ataque de cumpleaños
  
  Un ataque de cumpleaños (o, en inglés, birthday attack) es un tipo de ataque criptográfico que se basa en la matemática detrás de la paradoja del cumpleaños, haciendo uso de una situación de compromiso espacio-tiempo informática. Concretamente, si una función matemática produce $H$ resultados diferentes igualmente probables y $H$ es lo suficientemente grande, entonces, después de evaluar la función sobre $1.2{\sqrt {H}}$ argumentos distintos, se espera encontrar un par de argumentos $x_{1}$ y $x_{2}$ diferentes de manera tal que $f(x_{1})=f(x_{2})$, hecho conocido como una colisión.
  
  # Ataque de cumpleaños
  ## La matemática
  
  Para demostrar el resultado anterior, comenzamos con el desarrollo en series de Taylor de la probabilidad de que dos personas cumplan los años en el mismo día. En este caso, reemplazamos el número de días en un año con el número de resultados únicos, $H$:
         $p(n)=1-{\bar {p}}(n)\approx 1-e^{-(n(n-1))/2\cdot H}\approx 1-e^{-n^{2}/{2\cdot H}},$
  donde $n$ es el número de intentos para una colisión. Invirtiendo esta expresión,
         $n(p)\approx {\sqrt {2\cdot H\cdot \ln \left({1 \over 1-p}\right)}},$
  y asignando una probabilidad de colisión de 0.5 (condición de que sea tan posible como imposible), llegamos a
         $n(0.5)=1.1774{\sqrt {H}}$.
  Como ejemplo, si se usa un hash de 64 bits, habrá aproximadamente 1.8 × 10$^{19}$ resultados distintos. Si todas son igualmente probables (el mejor de los casos), entonces tomaría solamente unos 5.1 × 10$^9$ intentos aproximadamente generar una colisión usando fuerza bruta. Otros ejemplos son como se muestra a continuación:
         Bits Salidas posibles Probabilidad deseada de colisiones aleatorias 10$^{-12}$ 10$^{-9}$ 10$^{-6}$ 0.1% 1% 25% 50% 75% 64 1.8 × 10$^{19}$ 6.1 × 10$^3$ 1.9 × 10$^5$ 6.1 × 10$^6$ 1.9 × 10$^8$ 6.1 × 10$^8$ 3.3 × 10$^9$ 5.1 × 10$^9$ 7.2 × 10$^9$ 128 3.4 × 10$^{38}$ 2.6 × 10$^{13}$ 8.2 × 10$^{14}$ 2.6 × 10$^{16}$ 8.3 × 10$^{17}$ 2.6 × 10$^{18}$ 1.4 × 10$^{19}$ 2.2 × 10$^{19}$ 3.1 × 10$^{19}$ 256 1.2 × 10$^{77}$ 4.8 × 10$^{32}$ 1.5 × 10$^{34}$ 4.8 × 10$^{35}$ 1.5 × 10$^{37}$ 4.8 × 10$^{37}$ 2.6 × 10$^{38}$ 4.0 × 10$^{38}$ 5.7 × 10$^{38}$ 384 3.9 × 10$^{115}$ 8.9 × 10$^{51}$ 2.8 × 10$^{53}$ 8.9 × 10$^{54}$ 2.8 × 10$^{56}$ 8.9 × 10$^{56}$ 4.8 × 10$^{57}$ 7.4 × 10$^{57}$ 1.0 × 10$^{58}$ 512 1.3 × 10$^{154}$ 1.6 × 10$^{71}$ 5.2 × 10$^{72}$ 1.6 × 10$^{74}$ 5.2 × 10$^{75}$ 1.6 × 10$^{76}$ 8.8 × 10$^{76}$ 1.4 × 10$^{77}$ 1.9 × 10$^{77}$
         Esta tabla muestra el número de hashes que son necesarios para alcanzar la probabilidad de éxito dada, asumiendo que todos los hashes son igualmente probables
  Es fácil ver que si los resultados de la función no están distribuidas uniformemente (es decir, si no son igualmente probables), entonces las colisiones pueden ser halladas mucho más rápidamente. La noción de 'balance' de una función de hash cuantifica la resistencia de la función a ataques de cumpleaños y permite que se estime la vulnerabilidad de funciones de hash populares, tales como MD5 y SHA (Bellare y Kohno, 2004).
  Las firmas digitales pueden ser susceptibles de un ataque de cumpleaños. Un mensaje $m$ típicamente se firma computando primero $f(m)$, donde $f$ es una función de hash criptográfica y luego se usa alguna clave secreta para firmar $f(m)$. Supongamos que Alice quiere engañar a Bob para que firme un contrato fraudulento. Alice prepara un contrato bueno $m$ y uno malo $m'$. Así, ella busca un número de posiciones donde $m$ pueda ser modificado sin cambiar el significado, como por ejemplo insertando comas, líneas en blanco, cambiando el espaciado entre oraciones, usando sinónimos, etc. Combinando estos cambios, Alice podría crear un número inmenso de variaciones de $m$, todas ellas contratos buenos. De manera similar, podría crear un número inmenso de contratos fraudulentos $m'$. Entonces, ella aplica una función de hash a todas esas variaciones hasta que encuentre una versión del contrato bueno y otra del malo que posean el mismo valor hash, $f(m)=f(m')$. Luego, le presenta la versión buena a Bob para que la firme. Una vez que Bob la firma, Alice toma la firma y se la adjunta al contrato fraudulento. Las firma digital "prueba" entonces que Bob firmó el contrato fraudulento. (Nota: este esquema difiere levemente del problema original del cumpleaños, pues Alice no gana nada por encontrar dos contratos buenos o dos contratos fraudulentos que producen el mismo hash; sin embargo, en este esquema las probabilidades son sorprendentemente altas.)
  Para impedir este ataque, la longitud de los resultados de la función hash deben ser lo suficientemente grandes de manera que el ataque de cumpleaños se torne computacionalmente imposible, por ejemplo, unas dos veces más grande de lo que se requeriría para prevenir un ataque de fuerza bruta. También se ha recomendado que Bob realice cambios menores en cualquier documento que le sea presentado para ser firmado. Sin embargo, esto no resuelve el problema, porque ahora Alice sospecha que Bob intenta usar un ataque de cumpleaños.
  El ataque de cumpleaños puede ser usado para acelerar el cómputo de logaritmos discretos. Supongamos que $x$ e $y$ son elementos de un grupo y que $y$ es una potencia de $x$. Queremos encontrar el exponente de $x$ que da $y$. Un ataque de cumpleaños computa $x^{r}$ para varios enteros $r$ elegidos aleatoriamente y computa $yx^{-s}$ para varios enteros $s$ elegidos aleatoriamente. Pasado un tiempo, se encontrará un par $x^{r}=yx^{-s}$, lo que significa que $y=x^{r+s}$.
  Si el grupo tiene $n$ elementos, el método más simple de probar todos los exponentes toma alrededor $n/2$ intentos en promedio. El ataque de cumpleaños es considerablemente más rápido e implica menos de $2{\sqrt {n}}$ intentos en promedio.
  Existen técnicas basadas en repetición iterativa que pueden reducir considerablemente los requerimientos de almacenamiento de los ataques de cumpleaños.
  
  # Ataque de cumpleaños
  ## Ejemplo
  
  El siguiente es un ejemplo de como crear variaciones de una carta sin alterar el contenido.
  Seleccionando entre una de las dos opciones que se presentan, se puede crear 2$^{24}$ mensajes distintos. Normalmente los procesadores de texto pueden configurarse para generar documentos de esta manera.