Как я могу SHA512 строку в С#? - программирование
Подтвердить что ты не робот

Как я могу SHA512 строку в С#?

Я пытаюсь написать функцию, чтобы взять строку и sha512 это так?

public string SHA512(string input)
{
     string hash;

     ~magic~

     return hash;
}

Какая должна быть магия?

P.S. Я попробовал следующее, но hash продолжал заканчиваться как 64-битный (не 128, как ожидалось).

byte[] data = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
byte[] hash;
SHA512 shaM = new SHA512Managed();
hash = shaM.ComputeHash(data);

Спасибо заранее!

4b9b3361

Ответ 1

Ваш код верен, но вы должны удалить экземпляр SHA512Managed:

using (SHA512 shaM = new SHA512Managed())
{
   hash = shaM.ComputeHash(data);
}

512 бит - 64 байта.

Чтобы преобразовать строку в массив байтов, вам нужно указать кодировку. UTF8 в порядке, если вы хотите создать хэш-код:

var data = Encoding.UTF8.GetBytes("text");    
using (...

Ответ 3

Это один из моих проектов:

public static string SHA512(string input)
{
    var bytes = System.Text.Encoding.UTF8.GetBytes(input);
    using (var hash = System.Security.Cryptography.SHA512.Create())
    {
        var hashedInputBytes = hash.ComputeHash(bytes);

        // Convert to text
        // StringBuilder Capacity is 128, because 512 bits / 8 bits in byte * 2 symbols for byte 
        var hashedInputStringBuilder = new System.Text.StringBuilder(128);
        foreach (var b in hashedInputBytes)
            hashedInputStringBuilder.Append(b.ToString("X2"));
        return hashedInputStringBuilder.ToString();
    }
}

Обратите внимание:

  • Объект SHA512 расположен (раздел "использование" ), поэтому у нас нет утечек ресурсов.
  • StringBuilder используется для эффективного создания шестнадцатеричных строк.

Ответ 4

Я не уверен, почему вы ожидаете 128.

8 бит в байте. 64 байта. 8 * 64 = хэш в 512 бит.

Ответ 5

Из Документация MSDN:
Размер хэша для алгоритма SHA512Managed составляет 512 бит.

Ответ 6

Вы можете использовать класс System.Security.Cryptography.SHA512

MSDN на SHA512

Вот пример, straigt из MSDN

byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);

Ответ 7

UnicodeEncoding UE = new UnicodeEncoding();            
        byte[] message = UE.GetBytes(password);
        SHA512Managed hashString = new SHA512Managed();
        string hexNumber = "";
        byte[]  hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hexNumber += String.Format("{0:x2}", x);
        }
        string hashData = hexNumber;

Ответ 8

Вместо WinCrypt-API с использованием System.Security.Cryptography вы также можете использовать BouncyCastle:

public static byte[] SHA512(string text)
{
    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(text);

    Org.BouncyCastle.Crypto.Digests.Sha512Digest digester = new Org.BouncyCastle.Crypto.Digests.Sha512Digest();
    byte[] retValue = new byte[digester.GetDigestSize()];
    digester.BlockUpdate(bytes, 0, bytes.Length);
    digester.DoFinal(retValue, 0);
    return retValue;
}

Если вам нужна версия HMAC (чтобы добавить аутентификацию к хэшу)

public static byte[] HmacSha512(string text, string key)
{
    byte[] bytes = Encoding.UTF8.GetBytes(text);

    var hmac = new Org.BouncyCastle.Crypto.Macs.HMac(new Org.BouncyCastle.Crypto.Digests.Sha512Digest());
    hmac.Init(new Org.BouncyCastle.Crypto.Parameters.KeyParameter(System.Text.Encoding.UTF8.GetBytes(key)));

    byte[] result = new byte[hmac.GetMacSize()];
    hmac.BlockUpdate(bytes, 0, bytes.Length);
    hmac.DoFinal(result, 0);

    return result;
}