Сделайте так, чтобы хэш MD5 JAVA соответствовал хэшу MD5 C#

#java #c# #encryption #hwid

Вопрос:

Моя работа состоит в том, чтобы переписать кучу Java-кодов на C#. Это код JAVA:

         public static String CreateMD5(String str) {
    try {
        byte[] digest = MessageDigest.getInstance("MD5").digest(str.getBytes("UTF-8"));
        StringBuffer stringBuffer = new StringBuffer();
        for (byte b : digest) {
    // i can not understand here
            stringBuffer.append(Integer.toHexString((b amp; 255) | 256).substring(1, 3));
        }
        return stringBuffer.toString();
    } catch (UnsupportedEncodingException | NoSuchAlgorithmException unused) {
        return null;
    }
}
 

ОК.Как вы можете видеть, этот код пытается создать хэш MD5.Но чего я не могу понять, так это той части, которую я показал.
Я попробовал этот код на C#, чтобы переписать этот JAVA-код:

     public static string CreateMD5(string input)
    {
// Use input string to calculate MD5 hash
using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
{
    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
    byte[] hashBytes = md5.ComputeHash(inputBytes);

    // Convert the byte array to hexadecimal string
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hashBytes.Length; i  )
    {
        sb.Append(hashBytes[i].ToString("X2"));
    }
    return sb.ToString();
}
    }
 

Ну, оба кода создают хэш-строки MD5, но результаты разные.

Ответ №1:

Существует разница в кодировке между двумя фрагментами кода, которые вы показали — в вашем коде Java используется UTF-8, но в коде C# используется ASCII. Это приведет к другому вычислению хэша MD5.

Измените свой код C# с:

 byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
 

Для:

 byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input);
 

Это должно помочь решить вашу проблему, при условии, что нет других ошибок преобразования кода.