JAVA MD5算法

JAVA MD5算法 

MD5即Message-Digest Algorithm 5(信息-摘要算法5),是一種用於產生數字簽名的單項散列算法。

MD5算法的作用是讓大容量信息在用數字簽名軟件籤私人密匙前被”壓縮”成一種保密的格式,將一個任意長度的“字節串”通過一個不可逆的字符串變換算法變換成一個128bit的大整數.

即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數學原理上說,是因爲原始的字符串有無窮多個,這有點象不存在反函數的數學函數。

Java 中,java.security.MessageDigest 中已經定義了 MD5 的計算,我們只需要簡單地調用即可得到 MD5 的128 位整數,然後將此 128 位計 16 個字節轉換成 16 進製表示即可。

[java] view plaincopy
  1. package edu.bjtu;  
  2. /** 
  3. * MD5的算法在RFC1321 中定義 
  4. * 在RFC 1321中,給出了Test suite用來檢驗你的實現是否正確: 
  5. * MD5 ("") = d41d8cd98f00b204e9800998ecf8427e 
  6. * MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 
  7. * MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 
  8. * MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 
  9. * MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b 
  10. * 
  11. * @author yilee 
  12. * 
  13. * 傳入:一個字節數組 
  14. * 傳出:字節數組的 MD5 結果字符串 
  15. */  
  16. public class MD5 {  
  17.     public static String getMD5(byte[] source) {  
  18.         String s = null;  
  19.         char hexDigits[] = { // 用來將字節轉換成 16 進製表示的字符  
  20.             '0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f'};  
  21.         try {  
  22.             java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");  
  23.             md.update(source);  
  24.             byte tmp[] = md.digest();          // MD5 的計算結果是一個 128 位的長整數,  
  25.             // 用字節表示就是 16 個字節  
  26.             char str[] = new char[16 * 2];   // 每個字節用 16 進製表示的話,使用兩個字符,  
  27.             // 所以表示成 16 進制需要 32 個字符  
  28.             int k = 0;                                // 表示轉換結果中對應的字符位置  
  29.             for (int i = 0; i < 16; i++) {    // 從第一個字節開始,對 MD5 的每一個字節  
  30.                 // 轉換成 16 進制字符的轉換  
  31.                 byte byte0 = tmp[i];  // 取第 i 個字節  
  32.                 str[k++] = hexDigits[byte0 >>> 4 & 0xf];  // 取字節中高 4 位的數字轉換,  
  33.                 // >>> 爲邏輯右移,將符號位一起右移  
  34.                 str[k++] = hexDigits[byte0 & 0xf];   // 取字節中低 4 位的數字轉換  
  35.             }  
  36.             s = new String(str);  // 換後的結果轉換爲字符串  
  37.    
  38.         } catch (Exception e) {  
  39.             e.printStackTrace();  
  40.         }  
  41.         return s;  
  42.     }  
  43. }  

測試如下:

[java] view plaincopy
  1. import edu.bjtu.*;  
  2. public class Test {  
  3. // 計算 "a" 的 MD5 代碼,應該爲:0cc175b9c0f1b6a831c399e269772661  
  4.     public static void main(String xu[]) {  
  5.         System.out.println(MD5.getMD5("a".getBytes()));  
  6.     }  
  7. }  





轉載至:http://www.cnblogs.com/youxin/archive/2011/10/16/2214434.html 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章