I have this custom function to calculate MD5 hash, written in Java. I can’t change it. I need to translate it to JavaScript to use it on client side. I tried on my own but I can’t manage with JavaScript data types (expecially Java char[])… Any help is appreciated, thanks!
// codes array
char[] codes = new char[64];
// initialise
private void initCodes(){
codes = new char[64];
codes[0] = '$';
int count = 0;
for (char i='0';i<='9';i++){ count++; codes[count] = i; }
for (char i='A';i<='Z';i++){ count++; codes[count] = i; }
for (char i='a';i<='z';i++){ count++; codes[count] = i; }
codes[63] = '£';
}
// custom MD5 algorithm
public String customMD5(String source) {
initCodes();
byte[] buf = new byte[source.length()];
buf = source.getBytes();
MessageDigest algorithm = null;
try {
algorithm = MessageDigest.getInstance("MD5");
} catch(NoSuchAlgorithmException e){}
algorithm.reset();
algorithm.update(buf);
byte[] digest = algorithm.digest();
int len = digest.length;
char[] encrypted = new char[len];
for (int i=0;i<len;i++)
encrypted[i] = codes[(int)(Math.floor((double)((digest[i]+128)/4)))];
return new String(encrypted);
}
See this part here:
? That’s where that stuff is accessing the MD5 code that’s built into the Java runtime. You’ll have to come up with your own implementation of MD5 there, which (to put it mildly) will be the tricky part.
All that the posted Java code really does (on top of calling the runtime to do the actual hashing) is to map the resulting hash (part of it, anyway) through a character lookup table.
edit — the lookup table built by that Java code is an array with “$”, the digits, the upper-case letters, the lower-case letters, and then (surprisingly) “£”. (The last character is surprising because it’s not an old-school 7-bit ASCII character code, but whatever.) In JavaScript, that’s:
The Java code then takes each 8-bit byte produced by the hash algorithm and looks up a code character by adding 128 to the byte and then dividing by 4. Java bytes are treated as signed values, so that has the effect of mapping every byte into the range 0 … 63. That value is then used as a lookup into the code array.
Thus if you have a JavaScript MD5 facility that can give you back an array of numbers in the range -128 … 127 (that is, signed 8-bit values), you could translate the result through the code array like this:
EDIT by the OP:
I take the liberty of posting here the right solution, that is highly derived from @Pointy’s one. It requires md5.js from http://pajhome.org.uk/crypt/md5/.