+using Org.BouncyCastle.Bcpg.OpenPgp;
+using Org.BouncyCastle.Utilities.IO;
* Decryption demonstration
- // for the payment provider
- var parts = keyDataCompositeParse(/* incoming offer token */); // we now have two parts: the encrypted-composite-symmetric-key, and the encrypted data
- var modelJson = symmetricDecrypt(asymmetricDecrypt(/* your private key */, parts[0]), parts[1]);
+ // if you're using PGP key:
+ modelJson = PgpDecrypt(/* incoming offer token */, /* your private PGP key */, /* your secret PGP phrase */);
+ // for the payment provider
+ var parts = keyDataCompositeParse(/* incoming offer token */); // we now have two parts: the encrypted-composite-symmetric-key, and the encrypted data
+ modelJson = symmetricDecrypt(asymmetricDecrypt(/* your private key */, parts[0]), parts[1]);
var model = ServiceStack.Text.JsonSerializer.DeserializeFromString<OfferToken>(modelJson);
// proceed with payment for model...
public string Currency { get; set; }
public string Type { get; set; }
public string Description { get; set; }
+string PgpDecrypt(string base64Str, string privateKey, string password)
+ var encryptedBytes = Convert.FromBase64String(base64Str);
+ var str = Encoding.UTF8.GetString(encryptedBytes);
+ var decoded = new MemoryStream();
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ stream.Seek(0, SeekOrigin.Begin);
+ var input = PgpUtilities.GetDecoderStream(stream);
+ var pgpObjF = new PgpObjectFactory(input);
+ PgpEncryptedDataList enc;
+ var obj = pgpObjF.NextPgpObject();
+ if (obj is PgpEncryptedDataList)
+ enc = (PgpEncryptedDataList) obj;
+ enc = (PgpEncryptedDataList) pgpObjF.NextPgpObject();
+ .GetEncryptedDataObjects()
+ .Cast<PgpPublicKeyEncryptedData>()
+ var privKey = ReadPrivateKey(privateKey, password, pbe.KeyId);
+ var clear = pbe.GetDataStream(privKey);
+ var plainFact = new PgpObjectFactory(clear);
+ var message = plainFact.NextPgpObject();
+ if (message is PgpCompressedData)
+ var cData = (PgpCompressedData)message;
+ var pgpFact = new PgpObjectFactory(cData.GetDataStream());
+ message = pgpFact.NextPgpObject();
+ var literalData = (PgpLiteralData)message;
+ var unc = literalData.GetInputStream();
+ Streams.PipeAll(unc, decoded);
+ if (pbe.IsIntegrityProtected())
+ throw new Exception("Message failed integrity check.");
+ var result = StreamToString(decoded);
+ throw new Exception(e.Message);
+string StreamToString(Stream stream)
+ using (var reader = new StreamReader(stream, Encoding.UTF8))
+ return reader.ReadToEnd();
+PgpPrivateKey ReadPrivateKey(string privateKeyStr, string passPhrase, long keyId)
+ var secreKey = ReadSecretKey(privateKeyStr, keyId);
+ var privateKey = secreKey.ExtractPrivateKey(passPhrase.ToCharArray());
+ if (privateKey != null)
+ throw new ArgumentException("No private key found in secret key.");
+PgpSecretKey ReadSecretKey(string privateKey, long keyId)
+ using (var stream = new MemoryStream())
+ using (var writer = new StreamWriter(stream))
+ writer.Write(privateKey);
+ using (var inputStream = PgpUtilities.GetDecoderStream(stream))
+ var secretKeyRingBundle = new PgpSecretKeyRingBundle(inputStream);
+ var foundKey = secretKeyRingBundle.GetSecretKey(keyId);
+ throw new ArgumentException("Can't find signing key in key ring.");