2016-03-29 6 views
3

次の関数は、署名と検証に証明書を使用します。C#暗号化を使用して署名ハッシュアルゴリズムのフレンドリ名を取得するにはどうすればよいですか?

private static bool Sign_Verify(X509Certificate2 x509, byte[] random_data) 
     { 
      // 
      // Local variable definitions 
      // 
      bool isVerified = false; 
      byte[] buffer = Encoding.Default.GetBytes("Hello World ... !"); 
      byte[] signature_Data = null; 
      byte[] signature_Hash = null; 
      // 
      // Retrieve the private key of the certificate selected. 
      // 
      RSACryptoServiceProvider privateKey 

            = x509.PrivateKey as RSACryptoServiceProvider; 

     if (null == privateKey) 
     { 
      Console.WriteLine("Invalid Private Key"); 
     } // if 
     else 
     { 
      Console.WriteLine("Certificate has private key."); 
     } // else 

     HashAlgorithm hashAlgo = HashAlgorithm.Create("SHA256"); 

     byte[] hash = hashAlgo.ComputeHash(random_data); 

     // 
     // Perform signing using the private key 
     try 
     { 
      signature_Hash = privateKey.SignHash(
                hash, 
                CryptoConfig.MapNameToOID("SHA256")); 
      if (null == signature_Hash) 
      { 
       Console.WriteLine("Error: SignHash\n\n"); 
      } // if 
      else 
      { 
       Console.WriteLine("Signature_Hash generated......\n\n"); 
      } // else 
     } // try 
     catch (CryptographicException) 
     { 
      //e.StackTrace(); 
     } // catch 

     // 
     // Retrieve the public key of the certificate selected. 
     // 
     RSACryptoServiceProvider publicKey 

            = x509.PublicKey.Key as RSACryptoServiceProvider; 
     if (null == publicKey) 
     { 
      Console.WriteLine("Invalid Public Key"); 
     } // if 
     else 
     { 
      Console.WriteLine("Certificate has public key."); 
     } // else 


     isVerified = publicKey.VerifyHash(
               hash, 
               CryptoConfig.MapNameToOID("SHA256"), 
               signature_Hash); 
     if (false == isVerified) 
     { 
      Console.WriteLine("Signature of Hash verification failed."); 
     } // if 
     else 
     { 
      Console.WriteLine("Signature of Hash verified successfully."); 
     } // else 

     return isVerified; 
    } // Sign_Verify 

HashAlgorithm.Create( "SHA256")では、署名ハッシュアルゴリズムの名前をハードコーディングしています。ハードコーディングする代わりに、証明書の署名ハッシュアルゴリズムの名前を取得する方法?

答えて

1

.NETの証明書から署名ハッシュアルゴリズムを取得する簡単な方法はないようです。署名アルゴリズムのOIDに

cert.SignatureAlgorithm.Value; 

を得ることができる何をすることはまず次に、あなただけのSHA256(暗号化せず、単にハッシュアルゴリズムのOIDまたは名前に(これはRSA暗号化を例SHA256のためにすることができます)何とかこのOIDをマップする必要がありますされ)。このようなマップを自分で作成することも、既存のマップを使用することもできます。例えば、Bouncy Castleライブラリには1つあります。残念ながら、それは内部クラスでそれを含んでいるので、あなたはそれに到達するためにいくつかのリフレクションを使用する必要があります。それでは、(nugetを経由して)最初弾む城への参照を追加します。

var mapField = typeof(Org.BouncyCastle.Cms.CmsSignedData).Assembly.GetType("Org.BouncyCastle.Cms.CmsSignedHelper").GetField("digestAlgs", BindingFlags.Static | BindingFlags.NonPublic); 
var map = (System.Collections.IDictionary) mapField.GetValue(null); 

これは、あなたが必要とするだけのマップが含まれている内部CmsSignedHelperクラスのプライベートdigestAlgsフィールドの値を取得します。

は、次に、あなたがない:

var hashAlgName = (string)map[cert.SignatureAlgorithm.Value];// returns "SHA256" for OID of sha256 with RSA. 
var hashAlg = HashAlgorithm.Create(hashAlgName); // your SHA256 
+0

CmsSignedDataとIDictionaryをが不足している名前空間を持っていると私はSystem.Security.Cryptography.Pkcsとして名前空間を追加しています。それでも同じ名前空間エラーがあります。 – user5271376

+0

.Net Framework 4 0r 4.5がBouncy Castleライブラリをサポートしているかどうかを教えてください。Boucny Castleライブラリは一度も使用していません。 – user5271376

+0

確かにそうです。 nuget package managerを使用する場合は、 "Bouncy Castle"を検索し、そのパッケージをインストールしてください。あなたがナゲットを使用しない場合 - ここではこのライブラリの開発者のサイトに直接リンクしています - http://www.bouncycastle.org/csharp/download/bccrypto-csharp-1.8.1-bin.zip解凍し、dllへの参照をプロジェクトに追加します。 – Evk

関連する問題