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); }
每輪調用對應函數,加入常量、左循環位移、鏈接加法。共 64 步操作,分 4 輪各 16 步,使用不同的移位常量 (S11-S44) 和正弦派生常量 (0xd76aa478 等)。
md5Update():分塊處理輸入數據,調用 md5Transform()md5Final():添加填充、附加長度、最終變換、輸出到 digestEncode/Decode:long[] (低 32 位) ↔ byte[] 互轉b2iu(byte):無符號字節 → 正長整數byteHEX(byte):字節 → 兩位大寫十六進制字符MD5 md5 = new MD5();
String hash = md5.getMD5ofStr("Hello World");
System.out.println(hash); // 輸出 32 位十六進制字符串
java.security.MessageDigest注意:MD5 已不適合安全敏感場景(碰撞攻擊風險),新項目請使用 SHA-256 或更強算法。