Foros del Web » Programando para Internet » PHP »

Escribir la función MD5 en PHP

Estas en el tema de Escribir la función MD5 en PHP en el foro de PHP en Foros del Web. La idea es escribir en PHP la funcion MD5 en PHP, aunque PHP tiene incorporada en su Core la funcion MD5, esta esta escrita en ...
  #1 (permalink)  
Antiguo 11/01/2007, 08:00
 
Fecha de Ingreso: mayo-2005
Mensajes: 12
Antigüedad: 18 años, 11 meses
Puntos: 0
Pregunta Escribir la función MD5 en PHP

La idea es escribir en PHP la funcion MD5 en PHP, aunque PHP tiene incorporada en su Core la funcion MD5,
esta esta escrita en Visual c++, lo que se pretende es escribirla usando el lenguaje PHP, basandose en los rfc del md5.

Esto es con el proposito de entender mas claramente como funciona el MD5 y por que han logrado que colisione, hackeado.
Solo propositos investigativos.

Podemos ir empezando por:

<?PHP

function MD5_PHP($string)
{
$md5 = '';//He aqui el asunto
return $md5;//Hoy es 10 de enero del 2006, veamos a que fecha llegamos aqui
}
?>
Para los que quieran colaborar, pego el rfc en español del rfc del md5.

RFC del MD5 en Ingles:

Para encontrar el enlace busquen "rfc1321.txt" en google el primero que sale ese es, esta en ietf.


RFC del MD5 en Español:

Para encontrar la version en español del rfc busquen "rfc1321-es.txt" en Google y el segundo que salga ese es, esta en rfc-es

Este es la descripcion del algoritmo MD5
RFC 1321 El Algoritmo de Resumen de Mensajes MD5 Abril 1992


bit a bit de X, "X v Y" representa una operación OR de X e Y, y que
XY expresa una operación AND bit a bit de X e Y.

3. Descripción del algoritmo MD5

Comenzamos suponiendo que tenemos un mensaje de entrada de b-bits, y
que deseamos obtener su resumen. b es un entero arbitrario no
negativo; b puede ser cero, no tiene por qué ser múltiplo de ocho, y
puede ser tan largo como se quiera. Podemos imaginar los bits del
mensaje de la siguiente manera:

m_0 m_1 ... m_{b-1}

Los cinco pasos siguientes han sido diseñados para calcular el
resumen del mensaje.

3.1 Paso 1. Añadir Bits de Relleno

El mensaje se rellena (se amplía) para que su longitud (en bits) sea
congruente con 448, módulo 512. Es decir, el mensaje se rellena de
forma que su longitud sea justo 64 bits menor de ser un múltiplo de
512 bits. El relleno se realiza siempre, incluso si la longitud del
mensaje es de por sí congruente con 448, módulo 512.

El relleno se efectúa de la siguiente manera: se añade primero un
sólo bit "1" al mensaje, y entonces se añaden bits "0" hasta que la
longitud en bits del mensaje ampliado sea congruente con 448, módulo
512. Esto hace que el número de bits que se añade pueda ser como
mínimo uno y como máximo 512.

3.2 Paso 2: Añadir la Longitud

La representación en 64 bits de b (recordar que b es la longitud del
mensaje antes de añadirle los bits de relleno) se añade al resultado
del paso anterior. En el improbable caso de que b sea mayor que 2^64,
sólo se utilizarán los 64 bits de menor orden de b. (Estos bits serán
añadidos como dos palabras de 32 bits, añadiendo primero la palabra
de menor orden, de acuerdo con las convenciones establecidas
anteriormente).

Llegados a este punto, la longitud del mensaje resultante (después de
haber rellenado con bits y añadido b) es múltiplo exacto de 512. De
forma equivalente, dicha longitud expresada en palabras (de 32 bits)
también es un múltiplo exacto de 16. Supongamos que M[0 ... N-1]
representa las palabras del mensaje resultante, donde N es un
múltiplo de 16.

3.3 Paso 3. Inicialización del búfer MD

Se utiliza un búfer de cuatro palabras (A,B,C,D) para calcular el
resumen del mensaje. A,B,C y D son registros de 32 bits. Estos
registros se inicializan con los siguientes valores hexadecimales,
(los bytes de menor orden van primero):

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

3.4 Paso 4. Procesar el Mensaje en Bloques de 16 palabras

Para empezar definiremos cuatro funciones auxiliares. Cada una ellas
toma tres palabras de 32 bits como entrada y devuelven como salida
una palabra de 32 bits.

F(X,Y,Z) = XY v not(X) Z
G(X,Y,Z) = XZ v not(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X v not(Z))

La función F actúa como un condicional en la posición de cada bit: si
X entonces Y en otro caso Z. La función F podría haberse definido
utilizando + en lugar de v ya que XY y not(X)Z nunca tendrán bits a
uno en la misma posición. Es interesante resaltar que si los bits de
X, Y, y Z son independientes, los bits de F(X,Y,Z) también lo serán.

Las funciones G,H, e I son parecidas a la función F, ya que actúan de
forma independiente a nivel de bit al hallar la salida a partir de
los bits de X, Y, y Z, de forma que si los correspondientes bits de
X, Y y Z son independientes entre sí, cada uno de los bits de
G(X,Y,Z), H(X,Y,Z), e I(X,Y,Z) serán independientes entre sí también.
Nótese que la función H produce el xor a nivel de bit, o función de
igualdad, de su entrada.

Este paso utiliza una tabla de 64 elementos, T[1..64], construída a
partir de la función seno. Supongamos que T[i] es el elemento i-ésimo
de la tabla, que es igual a la parte entera del resultado de
multiplicar 4294967296 veces abs(sin(i)), estando i expresado en
radianes. Los elementos de la tabla se adjuntan en el apéndice.

Hacemos lo siguiente:

/* Procesamos cada bloque de 16 palabras */
For i = 0 to N/16-1 do

/* Copia el bloque i en X */
For j = 0 to 15 do

Almacenar M[i*16+j] en X[j]
fin /* del bucle en j */

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

/* Vuelta 1. */
/* Suponiendo que [abcd k s i] representa la operación
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
/* Realizamos las 16 operaciones siguientes. */
[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]

/* Vuelta 2 */
/* Suponiendo que [abcd k s i] representa la operación
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Realizamos las 16 operaciones siguientes. */

[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]

/* Vuelta 3. */
/* Supongamos que [abcd k s t] representa la operación
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Realizamos las 16 operaciones siguientes. */
[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]

/* Vuelta 4. */
/* Supongamos que [abcd k s t] representa la operación
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Realizamos las 16 operaciones siguientes. */
[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]

/* Añadimos a cada uno de los cuatro registros el
valor que tenían antes de que fuesen inicializados. */

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

fin /* del bucle en i */

3.5 Paso 5. Salida

El resumen de mensaje resultante está en A, B, C, D, empezando por el
byte de menor orden de A, y terminando con el byte de mayor orden de
D.
  #2 (permalink)  
Antiguo 13/01/2007, 13:32
 
Fecha de Ingreso: mayo-2005
Mensajes: 12
Antigüedad: 18 años, 11 meses
Puntos: 0
De acuerdo Re: Escribir la función MD5 en PHP

Ya lo encontre buscando e google, habia mas buscando, aqui esta y funciona!

Código PHP:
function rhex($num) {
    
$hex_chr "0123456789abcdef";
    
$str "";
    for(
$j 0$j <= 3$j++)
        
$str .= substr($hex_chr, ($num >> ($j 4)) & 0x0F1) . substr($hex_chr, ($num >> ($j 8)) & 0x0F1);
    return 
$str;
}
function 
str2blks_MD5($str) {
    
$nblk = ((strlen($str) + 8) >> 6) + 1;
    for(
$i 0$i $nblk 16$i++) $blks[$i] = 0;
    for(
$i 0$i strlen($str); $i++)
        
$blks[$i >> 2] |= ord(substr($str$i1)) << (($i 4) * 8);
    
$blks[$i >> 2] |= 0x80 << (($i 4) * 8);
    
$blks[$nblk 16 2] = strlen($str) * 8;
    return 
$blks;
}
function 
add($x$y) {
    
$lsw = ($x 0xFFFF) + ($y 0xFFFF);
    
$msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
    return (
$msw << 16) | ($lsw 0xFFFF);
}
function 
rol($num$cnt) {
    return (
$num << $cnt) | zeroFill($num32 $cnt);
}
function 
zeroFill($a$b) {
    
$bin decbin($a);
    if (
strlen($bin) < $b$bin 0;
    else 
$bin substr($bin0strlen($bin) - $b);
    for (
$i=0$i $b$i++) {
        
$bin "0".$bin;
    }
    return 
bindec($bin);
}
function 
cmn($q$a$b$x$s$t) {
    return 
add(rol(add(add($a$q), add($x$t)), $s), $b);
}
function 
ff($a$b$c$d$x$s$t) {
    return 
cmn(($b $c) | ((~$b) & $d), $a$b$x$s$t);
}
function 
gg($a$b$c$d$x$s$t) {
    return 
cmn(($b $d) | ($c & (~$d)), $a$b$x$s$t);
}
function 
hh($a$b$c$d$x$s$t) {
    return 
cmn($b $c $d$a$b$x$s$t);
}
function 
ii($a$b$c$d$x$s$t) {
    return 
cmn($c ^ ($b | (~$d)), $a$b$x$s$t);
}
function 
md5p($str) {
  
$x str2blks_MD5($str);
  
$a =  1732584193;
  
$b = -271733879;
  
$c = -1732584194;
  
$d =  271733878;

  for(
$i 0$i sizeof($x); $i += 16) {
    
$olda $a;
    
$oldb $b;
    
$oldc $c;
    
$oldd $d;

    
$a ff($a$b$c$d$x[$i0], , -680876936);
    
$d ff($d$a$b$c$x[$i1], 12, -389564586);
    
$c ff($c$d$a$b$x[$i2], 17,  606105819);
    
$b ff($b$c$d$a$x[$i3], 22, -1044525330);
    
$a ff($a$b$c$d$x[$i4], , -176418897);
    
$d ff($d$a$b$c$x[$i5], 12,  1200080426);
    
$c ff($c$d$a$b$x[$i6], 17, -1473231341);
    
$b ff($b$c$d$a$x[$i7], 22, -45705983);
    
$a ff($a$b$c$d$x[$i8], ,  1770035416);
    
$d ff($d$a$b$c$x[$i9], 12, -1958414417);
    
$c ff($c$d$a$b$x[$i+10], 17, -42063);
    
$b ff($b$c$d$a$x[$i+11], 22, -1990404162);
    
$a ff($a$b$c$d$x[$i+12], ,  1804603682);
    
$d ff($d$a$b$c$x[$i+13], 12, -40341101);
    
$c ff($c$d$a$b$x[$i+14], 17, -1502002290);
    
$b ff($b$c$d$a$x[$i+15], 22,  1236535329);

    
$a gg($a$b$c$d$x[$i1], , -165796510);
    
$d gg($d$a$b$c$x[$i6], , -1069501632);
    
$c gg($c$d$a$b$x[$i+11], 14,  643717713);
    
$b gg($b$c$d$a$x[$i0], 20, -373897302);
    
$a gg($a$b$c$d$x[$i5], , -701558691);
    
$d gg($d$a$b$c$x[$i+10], ,  38016083);
    
$c gg($c$d$a$b$x[$i+15], 14, -660478335);
    
$b gg($b$c$d$a$x[$i4], 20, -405537848);
    
$a gg($a$b$c$d$x[$i9], ,  568446438);
    
$d gg($d$a$b$c$x[$i+14], , -1019803690);
    
$c gg($c$d$a$b$x[$i3], 14, -187363961);
    
$b gg($b$c$d$a$x[$i8], 20,  1163531501);
    
$a gg($a$b$c$d$x[$i+13], , -1444681467);
    
$d gg($d$a$b$c$x[$i2], , -51403784);
    
$c gg($c$d$a$b$x[$i7], 14,  1735328473);
    
$b gg($b$c$d$a$x[$i+12], 20, -1926607734);

    
$a hh($a$b$c$d$x[$i5], , -378558);
    
$d hh($d$a$b$c$x[$i8], 11, -2022574463);
    
$c hh($c$d$a$b$x[$i+11], 16,  1839030562);
    
$b hh($b$c$d$a$x[$i+14], 23, -35309556);
    
$a hh($a$b$c$d$x[$i1], , -1530992060);
    
$d hh($d$a$b$c$x[$i4], 11,  1272893353);
    
$c hh($c$d$a$b$x[$i7], 16, -155497632);
    
$b hh($b$c$d$a$x[$i+10], 23, -1094730640);
    
$a hh($a$b$c$d$x[$i+13], ,  681279174);
    
$d hh($d$a$b$c$x[$i0], 11, -358537222);
    
$c hh($c$d$a$b$x[$i3], 16, -722521979);
    
$b hh($b$c$d$a$x[$i6], 23,  76029189);
    
$a hh($a$b$c$d$x[$i9], , -640364487);
    
$d hh($d$a$b$c$x[$i+12], 11, -421815835);
    
$c hh($c$d$a$b$x[$i+15], 16,  530742520);
    
$b hh($b$c$d$a$x[$i2], 23, -995338651);

    
$a ii($a$b$c$d$x[$i0], , -198630844);
    
$d ii($d$a$b$c$x[$i7], 10,  1126891415);
    
$c ii($c$d$a$b$x[$i+14], 15, -1416354905);
    
$b ii($b$c$d$a$x[$i5], 21, -57434055);
    
$a ii($a$b$c$d$x[$i+12], ,  1700485571);
    
$d ii($d$a$b$c$x[$i3], 10, -1894986606);
    
$c ii($c$d$a$b$x[$i+10], 15, -1051523);
    
$b ii($b$c$d$a$x[$i1], 21, -2054922799);
    
$a ii($a$b$c$d$x[$i8], ,  1873313359);
    
$d ii($d$a$b$c$x[$i+15], 10, -30611744);
    
$c ii($c$d$a$b$x[$i6], 15, -1560198380);
    
$b ii($b$c$d$a$x[$i+13], 21,  1309151649);
    
$a ii($a$b$c$d$x[$i4], , -145523070);
    
$d ii($d$a$b$c$x[$i+11], 10, -1120210379);
    
$c ii($c$d$a$b$x[$i2], 15,  718787259);
    
$b ii($b$c$d$a$x[$i9], 21, -343485551);

        
$a add($a$olda);
        
$b add($b$oldb);
        
$c add($c$oldc);
        
$d add($d$oldd);
    }
    return 
rhex($a) . rhex($b) . rhex($c) . rhex($d);
}
echo 
md5p('word');//Generado manualmente
echo "\r\n<br />".md5('word');//Generado con PHP 
  #3 (permalink)  
Antiguo 24/01/2007, 16:13
 
Fecha de Ingreso: mayo-2005
Mensajes: 12
Antigüedad: 18 años, 11 meses
Puntos: 0
Re: Escribir la función MD5 en PHP

Ahora que ya esta escrita la función md5 en lenguaje php si hay alguien que pueda explicar los desplazamientos de bits que se utilizan en esta, y los operadores de bits, AND OR, XOR, los valores hexadecimales, y que diferencia hay en un desplazamientos de bits a la derecha y dividir sucesivamente n veces por 2, muchas gracias a quien pueda saber
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:26.