8

PythonWebサービスがあります。パラメータとしてハッシュが必要です。Pythonのハッシュはこの方法で生成されます。

    hashed_data = hmac.new("ant", "bat", hashlib.sha1)
    print hashed_data.hexdigest()

さて、これは私がC#からハッシュを生成する方法です。

    ASCIIEncoding encoder = new ASCIIEncoding();
    Byte[] code = encoder.GetBytes("ant");
    HMACSHA1 hmSha1 = new HMACSHA1(code);
    Byte[] hashMe = encoder.GetBytes("bat");
    Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
    Console.WriteLine(Convert.ToBase64String(hmBytes));

しかし、私は別の結果を出している。

ハッシュの順序を変更する必要がありますか?

ありがとうございました、

ジョン

4

1 に答える 1

20

結果を印刷するには:

  • Pythonでは、次を使用します。.hexdigest()
  • C#では、次を使用します。Convert.ToBase64String

これらの2つの関数はまったく同じことをしません。Pythonのhexdigestは、バイト配列を16進文字列に変換するだけですが、C#メソッドはBase64エンコーディングを使用してバイト配列を変換します。したがって、同じ出力を取得するには、関数を定義するだけです。

public static string ToHexString(byte[] array)
{
    StringBuilder hex = new StringBuilder(array.Length * 2);
    foreach (byte b in array)
    {
        hex.AppendFormat("{0:x2}", b);
    }
    return hex.ToString();
}

その後:

ASCIIEncoding encoder = new ASCIIEncoding();
Byte[] code = encoder.GetBytes("ant");
HMACSHA1 hmSha1 = new HMACSHA1(code);
Byte[] hashMe = encoder.GetBytes("bat");
Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
Console.WriteLine(ToHexString(hmBytes));

これで、Pythonと同じ出力が得られます。

739ebc1e3600d5be6e9fa875bd0a572d6aee9266
于 2012-08-03T07:02:25.487 に答える