Autor
|
Tema: ¿Cómo se hacen los hashes MD5? (Leído 6,104 veces)
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
Bueno, estaba leyendo por aquí y por allá, y he visto en varios post del foro cómo algunos sistemas acaban cifrando el resultado del proceso con MD5. Mi pregunta es... ¿cómo se cifran los hashes MD5? No busco programas ni cosas de ese tipo, sino saber el proceso de forma manual...
Un saludo y gracias! Sagrini
|
|
|
En línea
|
* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente. * No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado. * Si compila esta bien, si arranca es perfecto. ¡Wiki elhacker.net!Un saludo
|
|
|
Debci
Wiki
Desconectado
Mensajes: 2.021
Actualizate o muere!
|
Según wikipedia: Los siguientes cinco pasos son efectuados para calcular el resumen del mensaje.
Paso 1. Adición de bits 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 solo bit "1" se añade al mensaje, y después se añaden bits "0" 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 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 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 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 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) <<< 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) <<< 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) <<< 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) <<< 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 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. http://es.wikipedia.org/wiki/MD5Saludos
|
|
|
En línea
|
|
|
|
APOKLIPTICO
Desconectado
Mensajes: 3.871
Toys in the attic.
|
Es probable que lo pregunta porque no entendió lo que aparece en wikipedia, realmente los hashes son un tema muy interesante para tratarlos a fondo, como tratamos los algoritmos en el taller de criptografía asimétrica. Pero realmente son temas bastante complicados, sobre todo de hacer criptoanálisis, ya que requiere avanzados conocimientos de estadística descriptiva e inferencial.
Sagrini, sabés algún lenguaje de programación? Quizas te parece más claro si lo podés ver en un código que te suene más familiar.
|
|
|
En línea
|
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore ASUS M4A89GTD-PRO/USB3 2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T) Seagate 500 Gb XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
Entiendo C, muchas gracias . Aparte, aprovecho para preguntar sobre lo de Wikipedia... Me doy cuenta gracias a la Wikipedia no entendía bien "congruente". Vamos a ver, un número es congruente con otro cuando dan el mismo resto a dividirlos entre un módulo (512). Entonces... ¿La longitud del mensaje deberá ser múltiplo de 448? A partir de ahí no salgo Gracias a los dos! Sagrini MOD: Te saco el tachado, debés querer haber puesto subrrayado, no?? es con la "u". RESP: No, quería tachar, gracias de todos modos Directamente lo borro Lo puse por si de todos modos era parecido a eso...
|
|
« Última modificación: 13 Marzo 2011, 19:09 pm por Sagrini »
|
En línea
|
* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente. * No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado. * Si compila esta bien, si arranca es perfecto. ¡Wiki elhacker.net!Un saludo
|
|
|
APOKLIPTICO
Desconectado
Mensajes: 3.871
Toys in the attic.
|
Nop, congruente significa lo siguiente: Se le agrega primero un bit "1" y luego, se le agregan suficientes "0" (como máximo 512) hasta que la longitud del mensaje módulo 512 sea 448.
Si uno quiere que "x" sea congruente con 448 módulo 512 significa que: x MOD 512 = 448.
|
|
|
En línea
|
AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore ASUS M4A89GTD-PRO/USB3 2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T) Seagate 500 Gb XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.
|
|
|
|
|