using Org.BouncyCastle.Bcpg;
using Org.BouncyCastle.Bcpg.OpenPgp;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.IO;
using System.Collections;
using System.Collections.Generic;
namespace Websparks.Capels.Payment.Services
public static class PGPHepler
static async public void Main(String[] args)
var timeStamp = DateTime.Now;
msgId = "M100322180203329",
timeStamp = $"{timeStamp:yyyy-MM-dd}T{timeStamp:HH:mm:ss.fff}",
outletProxy = "756399858CRER",
var requestString = Newtonsoft.Json.JsonConvert.SerializeObject(request);
var publicKey = "-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQENBFjh9FoBCADZJlqmfj4o6u5AvgYAPtkVNxaiNGZrM/KroG30B17HKaKGFQvJ Vse0SfSk154TEtjnFGcnbrplkm4Fc61aTHi5id2JroM7qyWwOj6pp5xRkchJox3N c1/OrlJPdmVAu1F/wjExkapdVE2lkKCb/TQcoJJAf7GFl3+1dWm/pSta+xMhRlJZ THnFHHwVsYzsZsW1GcquS/QG1qeJctuyBAdiG2v2ABhbv26Y4Eejkoy/sQ9Oxv9y iy3sU+aRh3R6DpiLul75DXX3/7vHfDD1M2Kxop7OmmyBypp1qpc6K71/rMejmFRu RCQYs/hT+70bJVfpuai9oI4zymmKtK0Q5/VhABEBAAG0FURCU1NHIDxEQlNTR0Bk YnMuY29tPokBOQQTAQgAIwUCWOH0WgIbAwcLCQgHAwIBBhUIAgkKCwQWAgMBAh4B AheAAAoJECscc5ff/a5sEaYH/3DSKOKHtgvNiS9/TMMqTOBTw0+HFmj1CCjo5/0P +ZtJVpCqNvnLKuImtl2QYIzQBuHw85QsVIXZcU6ME53DtqaxJc88KsAoPcOFxter 48DMVdpIIO8qM9slyF+YkrlAFDaShqchMRrCHvP6NEeeBsaPY2lJp2jS2I8py7g1 2nTf7wDv6vHr6fpJ6AlSmP1DcFLoWuzaf1nSXbT7x9wSCyjoBiKksv8uiCJg8T+G ZCPgcNxolM7C2u9XZ9ZimhnkUiMbDju49pLwblJSvLuorNU/hSpq9ljyN1thMs6R YaHyg5nepPKqx+d+R46oLDH9IVHJy74X0ZsgsKjho7H0W+65AQ0EWOH0WgEIAPHu E2izczDbSDCaNMnMFu0Cct+le1e+lTAn7mblmaNlRDC/VR6Mg6j9xmxyNPSDEdjX 30JcMX9ZaJoZ/yvoNKb4VyiXicVMVYIhnG1kAlfHNb06uesu3tWj+GbkjMORSCqb +IOkUTXfmM+ybjaYTlmAEPvOzYSPLSlopF//rTsM8lZJqScFGS/J6kYuhWCGEb+d 1vIYXMMWl+AQxSJa7uxcsGaAR9SRSqNe/ntbj5R7oGRvikR9fkL6gxiZ2ux32K5n ETJJS4sorokm/63aNxiFRs9i6pzbdwygYBKGuQWo3BxgCLhdapPQHUPaDkhyuNau nR1T30sxjGsjWxRu/s8AEQEAAYkBHwQYAQgACQUCWOH0WgIbDAAKCRArHHOX3/2u bANcB/sGnQxkCiktUbRMZaZiD59lh688zZe8NuYSntlB5tBmVaC+dahZwOiOr5bp CTkQ/hVJzRlq2Wulfwi4flXyPwniZtCGLZp3enfIRqX3IwTiIqeJ932LdhGsVARu DviI9kAZeranZxHSb6FKK6ZsR82jvUAcUprnvwH5rWzXHYWZZIxsaJ3bCahZJqmU UdRhr4x500ofg5mWQsfoX8QrXG1x+XkL+PU7k3CjAUeMNTyiPyOrgcZaLHvq2Z2i Qlr9VOWBYXHpBEEHmQ18OrrSWv/RTMbF8HZTm3qLZVTDqCG367MoSjqb4ffwNJkM pKJ7S4KVXGM8N27VmrwZsobjigsd =zovm -----END PGP PUBLIC KEY BLOCK-----";
var privateKey = "-----BEGIN PGP PRIVATE KEY BLOCK----- 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 =T/JW -----END PGP PRIVATE KEY BLOCK-----";
var passPhrase = "P@ssw0rdCAAS";
byte[] encryptedContent = PGPHepler.Encrypt(requestString, publicKey);
Console.WriteLine("TransactionStatus - Encrypted: " + Encoding.UTF8.GetString(encryptedContent));
MemoryStream signedRequestStream = new MemoryStream();
PGPHepler.Sign(encryptedContent, privateKey, passPhrase, signedRequestStream);
Console.WriteLine("TransactionStatus - Signed: " + Encoding.UTF8.GetString(signedRequestStream.ToArray()));
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("x-api-key", "7a4fe7bd-0240-4713-bdd7-02087e55d0ca");
httpClient.DefaultRequestHeaders.Add("X-DBS-ORG_ID", "CIVILAV4");
StringContent abc= new StringContent(Encoding.UTF8.GetString(PGPHepler.ReadAllBytes(signedRequestStream)), Encoding.UTF8, "text/plain");
Console.WriteLine("TransactionStatus - ResponseMessage: " + abc);
public static void Sign(byte[] requestByteArray, string privateKey, string privateKeyPassword, Stream outStream)
MemoryStream requestStream = new MemoryStream(requestByteArray);
byte[] byteArrayPK = Encoding.UTF8.GetBytes(privateKey);
MemoryStream privateKeyStream = new MemoryStream(byteArrayPK);
PgpSecretKey pgpSec = ReadSigningSecretKey(privateKeyStream);
PgpPrivateKey pgpPrivKey = null;
pgpPrivKey = pgpSec.ExtractPrivateKey(privateKeyPassword.ToCharArray());
PgpSignatureGenerator sGen = new PgpSignatureGenerator(pgpSec.PublicKey.Algorithm, Org.BouncyCastle.Bcpg.HashAlgorithmTag.Sha256);
sGen.InitSign(PgpSignature.BinaryDocument, pgpPrivKey);
foreach (string userId in pgpSec.PublicKey.GetUserIds())
PgpSignatureSubpacketGenerator spGen = new PgpSignatureSubpacketGenerator();
spGen.SetSignerUserId(false, userId);
sGen.SetHashedSubpackets(spGen.Generate());
CompressionAlgorithmTag compression = PreferredCompression(pgpSec.PublicKey);
PgpCompressedDataGenerator cGen = new PgpCompressedDataGenerator(compression);
Stream bOut = cGen.Open(outStream);
sGen.GenerateOnePassVersion(false).Encode(bOut);
PgpLiteralDataGenerator lGen = new PgpLiteralDataGenerator();
while ((ch = requestStream.ReadByte()) >= 0)
lOut.WriteByte((byte)ch);
sGen.Generate().Encode(bOut);
throw new Exception(e.Message);
public static byte[] Encrypt(string requestString, string publicKey)
byte[] clearData = Encoding.UTF8.GetBytes(requestString);
byte[] byteArrayPK = Encoding.UTF8.GetBytes(publicKey);
MemoryStream publicKeyStream = new MemoryStream(byteArrayPK);
PgpPublicKey pubKey = ReadPublicKey(publicKeyStream);
MemoryStream bOut = new MemoryStream();
PgpCompressedDataGenerator comData = new PgpCompressedDataGenerator(CompressionAlgorithmTag.Zip);
Stream cos = comData.Open(bOut);
PgpLiteralDataGenerator lData = new PgpLiteralDataGenerator();
Stream pOut = lData.Open(
pOut.Write(clearData, 0, clearData.Length);
PgpEncryptedDataGenerator cPk = new PgpEncryptedDataGenerator(SymmetricKeyAlgorithmTag.Aes256, new SecureRandom());
byte[] bytes = bOut.ToArray();
MemoryStream encOut = new MemoryStream();
Stream cOut = cPk.Open(os, bytes.Length);
cOut.Write(bytes, 0, bytes.Length);
throw new Exception(e.Message);
public static PgpSecretKeyRingBundle CreatePgpSecretKeyRingBundle(Stream keyInStream)
return new PgpSecretKeyRingBundle(PgpUtilities.GetDecoderStream(keyInStream));
public static PgpSecretKey ReadSigningSecretKey(Stream keyInStream)
PgpSecretKeyRingBundle pgpSec = CreatePgpSecretKeyRingBundle(keyInStream);
IEnumerator rIt = pgpSec.GetKeyRings().GetEnumerator();
while (key == null && rIt.MoveNext())
PgpSecretKeyRing kRing = (PgpSecretKeyRing)rIt.Current;
IEnumerator kIt = kRing.GetSecretKeys().GetEnumerator();
while (key == null && kIt.MoveNext())
PgpSecretKey k = (PgpSecretKey)kIt.Current;
throw new Exception(e.Message);
public static CompressionAlgorithmTag PreferredCompression(PgpPublicKey publicKey)
return CompressionAlgorithmTag.Zip;
private static PgpPublicKey ReadPublicKey(Stream inputStream)
inputStream = PgpUtilities.GetDecoderStream(inputStream);
PgpPublicKeyRingBundle pgpPub = new PgpPublicKeyRingBundle(inputStream);
foreach (PgpPublicKeyRing kRing in pgpPub.GetKeyRings())
foreach (PgpPublicKey k in kRing.GetPublicKeys())
throw new ArgumentException("Can't find encryption key in key ring.");
public static byte[] ReadAllBytes(Stream instream)
if (instream is MemoryStream)
return ((MemoryStream)instream).ToArray();
using (var memoryStream = new MemoryStream())
instream.CopyTo(memoryStream);
return memoryStream.ToArray();