我们的应用程序使用改编自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?
答案 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中不可用的功能的消息的开头,以便使该版本报告处理消息所需的较新软件。