6

私は持っている:

  1. x509 証明書 (Base64);
  2. 文字列データ。
  3. 文字列データの署名 (Base64)。

署名を確認することはできますか?

私のコード:

  bool valid = false;

  var signature = Convert.FromBase64String(base64Signature);
  var data = Encoding.UTF8.GetBytes(stringData);

  var x509 = new X509Certificate2(Convert.FromBase64String(certificate));
  var dsa = x509.PublicKey.Key as DSACryptoServiceProvider;
  if (dsa!=null)
    valid = dsa.VerifySignature(data, signature);
  else {
    var rsa = x509.PublicKey.Key as RSACryptoServiceProvider;
    if (rsa!=null)
      valid = rsa.VerifyHash(data, ???, signature);
  }

???の代わりに何を使えばいいのかわからない。証明書からハッシュアルゴリズムを取得することは可能ですか?

4

1 に答える 1

5

元のメッセージの送信者は、証明書に対応する秘密鍵を使用して、好きなアルゴリズムを使用してメッセージに署名できます。SignatureAlgorithm プロパティから証明書の署名に使用されるアルゴリズムの OID を取得できますが、送信者が別の署名またはハッシュ アルゴリズムを使用することを妨げるものは何もありません。

ドキュメントによると、RSA プロバイダーで有効なハッシュ アルゴリズムは SHA1 と MD5 のみです。おそらく、両方のアルゴリズムで VerifyHash を試して、どちらが成功するかを確認する必要があります。次のように、 CryptoConfig.MapNameToOIDメソッドを使用して、それぞれに適切な OID を取得できます。

string sha1Oid = CryptoConfig.MapNameToOID("SHA1");
string md5Oid = CryptoConfig.MapNameToOID("MD5");
bool sha1Valid = rsa.VerifyHash(data, sha1Oid, signature);
bool md5Valid = rsa.VerifyHash(data, md5Oid, signature);
valid = sha1Valid || md5Valid;
于 2010-07-16T12:55:59.837 に答える