文字列を取り、sha512 を取得する関数を作成しようとしています。
public string SHA512(string input)
{
string hash;
~magic~
return hash;
}
魔法はどうあるべきですか?
コードは正しいですが、SHA512Managed インスタンスを破棄する必要があります。
using (SHA512 shaM = new SHA512Managed())
{
hash = shaM.ComputeHash(data);
}
512 ビットは 64 バイトです。
文字列をバイト配列に変換するには、エンコーディングを指定する必要があります。ハッシュ コードを作成する場合は、UTF8 で問題ありません。
var data = Encoding.UTF8.GetBytes("text");
using (...
512/8 = 64
、したがって、64 は確かに正しいサイズです。おそらく、SHA512 アルゴリズムの後で 16 進数に変換したいでしょう。
System.Security.Cryptography を使用する WinCrypt-API の代わりに、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;
}
なぜ128を期待しているのかわかりません。
1 バイトで 8 ビット。64 バイト。8 * 64 = 512 ビット ハッシュ。
MSDN ドキュメントから:
SHA512Managed アルゴリズムのハッシュ サイズは 512 ビットです。
System.Security.Cryptography.SHA512 クラスを使用できます
MSDN からのストレートな例を次に示します。
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);
シンプルに保つ:
using (SHA512 sha512 = new SHA512Managed())
{
password = Encoding.UTF8.GetString(sha512.ComputeHash(Encoding.UTF8.GetBytes(password)));
}
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;