Ver Mensaje Individual
  #2 (permalink)  
Antiguo 18/08/2007, 18:04
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 4 meses
Puntos: 45
Re: Javascript MD5

En la FAQ170 (publicada por mí mismo) tienes un ejemplo que debería funcionar en los dos navegadores perfectamente:

Código PHP:
// ****************************************************************************** 
// * md5.js 
// * 
// * A JavaScript implementation derived from the RSA Data Security, Inc. MD5 
// * Message-Digest Algorithm. See [url]http://cw.oaktree.co.uk/site/legal.html[/url] 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

  
""
  for(
0<= 3j++) 
  { 
    
+= sHex.charAt((>> (4)) & 0x0F) + 
         
sHex.charAt((>> (8)) & 0x0F); 
  } 
  return 
h


/* add, handling overflows correctly */ 
function add(xy

  return ((
x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000); 


/* MD5 rounds functions */ 
function R1(ABCDXST

  
add(add(A, (C) | ((~B) & D)), add(XT)); 
  return 
add((<< S) | (>>> (32 S)), B); 


function 
R2(ABCDXST

  
add(add(A, (D) | (& (~D))), add(XT)); 
  return 
add((<< S) | (>>> (32 S)), B); 


function 
R3(ABCDXST

  
add(add(AD), add(XT)); 
  return 
add((<< S) | (>>> (32 S)), B); 


function 
R4(ABCDXST

  
add(add(A^ (| (~D))), add(XT)); 
  return 
add((<< S) | (>>> (32 S)), B); 


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

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

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

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

  
/* hard coded initial values */ 
  
0x67452301
  
0xefcdab89
  
0x98badcfe
  
0x10325476

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

    
R1(abcdX[i0], 0xd76aa478); 
    
R1(dabcX[i1], 120xe8c7b756); 
    
R1(cdabX[i2], 170x242070db); 
    
R1(bcdaX[i3], 220xc1bdceee); 
    
R1(abcdX[i4], 0xf57c0faf); 
    
R1(dabcX[i5], 120x4787c62a); 
    
R1(cdabX[i6], 170xa8304613); 
    
R1(bcdaX[i7], 220xfd469501); 
    
R1(abcdX[i8], 0x698098d8); 
    
R1(dabcX[i9], 120x8b44f7af); 
    
R1(cdabX[i+10], 170xffff5bb1); 
    
R1(bcdaX[i+11], 220x895cd7be); 
    
R1(abcdX[i+12], 0x6b901122); 
    
R1(dabcX[i+13], 120xfd987193); 
    
R1(cdabX[i+14], 170xa679438e); 
    
R1(bcdaX[i+15], 220x49b40821); 

    
R2(abcdX[i1], 0xf61e2562); 
    
R2(dabcX[i6], 0xc040b340); 
    
R2(cdabX[i+11], 140x265e5a51); 
    
R2(bcdaX[i0], 200xe9b6c7aa); 
    
R2(abcdX[i5], 0xd62f105d); 
    
R2(dabcX[i+10], ,  0x2441453); 
    
R2(cdabX[i+15], 140xd8a1e681); 
    
R2(bcdaX[i4], 200xe7d3fbc8); 
    
R2(abcdX[i9], 0x21e1cde6); 
    
R2(dabcX[i+14], 0xc33707d6); 
    
R2(cdabX[i3], 140xf4d50d87); 
    
R2(bcdaX[i8], 200x455a14ed); 
    
R2(abcdX[i+13], 0xa9e3e905); 
    
R2(dabcX[i2], 0xfcefa3f8); 
    
R2(cdabX[i7], 140x676f02d9); 
    
R2(bcdaX[i+12], 200x8d2a4c8a); 

    
R3(abcdX[i5], 0xfffa3942); 
    
R3(dabcX[i8], 110x8771f681); 
    
R3(cdabX[i+11], 160x6d9d6122); 
    
R3(bcdaX[i+14], 230xfde5380c); 
    
R3(abcdX[i1], 0xa4beea44); 
    
R3(dabcX[i4], 110x4bdecfa9); 
    
R3(cdabX[i7], 160xf6bb4b60); 
    
R3(bcdaX[i+10], 230xbebfbc70); 
    
R3(abcdX[i+13], 0x289b7ec6); 
    
R3(dabcX[i0], 110xeaa127fa); 
    
R3(cdabX[i3], 160xd4ef3085); 
    
R3(bcdaX[i6], 23,  0x4881d05); 
    
R3(abcdX[i9], 0xd9d4d039); 
    
R3(dabcX[i+12], 110xe6db99e5); 
    
R3(cdabX[i+15], 160x1fa27cf8); 
    
R3(bcdaX[i2], 230xc4ac5665); 

    
R4(abcdX[i0], 0xf4292244); 
    
R4(dabcX[i7], 100x432aff97); 
    
R4(cdabX[i+14], 150xab9423a7); 
    
R4(bcdaX[i5], 210xfc93a039); 
    
R4(abcdX[i+12], 0x655b59c3); 
    
R4(dabcX[i3], 100x8f0ccc92); 
    
R4(cdabX[i+10], 150xffeff47d); 
    
R4(bcdaX[i1], 210x85845dd1); 
    
R4(abcdX[i8], 0x6fa87e4f); 
    
R4(dabcX[i+15], 100xfe2ce6e0); 
    
R4(cdabX[i6], 150xa3014314); 
    
R4(bcdaX[i+13], 210x4e0811a1); 
    
R4(abcdX[i4], 0xf7537e82); 
    
R4(dabcX[i+11], 100xbd3af235); 
    
R4(cdabX[i2], 150x2ad7d2bb); 
    
R4(bcdaX[i9], 210xeb86d391); 

    
add(aaO); 
    
add(bbO); 
    
add(ccO); 
    
add(d, dO); 
  } 
  return 
hex(a) + hex(b) + hex(c) + hex(d); 

Se llama con calcMD5(), no he visto cómo se hace la llamada en tu código, no lo he podido probar.


Un saludo.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.