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

Java 與 C++ 實現一致的 MD5 加密算法

     編輯:Java 相關知識

Java 實現

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());
    }
}

C++ 實現

md5.h

#ifndef MD5_H
#define MD5_H
#include <string>
void MD5Digest(const char* pszInput, unsigned long nInputSize, char* pszOutPut);
#endif

md5.cpp (核心算法)

// 標準 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" 驗證:

  • Java 輸出: E10ADC3949BA59ABBE56E057F20F883E
  • C++ 輸出: E10ADC3949BA59ABBE56E057F20F883E

大小寫統一後完全一致。

關鍵一致性保證點

  1. 編碼統一:雙端均使用 UTF-8 字節流
  2. 填充標準:遵循 RFC 1321 標準填充 (0x80 + 0填充 + 長度)
  3. 位序處理:小端序輸出,每字節高位在前
  4. 大小寫:十六進制輸出統一大寫或小寫比對

常見坑點

  • Java message.getBytes() 無參數時使用平台默認編碼,**必須指定 UTF-8**
  • C++ char 有符號性導致位運算錯誤,需轉 unsigned char
  • Java b & 0xff 確保字節無符號化,C++ 對應 (unsigned char)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved