public class MD5Hash {
public static String md5Java(String message) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest(message.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder(2 * hash.length);
for (byte b : hash) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
} catch (Exception e) {
throw new RuntimeException("MD5 計算失敗", e);
}
}
public static void main(String[] args) {
System.out.println(md5Java("admin").toUpperCase());
}
}
#ifndef MD5_H #define MD5_H #include <string> void MD5Digest(const char* pszInput, unsigned long nInputSize, char* pszOutPut); #endif
// 標準 RFC 1321 實現,包含:
// 1. MD5_CTX 上下文結構
// 2. 四輪非線性函數 F/G/H/I
// 3. 位運算循環左移 ROTATE_LEFT
// 4. 填充、分組、迭代壓縮
// 5. 最終輸出 16 字節摘要
// 關鍵點:輸入 UTF-8 編碼字節流,與 Java 保持一致
void MD5Digest(char* pszInput, unsigned long nInputSize, char* pszOutPut) {
MD5_CTX context;
MD5Init(&context);
MD5Update(&context, (unsigned char*)pszInput, nInputSize);
MD5Final((unsigned char*)pszOutPut, &context);
}
int main() {
char szDigest[16];
char input[200];
printf("輸入字符串: ");
gets(input);
MD5Digest(input, strlen(input), szDigest);
printf("MD5: ");
for (int i = 0; i < 16; i++)
printf("%02X", (unsigned char)szDigest[i]);
return 0;
}
輸入 "123456" 驗證:
E10ADC3949BA59ABBE56E057F20F883EE10ADC3949BA59ABBE56E057F20F883E大小寫統一後完全一致。
message.getBytes() 無參數時使用平台默認編碼,**必須指定 UTF-8**char 有符號性導致位運算錯誤,需轉 unsigned charb & 0xff 確保字節無符號化,C++ 對應 (unsigned char)