我如何在 java 中使用相同的 c# sha512

How can i use the same sha512 of c# in java

这是c#中使用的代码

public static string Encode_SHA512(string input) {
    try {
           using (SHA512 sha = SHA512.Create()) {
           byte[] hash = sha.ComputeHash(Encoding.Unicode.GetBytes(input));
           return Convert.ToBase64String(hash);
        }
    } catch (Exception ex) {
        throw new Exception("Error al generar hash SHA512", ex);
    }
}

这是java中使用的代码(多次尝试之一)

public static String Encode_SHA512(String input) {
    MessageDigest md = MessageDigest.getInstance("SHA-512");
    byte[] digest = md.digest(input.getBytes("UTF-16LE"));
    return String.format("%0128x", new BigInteger(1, digest));
}

但总是结果不同。如何在java?

中使用相同的C#代码加密

问题出在您的 Java 版本中,您没有正确转换为 base64 编码的字符串。如果您将 Java 代码更新为以下内容,那么它们都会产生相同的哈希值:

   public static String Encode_SHA512(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        byte [] inputBytes = input.getBytes("UTF-16LE");
        byte[] digest = md.digest(inputBytes);
        return Base64.getEncoder().encodeToString(digest);
    }

return String.format("%0128x", new BigInteger(1, digest)); 替换为 return Base64.getEncoder().encodeToString(digest);,目前 base 64 对结果哈希进行编码。也许代码令人困惑的原因是 digest 方法生成的 byte[] 看起来与 Java 中的不同,字节类型是二进制补码(已签名),因此 -128 到 + 127 而在 C# 中,它是无符号的,因此在 0 到 255 之间,因此在调试器中,任何以 1 开头的字节看起来都不一样,因为它在 Java 中显示为负数,但在 C# 中显示为正数。