public static string DecryptFile(Stream inputStream, Stream outputStream, PgpPrivateKey privateKey) { string retVal = string.Empty; try { using (Stream decoderStream = PgpUtilities.GetDecoderStream(inputStream)) { PgpObjectFactory pgpObjectFactory = new PgpObjectFactory(decoderStream); PgpObject pgpObject = pgpObjectFactory.NextPgpObject(); // // the first object might be a PGP marker packet. // PgpEncryptedDataList encryptedDataList = pgpObject as PgpEncryptedDataList; if (encryptedDataList == null) { encryptedDataList = (PgpEncryptedDataList)pgpObjectFactory.NextPgpObject(); } if (encryptedDataList.IsEmpty) retVal = "Message does not contain encrypted data."; else { PgpPublicKeyEncryptedData encryptedData = (PgpPublicKeyEncryptedData)encryptedDataList[0]; using (Stream clear = encryptedData.GetDataStream(privateKey)) { PgpObjectFactory pgpFact = new PgpObjectFactory(clear); // // if we're trying to read a file generated by someone other than us // the data might not be compressed, so we check the return type from // the factory and behave accordingly. // pgpObject = pgpFact.NextPgpObject(); if (pgpObject is PgpCompressedData) { PgpCompressedData compressedData = (PgpCompressedData)pgpObject; pgpFact = new PgpObjectFactory(compressedData.GetDataStream()); pgpObject = pgpFact.NextPgpObject(); } PgpLiteralData literalData = (PgpLiteralData)pgpObject; using (Stream literalDataStream = literalData.GetInputStream()) { Streams.PipeAll(literalDataStream, outputStream); } if (encryptedData.IsIntegrityProtected()) { if (!encryptedData.Verify()) { retVal = "Message could not be verified."; } } } } } } catch (Exception ex) { retVal = ex.Message; } return retVal; } public static PgpPrivateKey GetPrivateKey(Stream secretKeyStream, char[] passPhrase) { PgpPrivateKey retVal = null; PgpSecretKey secretKey = GetSecretKey(secretKeyStream); if (secretKey != null) retVal = secretKey.ExtractPrivateKey(passPhrase); return retVal; } public static PgpSecretKey GetSecretKey(Stream secretKeyStream) { PgpSecretKey retVal = null; using (Stream decodedStream = PgpUtilities.GetDecoderStream(secretKeyStream)) { PgpSecretKeyRingBundle keyRingBundle = new PgpSecretKeyRingBundle(decodedStream); var rings = keyRingBundle.GetKeyRings(); var curKeyRing = rings.GetEnumerator(); while (curKeyRing.MoveNext()) { PgpSecretKeyRing secretKeyRing = curKeyRing.Current as PgpSecretKeyRing; if (secretKeyRing != null) { retVal = secretKeyRing.GetSecretKey(); break; } } } return retVal; }