C#和Java中的SHA512是不同的

时间:2017-09-08 08:09:38

标签: java c# visual-studio sha512

在C#和java上有这样的代码,sha512在它们中有所不同,是否有可能以某种方式使结果sha512相同?我理解BaseConverter中的问题,Java中的模拟Base64?试过

Base64.getEncoder().encodeToString(str);

但是由于getEncoder()我得到了一个错误。我需要一个库吗?

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

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

2 个答案:

答案 0 :(得分:7)

您正在散列不同的数据 - 在Java中,您将字符串转换为UTF-16:

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

在C#中你使用的是UTF-8:

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

(我不确定你为什么要创建一个新的UTF8Encoding而不是使用Encoding.UTF8,不可否认。)

使用不同的输入,获得不同的哈希值。

通常,诊断此类问题的方法是比较转换的每个步骤的数据,无论是通过记录还是调试。在这种情况下,您有四个转换:

  • 消息字符串到消息字节
  • 消息字节到散列字节
  • 哈希字节到哈希字符串(十六进制)
  • 反转哈希字符串(十六进制)

下次,检查每个步骤的输出,然后找出问题所在。

(不明显为什么你想要反转十六进制输出,但这是另一回事。)

答案 1 :(得分:0)

问题出现在散列的输入行中(字符串是没有剩余数据的盐,其余的数据是空的,因为EditText的定义中有错误(EditText返回一个空字符串)和还用Java修复了UTF-8的编码。