2016-03-29 10 views
3

Die folgende Funktion verwendet ein Zertifikat zum Signieren und Verifizieren.Wie kann der Name des Signatur-Hash-Algorithmus unter Verwendung der C# -Kryptografie abgerufen werden?

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 

Im HashAlgorithm.Create ("SHA256"); Wir codieren den Namen des Signatur-Hash-Algorithmus. Wie bekommt man den Namen des Signatur-Hash-Algorithmus des Zertifikats, anstatt es hart zu codieren?

Antwort

1

Es scheint, dass es keinen einfachen Weg gibt, Signatur-Hash-Algorithmus von Zertifikat in .NET zu erhalten. Was Sie tun können, erste Signaturalgorithmus OID

cert.SignatureAlgorithm.Value; 

Dann müssen Sie irgendwie diese OID Karte erhalten ist (dies mit RSA-Verschlüsselung zum Beispiel SHA256 sein kann) OID oder Namen nur Hash-Algorithmus, ohne Verschlüsselung (nur SHA256). Sie können entweder eine solche Karte selbst erstellen oder vorhandene Karten verwenden, z. B. die Bibliothek des Bouncy Castle. Leider enthält es es in der internen Klasse, also müssen Sie etwas Reflexion verwenden, um dazu zu gelangen. So fügt Bezug auf Hüpfburg zuerst (via nuget), dann gilt:

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); 

Dies wird der Wert des Privaten digestAlgs Bereichs der internen CmsSignedHelper Klasse greifen, die nur die Karte enthält, die Sie benötigen.

Dann Sie tun:

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

CmsSignedData und IDictionary sind mit Namensraum fehlt, und ich habe den Namespace als System.Security.Cryptography.Pkcs hinzugefügt; und immer noch gibt es den gleichen fehlenden Namespace Fehler – user5271376

+0

Können Sie bitte sagen, ob das .Net Framework 4 0R 4.5 Unterstützung Bouncy Castle Bibliothek und ich habe nie Boucny Castle Bibliothek verwendet – user5271376

+0

Sicher es tut. Wenn du nuget package manager benutzt - suche nach "Bouncy Castle" und installiere das Paket. Wenn du nuget nicht verwendest - hier ist der direkte Link auf der Website dieser Bibliotheksentwickler - http://www.bouncycastle.org/csharp/download/bccrypto-csharp-1.8.1-bin.zip. Entpacken Sie die Datei und fügen Sie einen Verweis auf die DLL zu Ihrem Projekt hinzu. – Evk

Verwandte Themen