SHA512 in C # and Java are different

There is such code on C # and java, sha512 in them differs, whether it is possible to make somehow that the result sha512 was identical? I understand the problem in BaseConverter, analog Base64 in Java? Tried

Base64.getEncoder().encodeToString(str);

But I get an error because of getEncoder(). Do I need a library for this?

Code in C#:

public string Hash(string str)
{
      string resultStr = String.Empty;
      byte[] data = new UTF8Encoding().GetBytes(str);
      byte[] result;

      SHA512 shaM = new SHA512Managed();
      result = shaM.ComputeHash(data);
      resultStr = ReverseString(BitConverter.ToString(result).ToLower().Replace("-", String.Empty));

      return resultStr.Substring(5, 25);
}       

public static string ReverseString(string s)
{
      char[] charArray = s.ToCharArray();
      Array.Reverse(charArray);
      return new string(charArray);
}

Code in Java:

public String Hash(String str) {
    try {
        MessageDigest digest = MessageDigest.getInstance("SHA-512");
        digest.update(str.getBytes("UTF-16LE"));
        byte messageDigest[] = digest.digest();
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < messageDigest.length; i++) {
            String h = Integer.toHexString(0xFF & messageDigest[i]);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        }
        result = hexString.toString().toLowerCase();

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    return ReverseString(result).substring(5, 25);
}

 public static String ReverseString(String s)
    {
        return new StringBuilder(s).reverse().toString();
    }
Jon Skeet
people
quotationmark

You're hashing different data - in Java you're converting the string to UTF-16:

digest.update(str.getBytes("UTF-16LE"));

In C# you're using UTF-8:

byte[] data = new UTF8Encoding().GetBytes(str);

(I'm not sure why you're creating a new UTF8Encoding rather than using Encoding.UTF8, admittedly.)

With different input, you will get different hashes.

In general, the way to diagnose problems like this is to compare the data at every step of the transformation, whether that's through logging or debugging. In this case you have four transformations:

  • Message string to message bytes
  • Message bytes to hash bytes
  • Hash bytes to hash string (hex)
  • Reversed hash string (hex)

Next time, check the output of each step, and you'll work out where the problem is.

(It's not obvious why you'd want to reverse the hex output anyway, but that's a different matter.)

people

See more on this question at Stackoverflow