为什么在期待BouncyCastle中的PgpLiteralData时会找到PgpMarker?

时间:2013-07-22 14:30:28

标签: .net cryptography bouncycastle pgp

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

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?

1 个答案:

答案 0 :(得分:3)

解决方案只是忽略PgpMarker对象并继续阅读下一个。 OpenPGP规范有关于标记包的说法:

  

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

     

此数据包的正文包含:

 - The three octets 0x50, 0x47, 0x50 (which spell "PGP" in UTF-8).
     

接收时必须忽略这样的包。它可以放在使用PGP 2.6.x中不可用的功能的消息的开头,以便使该版本报告处理消息所需的较新软件。