2010-10-15 7 views
5

jestem rozrusznik z kryptografiiGet Zacznij BouncyCastle krypto dll C#

woul Lubię używać BouncyCastle .dll dla C#, ale nie mogę znaleźć dokumentację i przykłady.

W szczególności muszę użyć do podpisania plików z pkcs # 7 (wyniki .p7m) i dodać do nich zgodność z RFC 3161, sygnatury czasowe z zaufanego serwera (wyniki .m7m).

ktoś może zasugerować, gdzie mogę znaleźć przykłady i dokumentację, aby to zrobić?

Dziękując z góry

poważaniem

Odpowiedz

6

Stworzyłam ten mały przykład dla innego pytanie tutaj na #SO, ale to dotyczy Ciebie jako dobrze:

using System; 
using System.IO; 
using System.Linq; 
using System.Windows.Forms; 
using Org.BouncyCastle.Cms; 
using Org.BouncyCastle.Pkcs; 
using Org.BouncyCastle.X509; 

namespace ConsoleApplicationSignWithBouncyCastle 
{ 
    class Program 
    { 

     [STAThread] 
     static void Main(string[] args) 
     { 

      try 
      { 
       // First load a Certificate, filename/path and certificate password 
       Cert = ReadCertFromFile("./test.pfx", "test"); 

       // Select a binary file 
       var dialog = new OpenFileDialog 
           { 
            Filter = "All files (*.*)|*.*", 
            InitialDirectory = "./", 
            Title = "Select a text file" 
           }; 
       var filename = (dialog.ShowDialog() == DialogResult.OK) ? dialog.FileName : null; 

       // Get the file 
       var f = new FileStream(filename, System.IO.FileMode.Open); 

       // Reading through this code stub to be sure I get it all :-) [ Different subject entirely ] 
       var fileContent = ReadFully(f); 

       // Create the generator 
       var dataGenerator = new CmsEnvelopedDataStreamGenerator(); 

       // Add receiver 
       // Cert is the user's X.509 Certificate set bellow 
       dataGenerator.AddKeyTransRecipient(Cert); 

       // Make the output stream 
       var outStream = new FileStream(filename + ".p7m", FileMode.Create); 

       // Sign the stream 
       var cryptoStream = dataGenerator.Open(outStream, CmsEnvelopedGenerator.Aes128Cbc); 

       // Store in our binary stream writer and write the signed content 
       var binWriter = new BinaryWriter(cryptoStream); 
       binWriter.Write(fileContent); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("So, you wanna make an exception huh! : " + ex.ToString()); 
       Console.ReadKey(); 
      } 
     } 

     public static byte[] ReadFully(Stream stream) 
     { 
      stream.Seek(0, 0); 
      var buffer = new byte[32768]; 
      using (var ms = new MemoryStream()) 
      { 
       while (true) 
       { 
        int read = stream.Read(buffer, 0, buffer.Length); 
        if (read <= 0) 
         return ms.ToArray(); 
        ms.Write(buffer, 0, read); 
       } 
      } 
     } 

     public static Org.BouncyCastle.X509.X509Certificate Cert { get; set; } 

     // This reads a certificate from a file. 
     // Thanks to: http://blog.softwarecodehelp.com/2009/06/23/CodeForRetrievePublicKeyFromCertificateAndEncryptUsingCertificatePublicKeyForBothJavaC.aspx 
     public static X509Certificate ReadCertFromFile(string strCertificatePath, string strCertificatePassword) 
     { 
      try 
      { 
       // Create file stream object to read certificate 
       var keyStream = new FileStream(strCertificatePath, FileMode.Open, FileAccess.Read); 

       // Read certificate using BouncyCastle component 
       var inputKeyStore = new Pkcs12Store(); 
       inputKeyStore.Load(keyStream, strCertificatePassword.ToCharArray()); 

       //Close File stream 
       keyStream.Close(); 

       var keyAlias = inputKeyStore.Aliases.Cast<string>().FirstOrDefault(n => inputKeyStore.IsKeyEntry(n)); 

       // Read Key from Alieases 
       if (keyAlias == null) 
        throw new NotImplementedException("Alias"); 

       //Read certificate into 509 format 
       return (X509Certificate)inputKeyStore.GetCertificate(keyAlias).Certificate; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("So, you wanna make an exception huh! : " + ex.ToString()); 
      Console.ReadKey(); 
      return null; 
     } 
    } 
} } 

nadzieję, że to pomaga.

Wysłałem też to on my blog.

+0

Mała uwaga: użycie musi zostać dodane do outStream, cryptoStream i binWriter. Plik p7m jest tworzony bez żadnych danych w inny sposób – oleksa

+0

Każdy pomysł, gdzie mogę znaleźć dokumentację lub samouczek? Próbuję wdrożyć tryb blokowy szyfrów viz. ECB, CBC, CTR wspierane przez dmuchany zamek; wbudowany .net nie obsługuje CTR. Proszę powiedz mi, czy jest jakiś dokument do dmuchanego zamku. – SutharMonil