首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 純實現 MD5 消息摘要算法:從 RFC1321 移植的完整源碼解析與使用示例

     編輯:Java 相關知識

算法常量與填充

static final int S11=7, S12=12, S13=17, S14=22;
static final int S21=5, S22=9, S23=14, S24=20;
static final int S31=4, S32=11, S33=16, S34=23;
static final int S41=6, S42=10, S43=15, S44=21;

static final byte[] PADDING = {
    (byte)0x80, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
};

核心狀態變量

private long[] state = new long[4];  // ABCD
private long[] count = new long[2];  // 位長度 (mod 2^64)
private byte[] buffer = new byte[64]; // 數據緩衝區
private byte[] digest = new byte[16]; // 128-bit 結果
public String digestHexStr;           // 十六進制字符串結果

公開入口

public String getMD5ofStr(String inbuf) {
    md5Init();
    md5Update(inbuf.getBytes(), inbuf.length());
    md5Final();
    digestHexStr = "";
    for (int i=0; i<16; i++) digestHexStr += byteHEX(digest[i]);
    return digestHexStr;
}

四輪非線性函數

private long F(long x,long y,long z) { return (x & y) | (~x & z); }
private long G(long x,long y,long z) { return (x & z) | (y & ~z); }
private long H(long x,long y,long z) { return x ^ y ^ z; }
private long I(long x,long y,long z) { return y ^ (x | ~z); }

輪變換 (FF/GG/HH/II)

每輪調用對應函數,加入常量、左循環位移、鏈接加法。共 64 步操作,分 4 輪各 16 步,使用不同的移位常量 (S11-S44) 和正弦派生常量 (0xd76aa478 等)。

關鍵輔助方法

  • md5Update():分塊處理輸入數據,調用 md5Transform()
  • md5Final():添加填充、附加長度、最終變換、輸出到 digest
  • Encode/Decode:long[] (低 32 位) ↔ byte[] 互轉
  • b2iu(byte):無符號字節 → 正長整數
  • byteHEX(byte):字節 → 兩位大寫十六進制字符

使用示例

MD5 md5 = new MD5();
String hash = md5.getMD5ofStr("Hello World");
System.out.println(hash); // 輸出 32 位十六進制字符串

適用場景

  • 學習 MD5 算法內部原理(RFC1321 參考實現)
  • 受限環境無法使用 java.security.MessageDigest
  • 需要自定義輸出格式或中間狀態檢查

注意:MD5 已不適合安全敏感場景(碰撞攻擊風險),新項目請使用 SHA-256 或更強算法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved