Как я могу 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);
Спасибо заранее!
Ответы
Ответ 1
Ваш код верен, но вы должны удалить экземпляр SHA512Managed:
using (SHA512 shaM = new SHA512Managed())
{
hash = shaM.ComputeHash(data);
}
512 бит - 64 байта.
Чтобы преобразовать строку в массив байтов, вам нужно указать кодировку. UTF8 в порядке, если вы хотите создать хэш-код:
var data = Encoding.UTF8.GetBytes("text");
using (...
Ответ 2
512/8 = 64
, поэтому 64 действительно правильный размер. Возможно, вы захотите преобразовать его в шестнадцатеричный после алгоритма SHA512.
См. также: Как преобразовать байт-массив в шестнадцатеричную строку и наоборот?
Ответ 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;
}