2011-05-24 74 views
0

我有這個自定義函數來計算MD5哈希,用Java編寫。我無法改變它。我需要將它翻譯成JavaScript以便在客戶端使用它。我嘗試了我自己的,但我無法管理JavaScript數據類型(特別是Java char[])...任何幫助表示讚賞,謝謝!如何將這個定製的MD5 Java函數翻譯成JavaScript

// 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); 
} 
+0

如果你鍵入谷歌:「MD5的javascript」有很多現有的庫 – Mic 2011-05-24 13:02:42

+0

的,但可能沒有LIB此*定製* MD5 – bluish 2011-05-24 13:19:17

+0

的解決方案已經給出,但你不應該命名此*定製MD5 * - 它不是一個自定義的MD5(沒有這樣的事情 - 如果它是自定義的,它不是MD5),它只是MD5的自定義編碼。 – 2011-05-24 21:08:15

回答

2

請參見本部分在這裏:

MessageDigest algorithm = null; 
    try{ 
    algorithm = MessageDigest.getInstance("MD5"); 
    }catch(NoSuchAlgorithmException e){} 

?這就是訪問Java運行時內置的MD5代碼的地方。你必須在那裏提出你自己的MD5實現,這將會是棘手的部分。

所有發佈的Java代碼確實(在調用運行時執行實際散列操作之上)是通過字符查找表映射生成的散列(無論如何,它的一部分)。

編輯 —由Java代碼構建的查找表是與「$」,數字,大寫字母,小寫字母,且然後(令人驚奇地)「£」的陣列。 (最後一個字符是令人驚訝的,因爲它不是一個老派的7位ASCII字符代碼,但不管)在JavaScript中,這就是:

var codes = "$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz£"; 

Java代碼則需要由哈希生成的每個8位字節算法,並通過將128加到字節然後除以4來查找代碼字符。Java字節被視爲帶符號的值,因此它具有將每個字節映射到範圍0 ... 63的效果。然後使用該值作爲代碼數組的查找。

因此,如果您有一個JavaScript MD5工具,可以返回範圍爲-128 ... 127(即帶符號的8位值)的數字數組,您可以通過代碼數組像這樣:

var digest = MagicJavaScriptMD5(source); 
var result = []; 
for (var i = 0; i < digest.length; ++i) 
    result.push(codes.charAt(~~((digest[i] + 128)/4))); 
var resultString = result.join(''); 

編輯由OP: 我把這裏張貼正確的解決方案的自由,即從高尖@的一個衍生。它需要http://pajhome.org.uk/crypt/md5/中的md5.js。

/* MD5 in byte[] format */ 
function byteArray_md5(s) { 
     var output = []; 
     var input = rstr_md5(str2rstr_utf8(s)); //here it uses md5.js 
     for(var i = 0; i < input.length; i++) 
       output[i] = input.charCodeAt(i); 
     return output; 
} 
/* MD5 with custom mapping. 
* It's a normal MD5 with a final char mapping of the hash. 
*/ 
function md5WithCustomMapping(source) { 
    var codes = "$ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz£"; 
    var digest = byteArray_md5(source); 

    var result = []; 
    for (var i = 0; i < digest.length; ++i) 
     result.push(
       codes.charAt(
         ~~((digest[i] + 128 * (digest[i]<128 ? 1 : -1))/4) 
         ) 
        ); 
    return result.join(''); 
} 
+0

你是對的!我的問題是:如何在JavaScript中管理char數組? – bluish 2011-05-24 13:20:36

+0

JavaScript字符串至少在某種程度上或多或少地像Java char數組一樣工作。當然,爲了該映射的目的,JavaScript字符串應該可以工作。我會更新我的答案。 – Pointy 2011-05-24 14:07:39

相關問題