使用BouncyCastle c#进行PgP加密和解密

我看过很多post,其中有一些教程,但似乎都没有。 有时,他们会引用一些未找到的类。 我是否可以指向一个可以获得简单教程的地方,该教程展示了如何加密和解密文件。

我对Pgp很新,欢迎任何帮助。

这个怎么样:

Bouncycastle PGP解密期间的PartialInputStream

此外,zip包含以下示例:

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

希望这可以帮助。 如果你仍然卡住了,请发布一些关于编译器抱怨的类的更多细节,社区将会看一看。

我知道这个问题已有数年之久,但谷歌在使用Bouncy Castle进行PGP解密相关搜索方面仍然是#1或#2。 由于似乎很难找到一个完整,简洁的例子,我想在这里分享我的工作解决方案来解密PGP文件。 这只是其源文件中包含的Bouncy Castle示例的修改版本。

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