SlideShare una empresa de Scribd logo
Algoritmo MD5

¿Qué es MD5?


MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor
Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de
Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después
de que Hans Dobbertin descubriese su debilidad.

A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados
desde que, en 1996, Hans Dobbertin anunciase una colisión de hash plantea una serie de
dudas acerca de su uso futuro.

Colision de hash:


En informática, una colisión de hash es una situación que se produce cuando dos
entradas distintas a una función de hash producen la misma salida.

Es matemáticamente imposible que una función de hash carezca de colisiones, ya que el
número potencial de posibles entradas es mayor que el número de salidas que puede
producir un hash. Sin embargo, las colisiones se producen más frecuentemente en los
malos algoritmos. En ciertas aplicaciones especializadas con un relativamente pequeño
número de entradas que son conocidas de antemano es posible construir una función de
hash perfecta, que se asegura que todas las entradas tengan una salida diferente. Pero en
una función en la cual se puede introducir datos de longitud arbitraria y que devuelve un
hash de tamaño fijo (como MD5), siempre habrá colisiones, dado que un hash dado
puede pertenecer a un infinito número de entradas.

Una de las propiedades deseables de las funciones de hash criptográficas es que sea
computacionalmente imposible que se produzca una colisión. El valor de una función
hash puede ser usado para certificar que un texto dado (o cualquier otro dato) no ha sido
modificado, publicando el valor firmado de la función de hash si no es factible que se
produzca una colisión. En este contexto, factible se refiere a cualquier método capaz de
producirla más rápido que un ataque de cumpleaños de fuerza bruta.

El proceso de encontrar dos valores arbitrarios cuyos hashes collisionan se llama ataque
de colisiones. El proceso de encontrar un valor arbitrario cuyo hash colisione con otro
hash dado se llama ataque preimagen. Un ataque preimagen exitoso es mucho más serio
que un ataque de colisiones exitoso.

   •   Hashing Perfecto: Existe una Función de Enumeración que asigna a cada valor
       del dominio una única posición de memoria. No posee colisiones.
   •   Hashing Puro: La función de Hash puede asignar a dos valores distintos el
       mismo lugar en memoria.             y h(x1) = h(x2). Estos dos valores reciben el
       nombre de sinónimos. Las estructuras de hashing puros poseen colisiones y en
       consecuencia se deberán establecer mecanismos para tratar los mismos.
       Podemos clasificarlos en estructuras cerradas y abiertas y dentro de las abiertas
       en estáticas y dinámicas:
o   Cerradas: No utilizan un nuevo espacio en memoria.
             o   Abiertas: Utilizan espacio adicional.
                     Estática: La estructura principal no crece.
                     Dinámica: La estructura principal se expande a medida que
                       aumenta la cantidad de elementos.


Codificación:


La codificación del MD5 de 128 bits es representada típicamente como un número de
32 dígitos hexadecimal. El siguiente código de 28 bytes ASCII será tratado con MD5 y
veremos su correspondiente hash de salida:

   MD5("Esto sí es una prueba de MD5") =
e99008846853ff3b725c27315e469fbc

Un simple cambio en el mensaje nos da un cambio total en la codificación hash, en este
caso cambiamos dos letras, el «sí» por un «no».

   MD5("Esto no es una prueba de MD5") =
dd21d99a468f3bb52a136ef5beef5034

Otro ejemplo sería la codificación de un campo vacío:

   MD5("") = d41d8cd98f00b204e9800998ecf8427e

Algoritmo:


   •   Terminologías y notaciones

En este documento "palabra" es una entidad de 32 bits y byte es una entidad de 8 bits.
Una secuencia de bits puede ser interpretada de manera natural como una secuencia de
bytes, donde cada grupo consecutivo de ocho bits se interpreta como un byte con el bit
más significativo al principio. Similarmente, una secuencia de bytes puede ser
interpretada como una secuencia de 32 bits (palabra), donde cada grupo consecutivo de
cuatro bytes se interpreta como una palabra en la que el byte menos significativo está al
principio.

   El símbolo "+" significa suma de palabras.
   X <<< s se interpreta por un desplazamiento a la izquierda 's'
posiciones
   not(x) se entiende como el complemento de x

   •   Descripción del algoritmo md5

Empezamos suponiendo que tenemos un mensaje de 'b' bits de entrada, y que nos
gustaría encontrar su resumen. Aquí 'b' es un valor arbitrario entero no negativo, pero
puede ser cero, no tiene por qué ser múltiplo de ocho, y puede ser muy largo.
Imaginemos los bits del mensaje escritos así:
m0 m1 ... m{b-1}

Los siguientes cinco pasos son efectuados para calcular el resumen del mensaje.

Paso 1. Añadiendo bits [editar]

El mensaje será extendido hasta que su longitud en bits sea congruente con 448, módulo
512. Esto es, si se le resta 448 a la longitud del mensaje tras este paso, se obtiene un
múltiplo de 512. Esta extensión se realiza siempre, incluso si la longitud del mensaje es
ya congruente con 448, módulo 512.

La extensión se realiza como sigue: un sólo bit "1" se añade al mensaje, y después bits
"0" se añaden hasta que la longitud en bits del mensaje extendido se haga congruente
con 448, módulo 512. En todos los mensajes se añade al menos un bit y como máximo
512.

Paso 2. Longitud del mensaje [editar]

Un entero de 64 bits que represente la longitud 'b' del mensaje (longitud antes de añadir
los bits) se concatena al resultado del paso anterior. En el supuesto no deseado de que 'b'
sea mayor que 2^64, entonces sólo los 64 bits de menor peso de 'b' se usarán.

En este punto el mensaje resultante (después de rellenar con los bits y con 'b') se tiene
una longitud que es un múltiplo exacto de 512 bits. A su vez, la longitud del mensaje es
múltiplo de 16 palabras (32 bits por palabra). Con M[0 ... N-1] denotaremos las palabras
del mensaje resultante, donde N es múltiplo de 16.

Paso 3. Inicializar el búfer MD [editar]

Un búfer de cuatro palabras (A, B, C, D) se usa para calcular el resumen del mensaje.
Aquí cada una de las letras A, B, C, D representa un registro de 32 bits. Estos registros
se inicializan con los siguientes valores hexadecimales, los bits de menor peso primero:

  palabra   A:   01   23   45   67
  palabra   B:   89   ab   cd   ef
  palabra   C:   fe   dc   ba   98
  palabra   D:   76   54   32   10

Paso 4. Procesado del mensaje en bloques de 16 palabras [editar]

Primero definimos cuatro funciones auxiliares que toman como entrada tres palabras de
32 bits y su salida es una palabra de 32 bits.
Los operadores                son las funciones XOR, AND, OR y NOT
respectivamente.

En cada posición de cada bit F actúa como un condicional: si X, entonces Y sino Z. La
función F podría haber sido definida usando + en lugar de v ya que XY y not(x) Z nunca
tendrán unos ('1') en la misma posición de bit. Es interesante resaltar que si los bits de
X, Y y Z son independientes y no sesgados, cada uno de los bits de F(X,Y,Z) será
independiente y no sesgado.

Las funciones G, H e I son similares a la función F, ya que actúan "bit a bit en paralelo"
para producir sus salidas de los bits de X, Y y Z, en la medida que si cada bit
correspondiente de X, Y y Z son independientes y no sesgados, entonces cada bit de
G(X,Y,Z), H(X,Y,Z) e I(X,Y,Z) serán independientes y no sesgados. Nótese que la
función H es la comparación bit a bit "xor" o función "paridad" de sus entradas.

Este paso usa una tabla de 64 elementos T[1 ... 64] construida con la función Seno.
Denotaremos por T[i] el elemento i-ésimo de esta tabla, que será igual a la parte entera
del valor absoluto del seno de 'i' 4294967296 veces, donde 'i' está en radianes.


Código del MD5:

 /* Procesar cada bloque de 16 palabras. */
para i = 0 hasta N/16-1 hacer

   /* Copiar el bloque 'i' en X. */
   para j = 0 hasta 15 hacer
     hacer X[j] de M[i*16+j].
   fin para /* del bucle 'j' */

 /*   Guardar A como AA, B como BB, C como CC, y D como DD. */
 AA   = A
 BB   = B
 CC   = C
 DD   = D

 /* Ronda 1. */
 /* [abcd k s i] denotarán la operación
      a = b + ((a + F(b, c, d) + X[k] + T[i]) <<< s). */
 /* Hacer las siguientes 16 operaciones. */
 [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3                         22 4]
 [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7                         22 8]
 [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11                     22 12]
 [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15                  22 16]

 /* Ronda 2. */
 /* [abcd k s i] denotarán la operación
     a = b + ((a + G(b, c, d) + X[k] + T[i])             <<< s). */
 /* Hacer las siguientes 16 operaciones. */
 [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14                 19]   [BCDA 0    20   20]
 [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14                23]   [BCDA 4    20   24]
 [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14                 27]   [BCDA 8    20   28]
 [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14                 31]   [BCDA 12   20   32]

 /* Ronda 3. */
 /* [abcd k s t] denotarán la operación
a = b + ((a + H(b, c, d) + X[k] + T[i])            <<< s). */
 /* Hacer las siguientes 16 operaciones. */
 [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16               35]   [BCDA 14 23 36]
 [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16                39]   [BCDA 10 23 40]
 [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16               43]   [BCDA 6 23 44]
 [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16              47]   [BCDA 2 23 48]

 /* Ronda 4. */
 /* [abcd k s t] denotarán la operación
     a = b + ((a + I(b, c, d) + X[k] + T[i])            <<< s). */
 /* Hacer las siguientes 16 operaciones. */
 [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15               51]   [BCDA 5 21    52]
 [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15              55]   [BCDA 1 21    56]
 [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15               59]   [BCDA 13 21   60]
 [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15               63]   [BCDA 9 21    64]

 /* Ahora realizar las siguientes sumas. (Este es el incremento de
cada
     uno de los cuatro registros por el valor que tenían antes de que
     este bloque fuera inicializado.) */

    A   =   A   +   AA
    B   =   B   +   BB
    C   =   C   +   CC
    D   =   D   +   DD

 fin para /* del bucle en 'i' */

Paso 5. Salida [editar]

El resumen del mensaje es la salida producida por A, B, C y D. Esto es, se comienza el
byte de menor peso de A y se acaba con el byte de mayor peso de D.

Seguridad [editar]
A pesar de haber sido considerado criptográficamente seguro en un principio, ciertas
investigaciones han revelado vulnerabilidades que hacen cuestionable el uso futuro del
MD5. En agosto del 2004, Xiaoyun Wang, Dengguo Feng, Xuejia Lai y Hongbo Yu
anunciaron el descubrimiento de colisiones de hash para MD5. Su ataque se consumó
en una hora de cálculo con un clúster IBM P690.

Aunque dicho ataque era analítico, el tamaño del hash (128 bits) es lo suficientemente
pequeño como para que resulte vulnerable frente a ataques de 'fuerza bruta' tipo
'cumpleaños' (Ataque de cumpleaños). El proyecto de computación distribuida
MD5CRK arrancó en marzo del 2004 con el propósito de demostrar que MD5 es
inseguro frente a uno de tales ataques, aunque acabó poco después del aviso de la
publicación de la vulnerabilidad del equipo de Wang.

Debido al descubrimiento de métodos sencillos para generar colisiones de hash, muchos
investigadores recomiendan su sustitución por algoritmos alternativos tales como SHA-
1 o RIPEMD-160.

Aplicaciones [editar]
Los resúmenes MD5 se utilizan extensamente en el mundo del software para
proporcionar la seguridad de que un archivo descargado de Internet no se ha alterado.
Comparando una suma MD5 publicada con la suma de comprobación del archivo
descargado, un usuario puede tener la confianza suficiente de que el archivo es igual
que el publicado por los desarrolladores. Esto protege al usuario contra los 'Caballos de
Troya' o 'Troyanos' y virus que algún otro usuario malicioso pudiera incluir en el
software. La comprobación de un archivo descargado contra su suma MD5 no detecta
solamente los archivos alterados de una manera maliciosa, también reconoce una
descarga corrupta o incompleta.

Para comprobar la integridad de un archivo descargado de Internet se puede utilizar una
herramienta MD5 para comparar la suma MD5 de dicho archivo con un archivo
MD5SUM con el resumen MD5 del primer archivo. En los sistemas UNIX, el comando
de md5sum es un ejemplo de tal herramienta. Además, también está implementado en el
lenguaje de scripting PHP como MD5("") entre otros.

En sistemas UNIX y GNU/Linux se utiliza el algoritmo MD5 para cifrar las claves de
los usuarios. En el disco se guarda el resultado del MD5 de la clave que se introduce al
dar de alta un usuario, y cuando éste quiere entrar en el sistema se compara la entrada
con la que hay guardada en el disco duro, si coinciden, es la misma clave y el usuario
será autenticado. He ahí el problema de encontrar y generar colisiones de hash a
voluntad.

El MD5 también se puede usar para comprobar que los correos electrónicos no han sido
alterados usando claves públicas y privadas.

Implementación:


/*********************************************************************
********
 * md5.js
 *
 * A JavaScript implementation derived from the RSA Data Security,
Inc. MD5
 * Message-Digest Algorithm. See
http://cw.oaktree.co.uk/site/legal.html for
 * details.
 *
 * Copyright (C) Paul Johnston 1999 - 2000. Distributed under the
LGPL.
 *********************************************************************
********/

/* to convert strings to a list of ascii values */
var sAscii = " !"#$%&'()*+,-.
/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var sAscii = sAscii + "[]^_`abcdefghijklmnopqrstuvwxyz{|}~";

/* convert integer to hex string */
var sHex = "0123456789ABCDEF";
function hex(i)
{
  h = "";
  for(j = 0; j <= 3; j++)
{
        h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
             sHex.charAt((i >> (j * 8)) & 0x0F);
    }
    return h;
}

/* add, handling overflows correctly */
function add(x, y)
{
  return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^
(y&0x80000000);
}

/* MD5 rounds functions */
function R1(A, B, C, D, X, S, T)
{
  q = add(add(A, (B & C) | ((~B) & D)), add(X, T));
  return add((q << S) | (q >>> (32 - S)), B);
}

function R2(A, B, C, D, X, S, T)
{
  q = add(add(A, (B & D) | (C & (~D))), add(X, T));
  return add((q << S) | (q >>> (32 - S)), B);
}

function R3(A, B, C, D, X, S, T)
{
  q = add(add(A, B ^ C ^ D), add(X, T));
  return add((q << S) | (q >>> (32 - S)), B);
}

function R4(A, B, C, D, X, S, T)
{
  q = add(add(A, C ^ (B | (~D))), add(X, T));
  return add((q << S) | (q >>> (32 - S)), B);
}

/* main entry point */
function calcMD5(sInp) {

    /* Calculate length in machine words, including padding */
    wLen = (((sInp.length + 8) >> 6) + 1) << 4;
    var X = new Array(wLen);

  /* Convert string to array of words */
  j = 4;
  for (i = 0; (i * 4) < sInp.length; i++)
  {
    X[i] = 0;
    for (j = 0; (j < 4) && ((j + i * 4) < sInp.length); j++)
    {
      X[i] += (sAscii.indexOf(sInp.charAt((i * 4) + j)) + 32) << (j *
8);
    }
  }

    /* Append padding bits and length */
    if (j == 4)
    {
X[i++] = 0x80;
}
else
{
  X[i - 1] += 0x80 << (j * 8);
}
for(; i < wLen; i++) { X[i] = 0; }
X[wLen - 2] = sInp.length * 8;

/* hard coded initial values */
a = 0x67452301;
b = 0xefcdab89;
c = 0x98badcfe;
d = 0x10325476;

/* Process each 16 word block in turn */
for (i = 0; i < wLen; i += 16) {
  aO = a;
  bO = b;
  cO = c;
  dO = d;

  a   =   R1(a,   b,   c,   d,   X[i+ 0],   7 ,   0xd76aa478);
  d   =   R1(d,   a,   b,   c,   X[i+ 1],   12,   0xe8c7b756);
  c   =   R1(c,   d,   a,   b,   X[i+ 2],   17,   0x242070db);
  b   =   R1(b,   c,   d,   a,   X[i+ 3],   22,   0xc1bdceee);
  a   =   R1(a,   b,   c,   d,   X[i+ 4],   7 ,   0xf57c0faf);
  d   =   R1(d,   a,   b,   c,   X[i+ 5],   12,   0x4787c62a);
  c   =   R1(c,   d,   a,   b,   X[i+ 6],   17,   0xa8304613);
  b   =   R1(b,   c,   d,   a,   X[i+ 7],   22,   0xfd469501);
  a   =   R1(a,   b,   c,   d,   X[i+ 8],   7 ,   0x698098d8);
  d   =   R1(d,   a,   b,   c,   X[i+ 9],   12,   0x8b44f7af);
  c   =   R1(c,   d,   a,   b,   X[i+10],   17,   0xffff5bb1);
  b   =   R1(b,   c,   d,   a,   X[i+11],   22,   0x895cd7be);
  a   =   R1(a,   b,   c,   d,   X[i+12],   7 ,   0x6b901122);
  d   =   R1(d,   a,   b,   c,   X[i+13],   12,   0xfd987193);
  c   =   R1(c,   d,   a,   b,   X[i+14],   17,   0xa679438e);
  b   =   R1(b,   c,   d,   a,   X[i+15],   22,   0x49b40821);

  a   =   R2(a,   b,   c,   d,   X[i+ 1],   5 ,   0xf61e2562);
  d   =   R2(d,   a,   b,   c,   X[i+ 6],   9 ,   0xc040b340);
  c   =   R2(c,   d,   a,   b,   X[i+11],   14,   0x265e5a51);
  b   =   R2(b,   c,   d,   a,   X[i+ 0],   20,   0xe9b6c7aa);
  a   =   R2(a,   b,   c,   d,   X[i+ 5],   5 ,   0xd62f105d);
  d   =   R2(d,   a,   b,   c,   X[i+10],   9 ,    0x2441453);
  c   =   R2(c,   d,   a,   b,   X[i+15],   14,   0xd8a1e681);
  b   =   R2(b,   c,   d,   a,   X[i+ 4],   20,   0xe7d3fbc8);
  a   =   R2(a,   b,   c,   d,   X[i+ 9],   5 ,   0x21e1cde6);
  d   =   R2(d,   a,   b,   c,   X[i+14],   9 ,   0xc33707d6);
  c   =   R2(c,   d,   a,   b,   X[i+ 3],   14,   0xf4d50d87);
  b   =   R2(b,   c,   d,   a,   X[i+ 8],   20,   0x455a14ed);
  a   =   R2(a,   b,   c,   d,   X[i+13],   5 ,   0xa9e3e905);
  d   =   R2(d,   a,   b,   c,   X[i+ 2],   9 ,   0xfcefa3f8);
  c   =   R2(c,   d,   a,   b,   X[i+ 7],   14,   0x676f02d9);
  b   =   R2(b,   c,   d,   a,   X[i+12],   20,   0x8d2a4c8a);

  a   =   R3(a,   b,   c,   d,   X[i+ 5],   4 ,   0xfffa3942);
  d   =   R3(d,   a,   b,   c,   X[i+ 8],   11,   0x8771f681);
  c   =   R3(c,   d,   a,   b,   X[i+11],   16,   0x6d9d6122);
  b   =   R3(b,   c,   d,   a,   X[i+14],   23,   0xfde5380c);
  a   =   R3(a,   b,   c,   d,   X[i+ 1],   4 ,   0xa4beea44);
d   =   R3(d,   a,   b,   c,   X[i+ 4],   11,   0x4bdecfa9);
      c   =   R3(c,   d,   a,   b,   X[i+ 7],   16,   0xf6bb4b60);
      b   =   R3(b,   c,   d,   a,   X[i+10],   23,   0xbebfbc70);
      a   =   R3(a,   b,   c,   d,   X[i+13],   4 ,   0x289b7ec6);
      d   =   R3(d,   a,   b,   c,   X[i+ 0],   11,   0xeaa127fa);
      c   =   R3(c,   d,   a,   b,   X[i+ 3],   16,   0xd4ef3085);
      b   =   R3(b,   c,   d,   a,   X[i+ 6],   23,    0x4881d05);
      a   =   R3(a,   b,   c,   d,   X[i+ 9],   4 ,   0xd9d4d039);
      d   =   R3(d,   a,   b,   c,   X[i+12],   11,   0xe6db99e5);
      c   =   R3(c,   d,   a,   b,   X[i+15],   16,   0x1fa27cf8);
      b   =   R3(b,   c,   d,   a,   X[i+ 2],   23,   0xc4ac5665);

      a   =   R4(a,   b,   c,   d,   X[i+ 0],   6 ,   0xf4292244);
      d   =   R4(d,   a,   b,   c,   X[i+ 7],   10,   0x432aff97);
      c   =   R4(c,   d,   a,   b,   X[i+14],   15,   0xab9423a7);
      b   =   R4(b,   c,   d,   a,   X[i+ 5],   21,   0xfc93a039);
      a   =   R4(a,   b,   c,   d,   X[i+12],   6 ,   0x655b59c3);
      d   =   R4(d,   a,   b,   c,   X[i+ 3],   10,   0x8f0ccc92);
      c   =   R4(c,   d,   a,   b,   X[i+10],   15,   0xffeff47d);
      b   =   R4(b,   c,   d,   a,   X[i+ 1],   21,   0x85845dd1);
      a   =   R4(a,   b,   c,   d,   X[i+ 8],   6 ,   0x6fa87e4f);
      d   =   R4(d,   a,   b,   c,   X[i+15],   10,   0xfe2ce6e0);
      c   =   R4(c,   d,   a,   b,   X[i+ 6],   15,   0xa3014314);
      b   =   R4(b,   c,   d,   a,   X[i+13],   21,   0x4e0811a1);
      a   =   R4(a,   b,   c,   d,   X[i+ 4],   6 ,   0xf7537e82);
      d   =   R4(d,   a,   b,   c,   X[i+11],   10,   0xbd3af235);
      c   =   R4(c,   d,   a,   b,   X[i+ 2],   15,   0x2ad7d2bb);
      b   =   R4(b,   c,   d,   a,   X[i+ 9],   21,   0xeb86d391);

      a   =   add(a,   aO);
      b   =   add(b,   bO);
      c   =   add(c,   cO);
      d   =   add(d,   dO);
    }
    return hex(a) + hex(b) + hex(c) + hex(d);
}


Formulario de login
<html><head><title></title>
<script language="JavaScript" src="md5.js"></script>
<script language="JavaScript">
numero = Math.random().toString();

function calculaMD5() {
var pw = document.forms["login"].elements["password"].value
pw += numero
return calcMD5(pw)
}

function enviaMD5(hash) {
document.forms["login"].elements["cifrado"].value = hash;
document.forms["login"].elements["numero"].value = numero;
document.forms["login"].submit();
}
</script>
</head>

<body>
<form action="auth.php3" method="POST" name="login">
Usuario: <input type="Text" name="usuario"><br>
Password: <input type="Password" name="password"><br>
<input type="Hidden" name="cifrado" value="">
<input type="Hidden" name="numero" value="">
<input type="Submit" value=" Login " onClick="enviaMD5(calculaMD5())">
</form>
</body></html>

Más contenido relacionado

La actualidad más candente

Conversión de un AFN a un AFD.
Conversión de un AFN a un AFD.Conversión de un AFN a un AFD.
Conversión de un AFN a un AFD.
Vikky Moscoso
 
Detección y Corrección de errores
Detección y Corrección de erroresDetección y Corrección de errores
Detección y Corrección de errores
Ronie Martínez
 
Ventajas y desventajas de moprosoft
Ventajas y desventajas de moprosoftVentajas y desventajas de moprosoft
Ventajas y desventajas de moprosoft
Chuyito Alvarado
 
Arquitectura 3 Capas
Arquitectura 3 CapasArquitectura 3 Capas
Arquitectura 3 Capas
Fani Calle
 
BúSqueda Primero En Anchura
BúSqueda Primero En AnchuraBúSqueda Primero En Anchura
BúSqueda Primero En Anchura
mapaz91
 
Examen Arquitectura de Computadoras
Examen Arquitectura de ComputadorasExamen Arquitectura de Computadoras
Examen Arquitectura de Computadoras
Erika Santos Reyes
 
Herramientas Case
Herramientas CaseHerramientas Case
Herramientas Case
Cecilia Panozo
 
Modelo requisitos UML
Modelo requisitos UMLModelo requisitos UML
Modelo requisitos UML
ramirezjaime
 
Requerimientos norma ieee830
Requerimientos norma ieee830Requerimientos norma ieee830
Requerimientos norma ieee830
Alexander Chaunay Paladines
 
Conceptos y Protocolos de Enrutamiento (Capitulo 9)
Conceptos y Protocolos de Enrutamiento (Capitulo 9)Conceptos y Protocolos de Enrutamiento (Capitulo 9)
Conceptos y Protocolos de Enrutamiento (Capitulo 9)
Cristiān Villegās
 
Protocolo de capa 6
Protocolo de capa 6Protocolo de capa 6
Protocolo de capa 6
Eduardo J Onofre
 
Métodos para la detección y corrección de errores
Métodos para la detección y corrección de erroresMétodos para la detección y corrección de errores
Métodos para la detección y corrección de errores
Daniel Huerta Cruz
 
Garantia del software aplicativo
Garantia del software aplicativoGarantia del software aplicativo
Garantia del software aplicativo
EvaluandoSoftware
 
Algoritmo aes
Algoritmo aesAlgoritmo aes
Algoritmo aes
James LexLer
 
Programación Orientada a Objetos - atributos y métodos
Programación Orientada a Objetos - atributos y métodosProgramación Orientada a Objetos - atributos y métodos
Programación Orientada a Objetos - atributos y métodos
Alvaro Enrique Ruano
 
Tipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacionTipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacion
jorge severino
 
Jose luisroisic6a 20042015
Jose luisroisic6a 20042015Jose luisroisic6a 20042015
Jose luisroisic6a 20042015
JLuis Reyes Olea
 
Los lenguajes aceptados para una maquina de turing
Los lenguajes aceptados para una maquina de turingLos lenguajes aceptados para una maquina de turing
Los lenguajes aceptados para una maquina de turing
Jonathan Bastidas
 
Origen del Modelo OSI y su impacto en als estructuras de redes
Origen del Modelo OSI y su impacto en als estructuras de redesOrigen del Modelo OSI y su impacto en als estructuras de redes
Origen del Modelo OSI y su impacto en als estructuras de redes
Kim Sorel Rush
 
Acceso a la WAN: 1. Introducción a las redes WAN
Acceso a la WAN: 1. Introducción a las redes WANAcceso a la WAN: 1. Introducción a las redes WAN
Acceso a la WAN: 1. Introducción a las redes WAN
Francesc Perez
 

La actualidad más candente (20)

Conversión de un AFN a un AFD.
Conversión de un AFN a un AFD.Conversión de un AFN a un AFD.
Conversión de un AFN a un AFD.
 
Detección y Corrección de errores
Detección y Corrección de erroresDetección y Corrección de errores
Detección y Corrección de errores
 
Ventajas y desventajas de moprosoft
Ventajas y desventajas de moprosoftVentajas y desventajas de moprosoft
Ventajas y desventajas de moprosoft
 
Arquitectura 3 Capas
Arquitectura 3 CapasArquitectura 3 Capas
Arquitectura 3 Capas
 
BúSqueda Primero En Anchura
BúSqueda Primero En AnchuraBúSqueda Primero En Anchura
BúSqueda Primero En Anchura
 
Examen Arquitectura de Computadoras
Examen Arquitectura de ComputadorasExamen Arquitectura de Computadoras
Examen Arquitectura de Computadoras
 
Herramientas Case
Herramientas CaseHerramientas Case
Herramientas Case
 
Modelo requisitos UML
Modelo requisitos UMLModelo requisitos UML
Modelo requisitos UML
 
Requerimientos norma ieee830
Requerimientos norma ieee830Requerimientos norma ieee830
Requerimientos norma ieee830
 
Conceptos y Protocolos de Enrutamiento (Capitulo 9)
Conceptos y Protocolos de Enrutamiento (Capitulo 9)Conceptos y Protocolos de Enrutamiento (Capitulo 9)
Conceptos y Protocolos de Enrutamiento (Capitulo 9)
 
Protocolo de capa 6
Protocolo de capa 6Protocolo de capa 6
Protocolo de capa 6
 
Métodos para la detección y corrección de errores
Métodos para la detección y corrección de erroresMétodos para la detección y corrección de errores
Métodos para la detección y corrección de errores
 
Garantia del software aplicativo
Garantia del software aplicativoGarantia del software aplicativo
Garantia del software aplicativo
 
Algoritmo aes
Algoritmo aesAlgoritmo aes
Algoritmo aes
 
Programación Orientada a Objetos - atributos y métodos
Programación Orientada a Objetos - atributos y métodosProgramación Orientada a Objetos - atributos y métodos
Programación Orientada a Objetos - atributos y métodos
 
Tipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacionTipos de gramatica y arboles de derivacion
Tipos de gramatica y arboles de derivacion
 
Jose luisroisic6a 20042015
Jose luisroisic6a 20042015Jose luisroisic6a 20042015
Jose luisroisic6a 20042015
 
Los lenguajes aceptados para una maquina de turing
Los lenguajes aceptados para una maquina de turingLos lenguajes aceptados para una maquina de turing
Los lenguajes aceptados para una maquina de turing
 
Origen del Modelo OSI y su impacto en als estructuras de redes
Origen del Modelo OSI y su impacto en als estructuras de redesOrigen del Modelo OSI y su impacto en als estructuras de redes
Origen del Modelo OSI y su impacto en als estructuras de redes
 
Acceso a la WAN: 1. Introducción a las redes WAN
Acceso a la WAN: 1. Introducción a las redes WANAcceso a la WAN: 1. Introducción a las redes WAN
Acceso a la WAN: 1. Introducción a las redes WAN
 

Destacado

Md5 intro 27mar
Md5 intro 27marMd5 intro 27mar
Md5 intro 27mar
MarketDeveloper
 
The MD5 hashing algorithm
The MD5 hashing algorithmThe MD5 hashing algorithm
The MD5 hashing algorithm
Bob Landstrom
 
Md5
Md5Md5
Algoritmos De Encriptacion
Algoritmos De EncriptacionAlgoritmos De Encriptacion
Algoritmos De Encriptacion
Peter Cabrera
 
Sencilla explicación sobre AES
Sencilla explicación sobre AESSencilla explicación sobre AES
Sencilla explicación sobre AES
Elvis Vinda
 
Edge detection
Edge detectionEdge detection
Edge detection
Ishraq Al Fataftah
 

Destacado (6)

Md5 intro 27mar
Md5 intro 27marMd5 intro 27mar
Md5 intro 27mar
 
The MD5 hashing algorithm
The MD5 hashing algorithmThe MD5 hashing algorithm
The MD5 hashing algorithm
 
Md5
Md5Md5
Md5
 
Algoritmos De Encriptacion
Algoritmos De EncriptacionAlgoritmos De Encriptacion
Algoritmos De Encriptacion
 
Sencilla explicación sobre AES
Sencilla explicación sobre AESSencilla explicación sobre AES
Sencilla explicación sobre AES
 
Edge detection
Edge detectionEdge detection
Edge detection
 

Similar a Algoritmo md5

Codigos..
Codigos..Codigos..
Codigos..
musmezambrano92
 
55852564 metodo-de-cross
55852564 metodo-de-cross55852564 metodo-de-cross
55852564 metodo-de-cross
Michel Rodriguez
 
15 funcioneshash
15 funcioneshash15 funcioneshash
15 funcioneshash
Roberto Moreno Doñoro
 
Codigos
Codigos Codigos
Codigos
andres cadenas
 
Congruencias
CongruenciasCongruencias
Congruencias
AlejandroUmpierrez
 
Aritmética de Computadores
Aritmética de ComputadoresAritmética de Computadores
Aritmética de Computadores
Henry Cristian Cuesta Vega
 
Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)
Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)
Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)
guffygram
 
Codigos binarios
Codigos binariosCodigos binarios
Codigos binarios
Luis Pazmiño
 
CUESTIONARIO DE PROGRAMACION I
CUESTIONARIO DE PROGRAMACION  ICUESTIONARIO DE PROGRAMACION  I
CUESTIONARIO DE PROGRAMACION I
anthonypillajo
 
Curso basico de emsamblador
Curso basico de emsambladorCurso basico de emsamblador
Curso basico de emsamblador
wigido
 
Curso básico de ensamblador
Curso básico de ensambladorCurso básico de ensamblador
Curso básico de ensamblador
Andres Justiniano De la Cruz
 
Parte 3 digitales cesar hernandez
Parte 3 digitales cesar hernandezParte 3 digitales cesar hernandez
Parte 3 digitales cesar hernandez
Cesar Hernandez
 
Cuaderno de algebra
Cuaderno de algebraCuaderno de algebra
Cuaderno de algebra
andogon
 
Curso básico de ensamblador
Curso básico de ensambladorCurso básico de ensamblador
Curso básico de ensamblador
Eduardo Alexander Hernández Rodríguez
 
Curso básico de Ensamblador
Curso básico de EnsambladorCurso básico de Ensamblador
Curso básico de Ensamblador
Spacetoshare
 
SHA-1 de 0 a #fail - Andsec 2017 - Mateo Martinez
SHA-1 de 0 a #fail - Andsec 2017 - Mateo MartinezSHA-1 de 0 a #fail - Andsec 2017 - Mateo Martinez
SHA-1 de 0 a #fail - Andsec 2017 - Mateo Martinez
Mateo Martinez
 
Mini curso assembly
Mini curso assemblyMini curso assembly
Mini curso assembly
Franciny Salles
 
Common Scrambling Algorithm al descubierto
Common Scrambling Algorithm  al descubiertoCommon Scrambling Algorithm  al descubierto
Common Scrambling Algorithm al descubierto
ronroneo
 
Greedy
GreedyGreedy
Greedy
TERESA MORA
 
Cadenas mey
Cadenas meyCadenas mey
Cadenas mey
Menfy Morales
 

Similar a Algoritmo md5 (20)

Codigos..
Codigos..Codigos..
Codigos..
 
55852564 metodo-de-cross
55852564 metodo-de-cross55852564 metodo-de-cross
55852564 metodo-de-cross
 
15 funcioneshash
15 funcioneshash15 funcioneshash
15 funcioneshash
 
Codigos
Codigos Codigos
Codigos
 
Congruencias
CongruenciasCongruencias
Congruencias
 
Aritmética de Computadores
Aritmética de ComputadoresAritmética de Computadores
Aritmética de Computadores
 
Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)
Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)
Sistemas Numericos y conversiones(Powerpoint aplicaciones m. 1)
 
Codigos binarios
Codigos binariosCodigos binarios
Codigos binarios
 
CUESTIONARIO DE PROGRAMACION I
CUESTIONARIO DE PROGRAMACION  ICUESTIONARIO DE PROGRAMACION  I
CUESTIONARIO DE PROGRAMACION I
 
Curso basico de emsamblador
Curso basico de emsambladorCurso basico de emsamblador
Curso basico de emsamblador
 
Curso básico de ensamblador
Curso básico de ensambladorCurso básico de ensamblador
Curso básico de ensamblador
 
Parte 3 digitales cesar hernandez
Parte 3 digitales cesar hernandezParte 3 digitales cesar hernandez
Parte 3 digitales cesar hernandez
 
Cuaderno de algebra
Cuaderno de algebraCuaderno de algebra
Cuaderno de algebra
 
Curso básico de ensamblador
Curso básico de ensambladorCurso básico de ensamblador
Curso básico de ensamblador
 
Curso básico de Ensamblador
Curso básico de EnsambladorCurso básico de Ensamblador
Curso básico de Ensamblador
 
SHA-1 de 0 a #fail - Andsec 2017 - Mateo Martinez
SHA-1 de 0 a #fail - Andsec 2017 - Mateo MartinezSHA-1 de 0 a #fail - Andsec 2017 - Mateo Martinez
SHA-1 de 0 a #fail - Andsec 2017 - Mateo Martinez
 
Mini curso assembly
Mini curso assemblyMini curso assembly
Mini curso assembly
 
Common Scrambling Algorithm al descubierto
Common Scrambling Algorithm  al descubiertoCommon Scrambling Algorithm  al descubierto
Common Scrambling Algorithm al descubierto
 
Greedy
GreedyGreedy
Greedy
 
Cadenas mey
Cadenas meyCadenas mey
Cadenas mey
 

Último

REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANOREVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
gisellearanguren1
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
al050121024
 
Tecnología 5G Presentación.pdf trabajo .
Tecnología 5G Presentación.pdf trabajo .Tecnología 5G Presentación.pdf trabajo .
Tecnología 5G Presentación.pdf trabajo .
asrielgamer3421
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
doctorsoluciones34
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Festibity
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
Festibity
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
mantenimientocarbra6
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
AMADO SALVADOR
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
Manuel Diaz
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
larapalaciosmonzon28
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
YaniEscobar2
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
leia ereni
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
cecypozos703
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
larapalaciosmonzon28
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
AMADO SALVADOR
 
herramientas de sitio web 3.0 2024
herramientas de sitio web 3.0  2024herramientas de sitio web 3.0  2024
herramientas de sitio web 3.0 2024
julio05042006
 
Sitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajasSitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajas
paulroyal74
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
codesiret
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
KukiiSanchez
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
MiguelAtencio10
 

Último (20)

REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANOREVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
REVISTA TECNOLOGICA PARA EL DESARROLLO HUMANO
 
Second Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro TapiaSecond Life, informe de actividad del maestro Tapia
Second Life, informe de actividad del maestro Tapia
 
Tecnología 5G Presentación.pdf trabajo .
Tecnología 5G Presentación.pdf trabajo .Tecnología 5G Presentación.pdf trabajo .
Tecnología 5G Presentación.pdf trabajo .
 
Manual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputoManual de soporte y mantenimiento de equipo de cómputo
Manual de soporte y mantenimiento de equipo de cómputo
 
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdfProjecte Iniciativa TIC 2024 HPE. inCV.pdf
Projecte Iniciativa TIC 2024 HPE. inCV.pdf
 
Informació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdfInformació Projecte Iniciativa TIC HPE.pdf
Informació Projecte Iniciativa TIC HPE.pdf
 
Manual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computoManual Web soporte y mantenimiento de equipo de computo
Manual Web soporte y mantenimiento de equipo de computo
 
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
Catalogo general tarifas 2024 Vaillant. Amado Salvador Distribuidor Oficial e...
 
Programming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdfProgramming & Artificial Intelligence ebook.pdf
Programming & Artificial Intelligence ebook.pdf
 
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfqedublogs info.docx asdasfasfsawqrdqwfqwfqwfq
edublogs info.docx asdasfasfsawqrdqwfqwfqwfq
 
computacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADOcomputacion global 3.pdf pARA TERCER GRADO
computacion global 3.pdf pARA TERCER GRADO
 
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIAMONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
MONOGRAFIA memoria RAM.docx trabajo DE TECNOLOGIA
 
El uso de las TIC por Cecilia Pozos S..pptx
El uso de las TIC  por Cecilia Pozos S..pptxEl uso de las TIC  por Cecilia Pozos S..pptx
El uso de las TIC por Cecilia Pozos S..pptx
 
Presentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre bloggerPresentación de Tic en educación y sobre blogger
Presentación de Tic en educación y sobre blogger
 
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaCatalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador Valencia
 
herramientas de sitio web 3.0 2024
herramientas de sitio web 3.0  2024herramientas de sitio web 3.0  2024
herramientas de sitio web 3.0 2024
 
Sitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajasSitios web 3.0 funciones ventajas y desventajas
Sitios web 3.0 funciones ventajas y desventajas
 
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
Infografia TCP/IP (Transmission Control Protocol/Internet Protocol)
 
TIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololoTIC en educacion.rtf.docxlolololololololo
TIC en educacion.rtf.docxlolololololololo
 
mantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptxmantenimiento de chasis y carroceria1.pptx
mantenimiento de chasis y carroceria1.pptx
 

Algoritmo md5

  • 1. Algoritmo MD5 ¿Qué es MD5? MD5 es uno de los algoritmos de reducción criptográficos diseñados por el profesor Ronald Rivest del MIT (Massachusetts Institute of Technology, Instituto Tecnológico de Massachusetts). Fue desarrollado en 1991 como reemplazo del algoritmo MD4 después de que Hans Dobbertin descubriese su debilidad. A pesar de su amplia difusión actual, la sucesión de problemas de seguridad detectados desde que, en 1996, Hans Dobbertin anunciase una colisión de hash plantea una serie de dudas acerca de su uso futuro. Colision de hash: En informática, una colisión de hash es una situación que se produce cuando dos entradas distintas a una función de hash producen la misma salida. Es matemáticamente imposible que una función de hash carezca de colisiones, ya que el número potencial de posibles entradas es mayor que el número de salidas que puede producir un hash. Sin embargo, las colisiones se producen más frecuentemente en los malos algoritmos. En ciertas aplicaciones especializadas con un relativamente pequeño número de entradas que son conocidas de antemano es posible construir una función de hash perfecta, que se asegura que todas las entradas tengan una salida diferente. Pero en una función en la cual se puede introducir datos de longitud arbitraria y que devuelve un hash de tamaño fijo (como MD5), siempre habrá colisiones, dado que un hash dado puede pertenecer a un infinito número de entradas. Una de las propiedades deseables de las funciones de hash criptográficas es que sea computacionalmente imposible que se produzca una colisión. El valor de una función hash puede ser usado para certificar que un texto dado (o cualquier otro dato) no ha sido modificado, publicando el valor firmado de la función de hash si no es factible que se produzca una colisión. En este contexto, factible se refiere a cualquier método capaz de producirla más rápido que un ataque de cumpleaños de fuerza bruta. El proceso de encontrar dos valores arbitrarios cuyos hashes collisionan se llama ataque de colisiones. El proceso de encontrar un valor arbitrario cuyo hash colisione con otro hash dado se llama ataque preimagen. Un ataque preimagen exitoso es mucho más serio que un ataque de colisiones exitoso. • Hashing Perfecto: Existe una Función de Enumeración que asigna a cada valor del dominio una única posición de memoria. No posee colisiones. • Hashing Puro: La función de Hash puede asignar a dos valores distintos el mismo lugar en memoria. y h(x1) = h(x2). Estos dos valores reciben el nombre de sinónimos. Las estructuras de hashing puros poseen colisiones y en consecuencia se deberán establecer mecanismos para tratar los mismos. Podemos clasificarlos en estructuras cerradas y abiertas y dentro de las abiertas en estáticas y dinámicas:
  • 2. o Cerradas: No utilizan un nuevo espacio en memoria. o Abiertas: Utilizan espacio adicional.  Estática: La estructura principal no crece.  Dinámica: La estructura principal se expande a medida que aumenta la cantidad de elementos. Codificación: La codificación del MD5 de 128 bits es representada típicamente como un número de 32 dígitos hexadecimal. El siguiente código de 28 bytes ASCII será tratado con MD5 y veremos su correspondiente hash de salida: MD5("Esto sí es una prueba de MD5") = e99008846853ff3b725c27315e469fbc Un simple cambio en el mensaje nos da un cambio total en la codificación hash, en este caso cambiamos dos letras, el «sí» por un «no». MD5("Esto no es una prueba de MD5") = dd21d99a468f3bb52a136ef5beef5034 Otro ejemplo sería la codificación de un campo vacío: MD5("") = d41d8cd98f00b204e9800998ecf8427e Algoritmo: • Terminologías y notaciones En este documento "palabra" es una entidad de 32 bits y byte es una entidad de 8 bits. Una secuencia de bits puede ser interpretada de manera natural como una secuencia de bytes, donde cada grupo consecutivo de ocho bits se interpreta como un byte con el bit más significativo al principio. Similarmente, una secuencia de bytes puede ser interpretada como una secuencia de 32 bits (palabra), donde cada grupo consecutivo de cuatro bytes se interpreta como una palabra en la que el byte menos significativo está al principio. El símbolo "+" significa suma de palabras. X <<< s se interpreta por un desplazamiento a la izquierda 's' posiciones not(x) se entiende como el complemento de x • Descripción del algoritmo md5 Empezamos suponiendo que tenemos un mensaje de 'b' bits de entrada, y que nos gustaría encontrar su resumen. Aquí 'b' es un valor arbitrario entero no negativo, pero puede ser cero, no tiene por qué ser múltiplo de ocho, y puede ser muy largo. Imaginemos los bits del mensaje escritos así:
  • 3. m0 m1 ... m{b-1} Los siguientes cinco pasos son efectuados para calcular el resumen del mensaje. Paso 1. Añadiendo bits [editar] El mensaje será extendido hasta que su longitud en bits sea congruente con 448, módulo 512. Esto es, si se le resta 448 a la longitud del mensaje tras este paso, se obtiene un múltiplo de 512. Esta extensión se realiza siempre, incluso si la longitud del mensaje es ya congruente con 448, módulo 512. La extensión se realiza como sigue: un sólo bit "1" se añade al mensaje, y después bits "0" se añaden hasta que la longitud en bits del mensaje extendido se haga congruente con 448, módulo 512. En todos los mensajes se añade al menos un bit y como máximo 512. Paso 2. Longitud del mensaje [editar] Un entero de 64 bits que represente la longitud 'b' del mensaje (longitud antes de añadir los bits) se concatena al resultado del paso anterior. En el supuesto no deseado de que 'b' sea mayor que 2^64, entonces sólo los 64 bits de menor peso de 'b' se usarán. En este punto el mensaje resultante (después de rellenar con los bits y con 'b') se tiene una longitud que es un múltiplo exacto de 512 bits. A su vez, la longitud del mensaje es múltiplo de 16 palabras (32 bits por palabra). Con M[0 ... N-1] denotaremos las palabras del mensaje resultante, donde N es múltiplo de 16. Paso 3. Inicializar el búfer MD [editar] Un búfer de cuatro palabras (A, B, C, D) se usa para calcular el resumen del mensaje. Aquí cada una de las letras A, B, C, D representa un registro de 32 bits. Estos registros se inicializan con los siguientes valores hexadecimales, los bits de menor peso primero: palabra A: 01 23 45 67 palabra B: 89 ab cd ef palabra C: fe dc ba 98 palabra D: 76 54 32 10 Paso 4. Procesado del mensaje en bloques de 16 palabras [editar] Primero definimos cuatro funciones auxiliares que toman como entrada tres palabras de 32 bits y su salida es una palabra de 32 bits.
  • 4. Los operadores son las funciones XOR, AND, OR y NOT respectivamente. En cada posición de cada bit F actúa como un condicional: si X, entonces Y sino Z. La función F podría haber sido definida usando + en lugar de v ya que XY y not(x) Z nunca tendrán unos ('1') en la misma posición de bit. Es interesante resaltar que si los bits de X, Y y Z son independientes y no sesgados, cada uno de los bits de F(X,Y,Z) será independiente y no sesgado. Las funciones G, H e I son similares a la función F, ya que actúan "bit a bit en paralelo" para producir sus salidas de los bits de X, Y y Z, en la medida que si cada bit correspondiente de X, Y y Z son independientes y no sesgados, entonces cada bit de G(X,Y,Z), H(X,Y,Z) e I(X,Y,Z) serán independientes y no sesgados. Nótese que la función H es la comparación bit a bit "xor" o función "paridad" de sus entradas. Este paso usa una tabla de 64 elementos T[1 ... 64] construida con la función Seno. Denotaremos por T[i] el elemento i-ésimo de esta tabla, que será igual a la parte entera del valor absoluto del seno de 'i' 4294967296 veces, donde 'i' está en radianes. Código del MD5: /* Procesar cada bloque de 16 palabras. */ para i = 0 hasta N/16-1 hacer /* Copiar el bloque 'i' en X. */ para j = 0 hasta 15 hacer hacer X[j] de M[i*16+j]. fin para /* del bucle 'j' */ /* Guardar A como AA, B como BB, C como CC, y D como DD. */ AA = A BB = B CC = C DD = D /* Ronda 1. */ /* [abcd k s i] denotarán la operación a = b + ((a + F(b, c, d) + X[k] + T[i]) <<< s). */ /* Hacer las siguientes 16 operaciones. */ [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16] /* Ronda 2. */ /* [abcd k s i] denotarán la operación a = b + ((a + G(b, c, d) + X[k] + T[i]) <<< s). */ /* Hacer las siguientes 16 operaciones. */ [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32] /* Ronda 3. */ /* [abcd k s t] denotarán la operación
  • 5. a = b + ((a + H(b, c, d) + X[k] + T[i]) <<< s). */ /* Hacer las siguientes 16 operaciones. */ [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48] /* Ronda 4. */ /* [abcd k s t] denotarán la operación a = b + ((a + I(b, c, d) + X[k] + T[i]) <<< s). */ /* Hacer las siguientes 16 operaciones. */ [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64] /* Ahora realizar las siguientes sumas. (Este es el incremento de cada uno de los cuatro registros por el valor que tenían antes de que este bloque fuera inicializado.) */ A = A + AA B = B + BB C = C + CC D = D + DD fin para /* del bucle en 'i' */ Paso 5. Salida [editar] El resumen del mensaje es la salida producida por A, B, C y D. Esto es, se comienza el byte de menor peso de A y se acaba con el byte de mayor peso de D. Seguridad [editar] A pesar de haber sido considerado criptográficamente seguro en un principio, ciertas investigaciones han revelado vulnerabilidades que hacen cuestionable el uso futuro del MD5. En agosto del 2004, Xiaoyun Wang, Dengguo Feng, Xuejia Lai y Hongbo Yu anunciaron el descubrimiento de colisiones de hash para MD5. Su ataque se consumó en una hora de cálculo con un clúster IBM P690. Aunque dicho ataque era analítico, el tamaño del hash (128 bits) es lo suficientemente pequeño como para que resulte vulnerable frente a ataques de 'fuerza bruta' tipo 'cumpleaños' (Ataque de cumpleaños). El proyecto de computación distribuida MD5CRK arrancó en marzo del 2004 con el propósito de demostrar que MD5 es inseguro frente a uno de tales ataques, aunque acabó poco después del aviso de la publicación de la vulnerabilidad del equipo de Wang. Debido al descubrimiento de métodos sencillos para generar colisiones de hash, muchos investigadores recomiendan su sustitución por algoritmos alternativos tales como SHA- 1 o RIPEMD-160. Aplicaciones [editar]
  • 6. Los resúmenes MD5 se utilizan extensamente en el mundo del software para proporcionar la seguridad de que un archivo descargado de Internet no se ha alterado. Comparando una suma MD5 publicada con la suma de comprobación del archivo descargado, un usuario puede tener la confianza suficiente de que el archivo es igual que el publicado por los desarrolladores. Esto protege al usuario contra los 'Caballos de Troya' o 'Troyanos' y virus que algún otro usuario malicioso pudiera incluir en el software. La comprobación de un archivo descargado contra su suma MD5 no detecta solamente los archivos alterados de una manera maliciosa, también reconoce una descarga corrupta o incompleta. Para comprobar la integridad de un archivo descargado de Internet se puede utilizar una herramienta MD5 para comparar la suma MD5 de dicho archivo con un archivo MD5SUM con el resumen MD5 del primer archivo. En los sistemas UNIX, el comando de md5sum es un ejemplo de tal herramienta. Además, también está implementado en el lenguaje de scripting PHP como MD5("") entre otros. En sistemas UNIX y GNU/Linux se utiliza el algoritmo MD5 para cifrar las claves de los usuarios. En el disco se guarda el resultado del MD5 de la clave que se introduce al dar de alta un usuario, y cuando éste quiere entrar en el sistema se compara la entrada con la que hay guardada en el disco duro, si coinciden, es la misma clave y el usuario será autenticado. He ahí el problema de encontrar y generar colisiones de hash a voluntad. El MD5 también se puede usar para comprobar que los correos electrónicos no han sido alterados usando claves públicas y privadas. Implementación: /********************************************************************* ******** * md5.js * * A JavaScript implementation derived from the RSA Data Security, Inc. MD5 * Message-Digest Algorithm. See http://cw.oaktree.co.uk/site/legal.html for * details. * * Copyright (C) Paul Johnston 1999 - 2000. Distributed under the LGPL. ********************************************************************* ********/ /* to convert strings to a list of ascii values */ var sAscii = " !"#$%&'()*+,-. /0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ" var sAscii = sAscii + "[]^_`abcdefghijklmnopqrstuvwxyz{|}~"; /* convert integer to hex string */ var sHex = "0123456789ABCDEF"; function hex(i) { h = ""; for(j = 0; j <= 3; j++)
  • 7. { h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) + sHex.charAt((i >> (j * 8)) & 0x0F); } return h; } /* add, handling overflows correctly */ function add(x, y) { return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000); } /* MD5 rounds functions */ function R1(A, B, C, D, X, S, T) { q = add(add(A, (B & C) | ((~B) & D)), add(X, T)); return add((q << S) | (q >>> (32 - S)), B); } function R2(A, B, C, D, X, S, T) { q = add(add(A, (B & D) | (C & (~D))), add(X, T)); return add((q << S) | (q >>> (32 - S)), B); } function R3(A, B, C, D, X, S, T) { q = add(add(A, B ^ C ^ D), add(X, T)); return add((q << S) | (q >>> (32 - S)), B); } function R4(A, B, C, D, X, S, T) { q = add(add(A, C ^ (B | (~D))), add(X, T)); return add((q << S) | (q >>> (32 - S)), B); } /* main entry point */ function calcMD5(sInp) { /* Calculate length in machine words, including padding */ wLen = (((sInp.length + 8) >> 6) + 1) << 4; var X = new Array(wLen); /* Convert string to array of words */ j = 4; for (i = 0; (i * 4) < sInp.length; i++) { X[i] = 0; for (j = 0; (j < 4) && ((j + i * 4) < sInp.length); j++) { X[i] += (sAscii.indexOf(sInp.charAt((i * 4) + j)) + 32) << (j * 8); } } /* Append padding bits and length */ if (j == 4) {
  • 8. X[i++] = 0x80; } else { X[i - 1] += 0x80 << (j * 8); } for(; i < wLen; i++) { X[i] = 0; } X[wLen - 2] = sInp.length * 8; /* hard coded initial values */ a = 0x67452301; b = 0xefcdab89; c = 0x98badcfe; d = 0x10325476; /* Process each 16 word block in turn */ for (i = 0; i < wLen; i += 16) { aO = a; bO = b; cO = c; dO = d; a = R1(a, b, c, d, X[i+ 0], 7 , 0xd76aa478); d = R1(d, a, b, c, X[i+ 1], 12, 0xe8c7b756); c = R1(c, d, a, b, X[i+ 2], 17, 0x242070db); b = R1(b, c, d, a, X[i+ 3], 22, 0xc1bdceee); a = R1(a, b, c, d, X[i+ 4], 7 , 0xf57c0faf); d = R1(d, a, b, c, X[i+ 5], 12, 0x4787c62a); c = R1(c, d, a, b, X[i+ 6], 17, 0xa8304613); b = R1(b, c, d, a, X[i+ 7], 22, 0xfd469501); a = R1(a, b, c, d, X[i+ 8], 7 , 0x698098d8); d = R1(d, a, b, c, X[i+ 9], 12, 0x8b44f7af); c = R1(c, d, a, b, X[i+10], 17, 0xffff5bb1); b = R1(b, c, d, a, X[i+11], 22, 0x895cd7be); a = R1(a, b, c, d, X[i+12], 7 , 0x6b901122); d = R1(d, a, b, c, X[i+13], 12, 0xfd987193); c = R1(c, d, a, b, X[i+14], 17, 0xa679438e); b = R1(b, c, d, a, X[i+15], 22, 0x49b40821); a = R2(a, b, c, d, X[i+ 1], 5 , 0xf61e2562); d = R2(d, a, b, c, X[i+ 6], 9 , 0xc040b340); c = R2(c, d, a, b, X[i+11], 14, 0x265e5a51); b = R2(b, c, d, a, X[i+ 0], 20, 0xe9b6c7aa); a = R2(a, b, c, d, X[i+ 5], 5 , 0xd62f105d); d = R2(d, a, b, c, X[i+10], 9 , 0x2441453); c = R2(c, d, a, b, X[i+15], 14, 0xd8a1e681); b = R2(b, c, d, a, X[i+ 4], 20, 0xe7d3fbc8); a = R2(a, b, c, d, X[i+ 9], 5 , 0x21e1cde6); d = R2(d, a, b, c, X[i+14], 9 , 0xc33707d6); c = R2(c, d, a, b, X[i+ 3], 14, 0xf4d50d87); b = R2(b, c, d, a, X[i+ 8], 20, 0x455a14ed); a = R2(a, b, c, d, X[i+13], 5 , 0xa9e3e905); d = R2(d, a, b, c, X[i+ 2], 9 , 0xfcefa3f8); c = R2(c, d, a, b, X[i+ 7], 14, 0x676f02d9); b = R2(b, c, d, a, X[i+12], 20, 0x8d2a4c8a); a = R3(a, b, c, d, X[i+ 5], 4 , 0xfffa3942); d = R3(d, a, b, c, X[i+ 8], 11, 0x8771f681); c = R3(c, d, a, b, X[i+11], 16, 0x6d9d6122); b = R3(b, c, d, a, X[i+14], 23, 0xfde5380c); a = R3(a, b, c, d, X[i+ 1], 4 , 0xa4beea44);
  • 9. d = R3(d, a, b, c, X[i+ 4], 11, 0x4bdecfa9); c = R3(c, d, a, b, X[i+ 7], 16, 0xf6bb4b60); b = R3(b, c, d, a, X[i+10], 23, 0xbebfbc70); a = R3(a, b, c, d, X[i+13], 4 , 0x289b7ec6); d = R3(d, a, b, c, X[i+ 0], 11, 0xeaa127fa); c = R3(c, d, a, b, X[i+ 3], 16, 0xd4ef3085); b = R3(b, c, d, a, X[i+ 6], 23, 0x4881d05); a = R3(a, b, c, d, X[i+ 9], 4 , 0xd9d4d039); d = R3(d, a, b, c, X[i+12], 11, 0xe6db99e5); c = R3(c, d, a, b, X[i+15], 16, 0x1fa27cf8); b = R3(b, c, d, a, X[i+ 2], 23, 0xc4ac5665); a = R4(a, b, c, d, X[i+ 0], 6 , 0xf4292244); d = R4(d, a, b, c, X[i+ 7], 10, 0x432aff97); c = R4(c, d, a, b, X[i+14], 15, 0xab9423a7); b = R4(b, c, d, a, X[i+ 5], 21, 0xfc93a039); a = R4(a, b, c, d, X[i+12], 6 , 0x655b59c3); d = R4(d, a, b, c, X[i+ 3], 10, 0x8f0ccc92); c = R4(c, d, a, b, X[i+10], 15, 0xffeff47d); b = R4(b, c, d, a, X[i+ 1], 21, 0x85845dd1); a = R4(a, b, c, d, X[i+ 8], 6 , 0x6fa87e4f); d = R4(d, a, b, c, X[i+15], 10, 0xfe2ce6e0); c = R4(c, d, a, b, X[i+ 6], 15, 0xa3014314); b = R4(b, c, d, a, X[i+13], 21, 0x4e0811a1); a = R4(a, b, c, d, X[i+ 4], 6 , 0xf7537e82); d = R4(d, a, b, c, X[i+11], 10, 0xbd3af235); c = R4(c, d, a, b, X[i+ 2], 15, 0x2ad7d2bb); b = R4(b, c, d, a, X[i+ 9], 21, 0xeb86d391); a = add(a, aO); b = add(b, bO); c = add(c, cO); d = add(d, dO); } return hex(a) + hex(b) + hex(c) + hex(d); } Formulario de login <html><head><title></title> <script language="JavaScript" src="md5.js"></script> <script language="JavaScript"> numero = Math.random().toString(); function calculaMD5() { var pw = document.forms["login"].elements["password"].value pw += numero return calcMD5(pw) } function enviaMD5(hash) { document.forms["login"].elements["cifrado"].value = hash; document.forms["login"].elements["numero"].value = numero; document.forms["login"].submit(); } </script> </head> <body> <form action="auth.php3" method="POST" name="login"> Usuario: <input type="Text" name="usuario"><br> Password: <input type="Password" name="password"><br> <input type="Hidden" name="cifrado" value=""> <input type="Hidden" name="numero" value=""> <input type="Submit" value=" Login " onClick="enviaMD5(calculaMD5())">