2017-01-11 17 views
0

Это код, используемый в C#Как я могу использовать те же SHA512 из C# в Java

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

Но всегда результат другой. Как я могу использовать одно и то же шифрование кода C# в java?

+2

Ваш код никогда не преобразуется в base64. Если ошибка сохраняется, причиной может быть различное заполнение или кодировка символов. – Paul

+1

Пожалуйста, отлаживайте свой код и выясните, откуда взялась разница. Удостоверьтесь, что он сначала работает для массива из 4 байтов, а затем добавляет байтовую байтовую логику. –

+1

Вы вполне уверены, что 'input.getBytes (« UTF-16LE ») и' Encoding.Unicode.GetBytes (input) 'используют одну и ту же кодировку? –

ответ

2

Проблема в вашей версии 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);, который в настоящее время базировать 64 кодирует результирующий хэш. Возможно, почему код запутался в том, что byte[], созданный методом digest, выглядел иначе, как в Java, байтовый тип является дополнением (который подписан), от -128 до + 127, тогда как в C# он без знака, поэтому от 0 до 255, следовательно, в отладчик любой байт, начинающийся с 1, будет выглядеть по-другому, поскольку он будет казаться отрицательным в Java, но положительным в C#.

+0

Спасибо, что отлично работает сейчас. –