BouncyCastle.Cryptography 2.0.0 及更高版本的 PGP 解密问题

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

作为一名程序员,我对 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。

c# encryption pgp
1个回答
0
投票

我通过避免使用流来修复它。 只需将流更改为字节并使用它有效的字节

 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);
   }
© www.soinside.com 2019 - 2024. All rights reserved.