2009-12-16 68 views
2

我想自己實現CRC32和MD5算法,但我仍然試圖圍繞我在這個主題上找到的不同來源進行研究。有人能幫助我指出一個資源,它以簡單的格式解釋算法,或者發佈不同步驟的子彈列表,以便我可以嘗試填充它們。TIA。傻瓜式的CRC32和MD5算法

下面是各自的維基百科頁面。我理解正在做的事情的一部分,但按位操作是我遇到的困難。那和數學不是我的特長。

http://en.wikipedia.org/wiki/Cyclic_redundancy_check
http://en.wikipedia.org/wiki/MD5

+0

您的公司從事什麼語言? – Skilldrick

+0

我在Java中工作,但我想爲Unrealscript的早期版本做這個,它沒有這些內置函數。 –

+0

@高性能標記:我確實瞭解基本級別的按位運算。看來關於這個主題的文章對讀者以前的知識做了一些假設(因此是「傻瓜」的標題)。我會看看這個週末我是否可以解決CRC問題,因爲這是最簡單的。 –

回答

1

根據DRY你應該做

final public class Security { 

    synchronized public static String MD5(String msg) { 
     try { 
      MessageDigest md = MessageDigest.getInstance("MD5"); 
      md.update(msg.getBytes()); 
      byte[] digest = md.digest(); 
      return new BigInteger(1, digest).toString(16); 
     } catch (NoSuchAlgorithmException ex) { 
      return "" + msg.hashCode(); 
     } 
    } 
} 

但如果你真的想弄清楚是怎麼回事了MD5/SHA1等,你應該採取的安全性過程中,我試過但是失敗了:(祝你好運!)

+0

安全課程有助於增加您的理解。但除非安全性是您的核心業務,否則我建議您不要嘗試自己實施算法。 – Onots

+0

這個MD5的例子是有缺陷的。它在字節<0x10「的情況下不以0爲前綴,它也依賴於平臺默認字符編碼,其本身可能不是正確的編碼。 – BalusC

2

關於MD5的RFC-1321 spec也包含了對算法的詳細解釋,W關於CRC的iki文章非常清楚。

畢竟,您的主要問題顯然實際上是對二進制系統和位運算符的無知。以下是有關二元體系的幾個優秀導遊員和參與運營商:

這一定讓你開始。

編輯:如果你想homegrow一個MD5函數的實際原因是,你實際上似乎無法找到Java中的現有功能,那麼你會發現這個片斷非常有用:

/** 
* Generate MD5 hash for the given String. 
* @param string The String to generate the MD5 hash for. 
* @return The 32-char hexadecimal MD5 hash of the given String. 
*/ 
public static String hashMD5(String string) { 
    byte[] hash; 

    try { 
     hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8")); 
    } catch (NoSuchAlgorithmException e) { 
     // Unexpected exception. "MD5" is just hardcoded and supported. 
     throw new RuntimeException("MD5 should be supported?", e); 
    } catch (UnsupportedEncodingException e) { 
     // Unexpected exception. "UTF-8" is just hardcoded and supported. 
     throw new RuntimeException("UTF-8 should be supported?", e); 
    } 

    StringBuilder hex = new StringBuilder(hash.length * 2); 
    for (byte b : hash) { 
     if ((b & 0xff) < 0x10) hex.append("0"); 
     hex.append(Integer.toHexString(b & 0xff)); 
    } 
    return hex.toString(); 
}