55

文字列を取り、sha512 を取得する関数を作成しようとしています。

public string SHA512(string input)
{
     string hash;

     ~magic~

     return hash;
}

魔法はどうあるべきですか?

4

11 に答える 11

87

コードは正しいですが、SHA512Managed インスタンスを破棄する必要があります。

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

512 ビットは 64 バイトです。

文字列をバイト配列に変換するには、エンコーディングを指定する必要があります。ハッシュ コードを作成する場合は、UTF8 で問題ありません。

var data = Encoding.UTF8.GetBytes("text");    
using (...
于 2012-07-06T18:33:08.977 に答える
8

512/8 = 64、したがって、64 は確かに正しいサイズです。おそらく、SHA512 アルゴリズムので 16 進数に変換したいでしょう。

参照:バイト配列を 16 進文字列に、またはその逆に変換するにはどうすればよいですか?

于 2012-07-06T18:32:02.550 に答える
2

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;
}
于 2016-09-21T10:36:40.373 に答える
1

なぜ128を期待しているのかわかりません。

1 バイトで 8 ビット。64 バイト。8 * 64 = 512 ビット ハッシュ。

于 2012-07-06T18:32:00.900 に答える
1

MSDN ドキュメントから:
SHA512Managed アルゴリズムのハッシュ サイズは 512 ビットです。

于 2012-07-06T18:33:00.393 に答える
1

System.Security.Cryptography.SHA512 クラスを使用できます

SHA512 に関する MSDN

MSDN からのストレートな例を次に示します。

byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA512 shaM = new SHA512Managed();
result = shaM.ComputeHash(data);
于 2012-07-06T18:34:29.050 に答える
1

シンプルに保つ:

using (SHA512 sha512 = new SHA512Managed())
{
    password = Encoding.UTF8.GetString(sha512.ComputeHash(Encoding.UTF8.GetBytes(password)));
}
于 2021-07-20T20:49:11.893 に答える
0
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;
于 2015-06-02T10:45:29.033 に答える