2011-08-08 40 views
8

Tôi đã xem một số bài đăng, theo một số hướng dẫn nhưng dường như không có cách nào hoạt động. Đôi khi, họ tham chiếu đến một số lớp học không được tìm thấy. Tôi có thể được chỉ đến một nơi mà tôi có thể nhận được một hướng dẫn đơn giản cho thấy làm thế nào để mã hóa và giải mã một tập tin.Mã hóa và giải mã PgP bằng BouncyCastle C#

Tôi rất mới với Pgp và mọi trợ giúp đều được hoan nghênh.

Trả lời

3

thế nào là điều này:

PartialInputStream during Bouncycastle PGP decryption

Ngoài ra, zip chứa các ví dụ ở đây:

http://www.bouncycastle.org/csharp/

Hope this helps. Nếu bạn vẫn còn bị mắc kẹt, hãy đăng một số chi tiết hơn về những lớp mà trình biên dịch đang phàn nàn và cộng đồng sẽ xem xét.

+0

Xin chào. Tôi nghĩ rằng tôi sẽ viết một giải pháp hoàn chỉnh và đăng mã của tôi với các lỗi tôi có thể nhận được. Sẽ kiểm tra mã giải mã. – ritcoder

+3

Tìm thấy một ví dụ tại [link] (http://blogs.microsoft.co.il/blogs/kim/archive/2009/01/23/pgp-zip-encrypted-files-with-c.aspx). Nó có cả mã hóa và giải mã. Cảm ơn – ritcoder

21

Tôi biết câu hỏi này là năm cũ nhưng vẫn là # 1 hoặC# 2 trong Google cho các tìm kiếm liên quan đến Giải mã PGP sử dụng Lâu đài Bouncy. Vì có vẻ khó để tìm một ví dụ hoàn chỉnh, ngắn gọn mà tôi muốn chia sẻ giải pháp làm việc của mình ở đây để giải mã một tệp PGP. Đây chỉ đơn giản là một phiên bản sửa đổi của ví dụ Lâu đài Bouncy đi kèm với các tệp nguồn của họ.

using System; 
using System.IO; 
using Org.BouncyCastle.Bcpg.OpenPgp; 
using Org.BouncyCastle.Utilities.IO; 

namespace PGPDecrypt 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DecryptFile(
       @"path_to_encrypted_file.pgp", 
       @"path_to_secret_key.asc", 
       "your_password_here".ToCharArray(), 
       "output.txt" 
      ); 
     } 

     private static void DecryptFile(
      string inputFileName, 
      string keyFileName, 
      char[] passwd, 
      string defaultFileName) 
     { 
      using (Stream input = File.OpenRead(inputFileName), 
        keyIn = File.OpenRead(keyFileName)) 
      { 
       DecryptFile(input, keyIn, passwd, defaultFileName); 
      } 
     } 

     private static void DecryptFile(
      Stream inputStream, 
      Stream keyIn, 
      char[] passwd, 
      string defaultFileName) 
     { 
      inputStream = PgpUtilities.GetDecoderStream(inputStream); 

      try 
      { 
       PgpObjectFactory pgpF = new PgpObjectFactory(inputStream); 
       PgpEncryptedDataList enc; 

       PgpObject o = pgpF.NextPgpObject(); 
       // 
       // the first object might be a PGP marker packet. 
       // 
       if (o is PgpEncryptedDataList) 
       { 
        enc = (PgpEncryptedDataList)o; 
       } 
       else 
       { 
        enc = (PgpEncryptedDataList)pgpF.NextPgpObject(); 
       } 

       // 
       // find the secret key 
       // 
       PgpPrivateKey sKey = null; 
       PgpPublicKeyEncryptedData pbe = null; 
       PgpSecretKeyRingBundle pgpSec = new PgpSecretKeyRingBundle(
        PgpUtilities.GetDecoderStream(keyIn)); 

       foreach (PgpPublicKeyEncryptedData pked in enc.GetEncryptedDataObjects()) 
       { 
        sKey = FindSecretKey(pgpSec, pked.KeyId, passwd); 

        if (sKey != null) 
        { 
         pbe = pked; 
         break; 
        } 
       } 

       if (sKey == null) 
       { 
        throw new ArgumentException("secret key for message not found."); 
       } 

       Stream clear = pbe.GetDataStream(sKey); 

       PgpObjectFactory plainFact = new PgpObjectFactory(clear); 

       PgpObject message = plainFact.NextPgpObject(); 

       if (message is PgpCompressedData) 
       { 
        PgpCompressedData cData = (PgpCompressedData)message; 
        PgpObjectFactory pgpFact = new PgpObjectFactory(cData.GetDataStream()); 

        message = pgpFact.NextPgpObject(); 
       } 

       if (message is PgpLiteralData) 
       { 
        PgpLiteralData ld = (PgpLiteralData)message; 

        string outFileName = ld.FileName; 
        if (outFileName.Length == 0) 
        { 
         outFileName = defaultFileName; 
        } 

        Stream fOut = File.Create(outFileName); 
        Stream unc = ld.GetInputStream(); 
        Streams.PipeAll(unc, fOut); 
        fOut.Close(); 
       } 
       else if (message is PgpOnePassSignatureList) 
       { 
        throw new PgpException("encrypted message contains a signed message - not literal data."); 
       } 
       else 
       { 
        throw new PgpException("message is not a simple encrypted file - type unknown."); 
       } 

       if (pbe.IsIntegrityProtected()) 
       { 
        if (!pbe.Verify()) 
        { 
         Console.Error.WriteLine("message failed integrity check"); 
        } 
        else 
        { 
         Console.Error.WriteLine("message integrity check passed"); 
        } 
       } 
       else 
       { 
        Console.Error.WriteLine("no message integrity check"); 
       } 
      } 
      catch (PgpException e) 
      { 
       Console.Error.WriteLine(e); 

       Exception underlyingException = e.InnerException; 
       if (underlyingException != null) 
       { 
        Console.Error.WriteLine(underlyingException.Message); 
        Console.Error.WriteLine(underlyingException.StackTrace); 
       } 
      } 
     } 

     private static PgpPrivateKey FindSecretKey(PgpSecretKeyRingBundle pgpSec, long keyID, char[] pass) 
     { 
      PgpSecretKey pgpSecKey = pgpSec.GetSecretKey(keyID); 

      if (pgpSecKey == null) 
      { 
       return null; 
      } 

      return pgpSecKey.ExtractPrivateKey(pass); 
     } 
    } 
} 
+1

Không chính xác những gì tôi cần, nhưng đủ gần để đáp ứng nhu cầu của tôi. Đã tiết kiệm cho tôi một lượng công việc đáng kể. Lâu đài Bouncy vẫn là giải pháp miễn phí tốt nhất mà tôi đã tìm thấy cho PGP trong .NET và cũng đánh bại một số giải pháp được trả tiền. – dave

+0

bạn có biết cách giải quyết "tin nhắn được mã hóa có chứa thông điệp đã ký - không phải dữ liệu theo nghĩa đen hay không". lỗi ? –

+0

@MokhAkh, nếu bạn nhìn vào mã của tôi, bạn sẽ thấy rằng lỗi này được nâng lên khi thông báo là PgpOnePassSignatureList thay vì PgpLiteralData được mong đợi. Tôi không biết kịch bản chính xác của bạn nhưng tôi đoán nếu bạn bắt đầu tìm kiếm SO hoặc Google cho PgpOnePassSignatureList, bạn sẽ bắt đầu tìm ra nó. – Dan

Các vấn đề liên quan