BouncyCastle 打开 PGP - 流 47 中的未知对象

问题描述 投票:0回答:3

我正在尝试使用 BouncyCastle PGP SDK 解密 PGP 加密字符串。

我尝试了几种方法,在每种情况下,我都会在过程开始时收到以下错误(具体位置如下所示):

流 47 中存在未知对象

到目前为止我已经尝试了两个 nuget 包:

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

我尝试过两篇文章中介绍的方法:

我尝试了三种获取测试密钥和加密字符串的方法:

目前我的代码如下所示:

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

这是我在 https://www.igolder.com/PGP/generate-key/

生成的测试密钥和 hello world 消息
-----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-----

知道为什么我不断收到此错误吗?

谢谢

c# encryption bouncycastle pgp
3个回答
8
投票

当我调用 PgpPublicKeyRingBundle 函数时,我使用 Visual Studio 2015 和 Bouncy-Castle 库遇到了这个问题。

流 47 中存在未知对象

我使用 Visual Studio 文本文件创建了 PublicKey.asc 和 PrivateKey.asc 文本文件。

默认情况下VS使用Unicode UTF-8编码。

您需要将其更改为 US-ASCII。

  • 从菜单中选择文件 -> 另存为
  • 在“保存”按钮上,会有一个下拉菜单,您可以在其中选择“使用编码保存”
  • 选择 US-ASCII

0
投票

我们在linux上运行时遇到了这个错误。下面的代码在 Windows 上运行良好:

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

但是在 Linux 上的 docker 容器中运行,请点击

unknown object in stream 47
。从文件中读取所有字节并将其传递给 bouncycastle 修复了该问题。

var inputData = File.ReadAllBytes(filePath);
var factory = new PgpObjectFactory(inputData);

0
投票

尝试将您的原始加密字符串转换为base64字符串,然后使用解密功能:

var inputData = File.ReadAllBytes(加密文件); var stringToDecrypt = Convert.ToBase64String(inputData);

#region 解密字符串 EncryptionKeys cryptoKeys = new EncryptionKeys(PgpKeys.PrivateKey, Passphrase);

PGP pgp = 新 PGP(加密密钥);

//解密

EventLog.WriteEntry("PgpDecryptFile", "解密"); 字符串解密内容 = pgp.Decrypt(stringToDecrypt);

© www.soinside.com 2019 - 2024. All rights reserved.