25

多くのフォーラムと例を確認しましたが、どれも役に立ちませんでした。Web サービスからの署名を確認する必要があります。検証用の公開鍵を含む test.crt ファイルがあります。

static bool Verify(string text, string signature)
{
  X509Certificate2 cert = new X509Certificate2(
      HttpContext.Current.Server.MapPath("test-server.cert"));
  RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key;

  // Hash the data
  SHA1Managed sha1 = new SHA1Managed();
  UnicodeEncoding encoding = new UnicodeEncoding();
  byte[] data = encoding.GetBytes(text);
  byte[] sign = Convert.FromBase64String(signature);
  byte[] hash = sha1.ComputeHash(data);

  return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign);
}

しかし、結果は常に false :(

OpenSSL の例があります。

openssl base64 -d -in signature -out signature.bin
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway
4

1 に答える 1

1

UnicodeEncoding の使用が失敗の原因であると思われます。以下に示すように、ASCII は 8 ビット エンコーディングであり、Windows では Unicode エンコーディングは 16 ビット幅であるため、ASCIIEncoding と UnicodeEncoding のバイトは同じではありません。あなたの他の質問Can't get signatureでは、ASCIIEncoding を使用しました。したがって、署名がテキスト/文字列の ASCIIEncoding バイトで計算され、UnicodeEncoding を使用して検証すると、明らかに一致しません。

string text = "Hello";
Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length);
Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length);

出力

ASCIIEncoding bytes length: 5
UnicodeEncoding bytes length: 10
于 2012-10-04T08:16:24.190 に答える