BouncyCastle Open PGP - unknown object in stream 47
Asked Answered
H

3

8

I am trying to decrypt PGP encrypted string using the BouncyCastle PGP SDK.

I have tried several approaches and in each case I get a following error at the beginning of the process (exact place shown below):

unknown object in stream 47

I have so far tried two nuget packages:

  • BouncyCastle.OpenPGP v.1.8.1.
  • BouncyCastle-Ext v1.7.0

I have tried approaches presented in two articles:

And I have tried three methods of getting test keys and encrypted strings:

At the moment my code looks as follows:

  public void DecryptFile(string inputFilePath, string outputPath)
    {
        using (FileStream fsEncryptedFile = File.Open(inputFilePath, FileMode.Open))
        using (Stream decoderStream = PgpUtilities.GetDecoderStream(fsEncryptedFile))
        {
            PgpObjectFactory factory = new PgpObjectFactory(decoderStream);
            PgpObject obj = factory.NextPgpObject(); //<-- ERROR THROWN HERE
            if (!(obj is PgpEncryptedDataList))
            {
                obj = factory.NextPgpObject(); 
            }
            PgpEncryptedDataList edl = obj as PgpEncryptedDataList;

            foreach (PgpPublicKeyEncryptedData data in edl.GetEncryptedDataObjects())
            {
                PgpPrivateKey privateKey = null;
                using (FileStream fsKeyring = File.Open(this.privateKeyPath, FileMode.Open))
                {
                    PgpSecretKeyRingBundle bundle = new PgpSecretKeyRingBundle(fsKeyring); // <-- also same error can happen  here if I skip the error above
                    PgpSecretKey secretKey = bundle.GetSecretKey(data.KeyId);
                    privateKey = secretKey.ExtractPrivateKey(this.signature.ToCharArray());
                }
                PgpObjectFactory plainFactory = new PgpObjectFactory(data.GetDataStream(privateKey));
                PgpObject message = plainFactory.NextPgpObject();
                if (message is PgpCompressedData)
                {
                    message = new PgpObjectFactory(((PgpCompressedData) message).GetDataStream()).NextPgpObject();
                }
                if (message is PgpLiteralData)
                {
                    PgpLiteralData ld = (PgpLiteralData) message;
                    using (FileStream outStream = File.Create(outputPath))
                    {
                        Stream inStream = ld.GetInputStream();
                        byte[] buffer = new byte[0x100000];
                        int count = inStream.Read(buffer, 0, buffer.Length);
                        while (count > 0)
                        {
                            outStream.Write(buffer, 0, count);
                            count = inStream.Read(buffer, 0, buffer.Length);
                        }

                        outStream.Close();
                    }
                }
                else
                {
                    Console.WriteLine("ERROR: Unknown type of message in PGP file: {0}", message.GetType().FullName);
                }
            }
        }
    }

Here are my test keys and hello world message generated at https://www.igolder.com/PGP/generate-key/

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG C# v1.6.1.0

mQENBFoAOVkBCACQs2N2Z/b6Fpx+w6Et380qVCtwxJ6GBCRAgwVLGNSKoPJ/L7Sh
dBYJAY5hAWWkSNRislYUG7iykK3JtJVOetlts1xFQX5gVVABZphGx9OtbGo95dUJ
vxV3w7cpXwHPB45skd2qjzIZLh8PY0BYC4Rf8SIa2LBhPh5CqT339Z8h0dGBhykj
X8LyzCVnKVjUUZpaGHoM5zo3jtIhxBgYs6WowuWaMtpEynQW753klBIW+d7UsJ2x
zrHu3SNE4hU5ayNvZKwx3Mb1LRf2ydqaniyLoL4nrPzeIr19vBHRfr52itjcG1hD
4PoD5zECwKK4KOqfPAjg/8fKa/oDZserdIxnABEBAAG0AIkBHAQQAQIABgUCWgA5
WQAKCRC3T9Uo2/H1P2yQCACMjLPb3z1hRErwevJtyEvaixIovVS/I/8anW9t9egr
yaoufqC0WPGN8nDrFXRInYeV3hV1C6qSq1BUGsOhS1aFDsjqqUdtQ1oIemAs9BnV
trD/noOkR11THtA2+gO3nyIo6vLADiqDQ5RQjzOMTwGVAHJjf8JpxvlIyrb/09sO
j1CmhcZfUPYNLV15h3XWHLk1dJhtYTjKYtH+kbS2THln/0LOCd/h9+rdmojQmtau
8wkgeX9vhiaGItZ+xjTb7jNTTn+fzO3IkeffgklIZbhX7/NqUKKNFUKYzHDwuS2L
uTgd1VhOQWfI/ZTIwmVqoCMOlYdtmrsl12tBp0JZUXJS
=8xO7
-----END PGP PUBLIC KEY BLOCK-----

-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: BCPG C# v1.6.1.0

lQOsBFoAOVkBCACQs2N2Z/b6Fpx+w6Et380qVCtwxJ6GBCRAgwVLGNSKoPJ/L7Sh
dBYJAY5hAWWkSNRislYUG7iykK3JtJVOetlts1xFQX5gVVABZphGx9OtbGo95dUJ
vxV3w7cpXwHPB45skd2qjzIZLh8PY0BYC4Rf8SIa2LBhPh5CqT339Z8h0dGBhykj
X8LyzCVnKVjUUZpaGHoM5zo3jtIhxBgYs6WowuWaMtpEynQW753klBIW+d7UsJ2x
zrHu3SNE4hU5ayNvZKwx3Mb1LRf2ydqaniyLoL4nrPzeIr19vBHRfr52itjcG1hD
4PoD5zECwKK4KOqfPAjg/8fKa/oDZserdIxnABEBAAH/AwMCzc2GbYDsJQxgjinX
boFvk2rByvV1wYskgMUzsVvpfh76IsFcdjwavGBvYR2PbPcn7nydX8k5R6CV5U2k
H8bR9BjppDsEGfayq3HuKA9/riFvB2hLcoYj2aSF0VDE9iWSMQxiJapOWlCvkDbo
CVa5bLEPnhl+w8O8huI3VRc7cJs9tkQTQuKPk7HxVHdSOQATqhrJIqgrIlTS5OWf
0GE2mo5+8sNgLyAdjiRu057QAeHZ9o4SsD23cX6LdWzOvjOEQJs/qBL3BFdB1DHZ
Jn87kNnwxbQPRF0KeeaUSLahWsP8UENt1IkjI2ff95XGw1MbDv3ZZbv340CBgRS+
A9HK4vT9MUU11dpc2HDix43RUQdNSZ+jKMYji/aJFNNEMbEwMkJMEPirt+6QzK8q
uAyFGsoUKtYhjsg8xFxQc8xif6D6pArjBPJKJe+YN45LIAHcyVNhK0X8TGxdrk9o
Z1smgSk4+dorpiTHRK3R1JcALjo1JY9bICTNs4xKcRTbs+6PVHEyTzCjh5YixSg2
9wmnsza1ucY8YUNLoXUdaIAgI/ggjrejv/JBCduKKRdiMRyjI4IcfQUiZZSO8Y3w
JElBXLfdGxaB7vLUA7uGvhDraRjFI2yq+x7FvCVuXmrIQ2xMRi8b2EVzvqWFSYWP
oRfceevoW/Jvmpy1KJV+TtlU2EplOjigHFtNvfdfxP57283BjJWD/qGyiPtQyLjA
7qOmtuQhnTSvdejv5bL0avlhNZvJYl6GoqO9ymDrelDWkSWFP6yaKiRR1e0mTbwX
UukQww0L8dJEYkKsy9rTFUTGq/PXRXxN/FVtNtLHEX8zGmBWUZgjpLwq+cc8CWmo
+vJnW5nfWSNySKv1aR0WvTTGK4hndJ3rpt1coUlrrbQAiQEcBBABAgAGBQJaADlZ
AAoJELdP1Sjb8fU/bJAIAIyMs9vfPWFESvB68m3IS9qLEii9VL8j/xqdb2316CvJ
qi5+oLRY8Y3ycOsVdEidh5XeFXULqpKrUFQaw6FLVoUOyOqpR21DWgh6YCz0GdW2
sP+eg6RHXVMe0Db6A7efIijq8sAOKoNDlFCPM4xPAZUAcmN/wmnG+UjKtv/T2w6P
UKaFxl9Q9g0tXXmHddYcuTV0mG1hOMpi0f6RtLZMeWf/Qs4J3+H36t2aiNCa1q7z
CSB5f2+GJoYi1n7GNNvuM1NOf5/M7ciR59+CSUhluFfv82pQoo0VQpjMcPC5LYu5
OB3VWE5BZ8j9lMjCZWqgIw6Vh22auyXXa0GnQllRclI=
=XAmm
-----END PGP PRIVATE KEY BLOCK-----

-----BEGIN PGP MESSAGE-----
Version: BCPG C# v1.6.1.0

hQEMA7dP1Sjb8fU/AQf9ERc725Bql1snAN5R/j/xbkRqtdmGPAbYkJQX/IcJYu9R
1txnd7Y7xH8FMj1a/QLB5migRO8O3UQ2KHiBTe/+QyeB+FiJVtaRndG/VDXUHATy
PRnusYszaYVA8YBAirDqjuuGqhIXym4v9jbyBJWYXNJnrJOPK+C7A6JQEKbQjdwX
vFj07faEDpn8RE6PnvU55EqcBH7D7uSMMKElknHUfyMyLrHOkrYky3uHKG/hF4QS
XE8jBcpNHBg5p35KH99eJafulhvt0XhGcKS1z41ftFNzGxcLLoxHWNZEGj2RG54h
m+5iWY0Ypqg4aTMm/SxWj41pBcc5B4deW8pO6cxC0Mkpjc/4FRl2/ZmnHr4BGIft
atuzKN21w4fIPkaNkz1NgfYbJs4Y/lnWjrg=
=wxc0
-----END PGP MESSAGE-----

Any idea why am I constantly getting this error ?

Thanks

Hallucinatory answered 6/11, 2017 at 10:40 Comment(2)
Not a good idea to post your public and private keys in a public forumScopophilia
@AshishAgarwal - LOL, of course these are dummy generated keys, not used for anything! I honestly did not expect anybody to think these might be actual keys, you really cracked me up :)Hallucinatory
S
8

I had this problem using Visual Studio 2015 and the Bouncy-Castle library when I called the PgpPublicKeyRingBundle function.

unknown object in stream 47

I had created the PublicKey.asc and PrivateKey.asc text files using Visual Studio Text files.

By default VS uses Unicode UTF-8 encoding.

You'll need to change this to US-ASCII.

  • From the menu select File -> Save As
  • On the "Save" button there will be a drop down menu where you can select "Save with Encoding"
  • Select US-ASCII
Sapowith answered 19/1, 2018 at 22:33 Comment(0)
T
0

We encountered this error when running on linux. The code below worked fine on Windows:

using (var fileStream = File.OpenRead(filePath))
{
   var encodedFile = PgpUtilities.GetDecoderStream(fileStream);
   var factory = new PgpObjectFactory(encodedFile);
...
}

But running in a docker container on linux, hit the unknown object in stream 47. Reading all the bytes from the file and passing that to bouncycastle fixed it.

var inputData = File.ReadAllBytes(filePath);
var factory = new PgpObjectFactory(inputData);
Telephony answered 5/8, 2022 at 10:15 Comment(0)
G
0

Try to convert your orignal encryption string to base64 string and then use the Decrypt function :

var inputData = File.ReadAllBytes(encryptedFile);
var stringToDecrypt = Convert.ToBase64String(inputData);

#region Decrypt String
EncryptionKeys encryptionKeys = new EncryptionKeys(PgpKeys.PrivateKey, Passphrase);

PGP pgp = new PGP(encryptionKeys);

// Decrypt

EventLog.WriteEntry("PgpDecryptFile", "Decrypt");
string decryptedContent = pgp.Decrypt(stringToDecrypt); 
Goldwin answered 21/12, 2023 at 19:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.