作为一名程序员,我对 PGP 没有太多经验。对于工作,我一直在使用 M.Babcock 的 https://stackoverflow.com/questions/10209291/pgp-encrypt-and-decrypt” 的最佳答案中找到的类,无论如何都没有修改每当我需要解密或加密文件时,我都会花上好几年的时间。到目前为止,我已经定期更新到最新的 BouncyCastle.Cryptography 版本。目前,我的生产代码是 BouncyCastle.Cryptography 版本 1.9.0。
当我尝试在项目(控制台应用程序,.net 6.0)中将 BouncyCastle.Cryptography 升级到版本 2.0.0 或更高版本时,此代码将在该解决方案的类
PGPEncryptDecrypt
、使用 Stream 的 Decrypt
方法中出错输入。具体来说,它在下面代码片段的最后一行出错了
if (message is PgpCompressedData)
{
PgpCompressedData cData = (PgpCompressedData)message;
PgpObjectFactory of = null;
using (Stream compDataIn = cData.GetDataStream())
{
of = new PgpObjectFactory(compDataIn);
}
message = of.NextPgpObject();
//...
}
异常发生在行
message = of.NextPgpObject():
“System.ObjectDisposeException: '无法访问关闭的流。对象名称: 'ZLibStream'。”
当我回滚到版本 1.9.0 时,代码再次按预期工作。我已经搜索了使用 2.0.0 或更高版本的 C# 代码示例,但没有找到任何示例。在我的搜索中,我确实访问了 bouncycastle.org,并在发行说明中看到 2.0.0 版及更高版本确实包含重大更改。但是,我的知识不够,不知道如何修改 PGPEncrtypDecrypt 类,以便它可以与 2.0.0 及更高版本一起使用。
在“https://stackoverflow.com/questions/10209291/pgp-encrypt-and-decrypt”的最佳答案中给出的类中需要更改什么,以便它与 BouncyCastle.Cryptography 2.0.0 一起使用。我希望使用最新版本,在本文发布时为 2.2.1。
我通过避免使用流来修复它。 只需将流更改为字节并使用它有效的字节
byte[] plainBytes = null;
using (Stream stream = pbe.GetDataStream(privateKey))
{
// To avoid Cannot Access a closed stream
using (var memoryStream = new MemoryStream())
{
stream.CopyTo(memoryStream);
plainBytes = memoryStream.ToArray();
}
//plainFact = new PgpObjectFactory(stream);
plainFact = new PgpObjectFactory(plainBytes);
}