.net 为什么我在BouncyCastle中需要PgpLiteralData时会找到PgpMarker?

.net 为什么我在BouncyCastle中需要PgpLiteralData时会找到PgpMarker?,.net,cryptography,bouncycastle,pgp,.net,Cryptography,Bouncycastle,Pgp,我们的应用程序使用改编自KeyBasedFileProcessor.cs的内容解密pgp加密文件,类似于。通常情况下,这可以正常工作,但我们遇到了某些文件的问题。问题代码如下: if (message is PgpLiteralData) { PgpLiteralData ld = (PgpLiteralData)message; Stream fOut = File.Create(ld.FileName); Stream unc =

我们的应用程序使用改编自KeyBasedFileProcessor.cs的内容解密pgp加密文件,类似于。通常情况下,这可以正常工作,但我们遇到了某些文件的问题。问题代码如下:

if (message is PgpLiteralData)
{
   PgpLiteralData ld = (PgpLiteralData)message;
    Stream fOut = File.Create(ld.FileName);
                        Stream unc = ld.GetInputStream();
                        Streams.PipeAll(unc, fOut);
                        fOut.Close();
}
else if (message is PgpOnePassSignatureList)
{
    throw new PgpException("encrypted message contains a signed message - not literal data.");
}
else
{ 
    // the code goes here and throw this exception, when I debug, message is of type PgpMarker
    throw new PgpException("message is not a simple encrypted file - type unknown.");
}

在这一部分,我相信代码需要PgpLiteralData。但我们得到了PgpMarker,它导致抛出异常。为什么会有PgpMarker?如何找到PgpLiteralData?

解决方案是忽略PgpMarker对象,继续读取下一个对象。OpenPGP规范对标记包有这样的描述:

PGP的一个实验版本使用此数据包作为文本数据包,但没有发布版本的PGP生成带有此标记的文本数据包。对于PGP5.x,此数据包已重新分配,并保留用作标记数据包

本文件包正文包括:

 - The three octets 0x50, 0x47, 0x50 (which spell "PGP" in UTF-8).
接收到这样的数据包时必须忽略。它可以放在使用PGP 2.6.x中不可用功能的消息的开头,以使该版本报告需要更新的软件来处理该消息


解决方案就是忽略PgpMarker对象,继续读取下一个对象。OpenPGP规范对标记包有这样的描述:

PGP的一个实验版本使用此数据包作为文本数据包,但没有发布版本的PGP生成带有此标记的文本数据包。对于PGP5.x,此数据包已重新分配,并保留用作标记数据包

本文件包正文包括:

 - The three octets 0x50, 0x47, 0x50 (which spell "PGP" in UTF-8).
接收到这样的数据包时必须忽略。它可以放在使用PGP 2.6.x中不可用功能的消息的开头,以使该版本报告需要更新的软件来处理该消息


你试过跳过标记吗?这来自Bouncy Castle Java API:“一个PGP标记数据包——一般来说,除了保留原始输入流之外,应该忽略这些数据包。”您是否尝试过跳过标记?这来自Bouncy Castle Java API:“一个PGP标记数据包——一般来说,除了保留原始输入流之外,这些数据包应该被忽略。”奇怪的是,“PGP”破坏了你的PGP应用程序,但它确实存在。奇怪的是,“PGP”破坏了你的PGP应用程序,但它确实存在。