当前位置: 首页 > 知识库问答 >
问题:

Bouncy Castle C#PGP解密示例

封永嘉
2023-03-14

昨天我找了一整天,似乎找不到在c中使用Bouncy Castle进行PGP解密的工作示例#

共有2个答案

杨昆
2023-03-14

我遇到了Ron Harlev的Decrypt函数保存输出文件直到程序终止的问题。我在Stream的周围添加了一些使用语句来克服这个问题。我还替换了硬编码的密码短语,支持输入参数。我希望有人觉得这有用。

private static bool DecryptFile(Stream inputStream, string outputDir, char[] passPhrase, string privateKeyLoc)
    {
        try
        {
            using (var newStream = PgpUtilities.GetDecoderStream(inputStream))
            {
                PgpObjectFactory pgpObjF = new PgpObjectFactory(newStream);
                PgpEncryptedDataList enc;
                PgpObject obj = pgpObjF.NextPgpObject();
                if (obj is PgpEncryptedDataList)
                {
                    enc = (PgpEncryptedDataList)obj;
                }
                else
                {
                    enc = (PgpEncryptedDataList)pgpObjF.NextPgpObject();
                }

                PgpPrivateKey privKey = GetPrivateKey(privateKeyLoc, passPhrase, logger);

                PgpPublicKeyEncryptedData pbe = enc.GetEncryptedDataObjects().Cast<PgpPublicKeyEncryptedData>().First();

                using (Stream clear = pbe.GetDataStream(privKey))
                {
                    PgpObjectFactory plainFact = new PgpObjectFactory(clear);
                    PgpObject message = plainFact.NextPgpObject();

                    if (message is PgpCompressedData)
                    {
                        PgpCompressedData cData = (PgpCompressedData)message;
                        Stream compDataIn = cData.GetDataStream();
                        PgpObjectFactory o = new PgpObjectFactory(compDataIn);
                        message = o.NextPgpObject();
                        if (message is PgpOnePassSignatureList)
                        {
                            message = o.NextPgpObject();
                        }
                        PgpLiteralData Ld = null;
                        Ld = (PgpLiteralData)message;
                        using (Stream output = File.Create(outputDir + "\\" + Ld.FileName))
                        {
                            Stream unc = Ld.GetInputStream();
                            Streams.PipeAll(unc, output);
                        }
                    }
                }
            }

            return true;
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
            return false;
        }
    }
臧令
2023-03-14

终于让它工作了。我与其他样本的主要问题是,我的私钥环包括一个签名密钥,当试图加载密钥进行解密时,该密钥首先出现。这就是为什么我必须在键上添加一个检查ElGamalPrivate ateKeyParameters类型的原因。

下面是我的代码。不是很干净,但它能工作。

        private static PgpPrivateKey GetPrivateKey(string privateKeyPath)
    {
        using (Stream keyIn = File.OpenRead(privateKeyPath))
        using (Stream inputStream = PgpUtilities.GetDecoderStream(keyIn))
        {
            PgpSecretKeyRingBundle secretKeyRingBundle = new PgpSecretKeyRingBundle(inputStream);

            PgpSecretKey key = null;
            foreach (PgpSecretKeyRing kRing in secretKeyRingBundle.GetKeyRings())
            {
                foreach (PgpSecretKey secretKey in kRing.GetSecretKeys())
                {
                    PgpPrivateKey privKey = secretKey.ExtractPrivateKey("1234567890".ToCharArray());

                    if (privKey.Key.GetType() ==
                        typeof (Org.BouncyCastle.Crypto.Parameters.ElGamalPrivateKeyParameters))
                        //Org.BouncyCastle.Crypto.Parameters.ElGamalPrivateKeyParameters
                    {
                        return privKey;
                    }
                }

            }
        }
        
        return null;
    }





    public static void Decrypt(Stream input, string outputpath, String privateKeyPath)
    {
        input = PgpUtilities.GetDecoderStream(input);
        try
        {
            PgpObjectFactory pgpObjF = new PgpObjectFactory(input);
            PgpEncryptedDataList enc;
            PgpObject obj = pgpObjF.NextPgpObject();
            if (obj is PgpEncryptedDataList)
            {
                enc = (PgpEncryptedDataList)obj;
            }
            else
            {
                enc = (PgpEncryptedDataList)pgpObjF.NextPgpObject();
            }

       


            
            PgpPrivateKey privKey = GetPrivateKey(privateKeyPath);


            PgpPublicKeyEncryptedData pbe = enc.GetEncryptedDataObjects().Cast<PgpPublicKeyEncryptedData>().First();
            Stream clear;
            clear = pbe.GetDataStream(privKey);
            PgpObjectFactory plainFact = new PgpObjectFactory(clear);
            PgpObject message = plainFact.NextPgpObject();
            if (message is PgpCompressedData)
            {
                PgpCompressedData cData = (PgpCompressedData)message;
                Stream compDataIn = cData.GetDataStream();
                PgpObjectFactory o = new PgpObjectFactory(compDataIn);
                message = o.NextPgpObject();
                if (message is PgpOnePassSignatureList)
                {
                    message = o.NextPgpObject();
                    PgpLiteralData Ld = null;
                    Ld = (PgpLiteralData)message;
                    Stream output = File.Create(outputpath + "\\" + Ld.FileName);
                    Stream unc = Ld.GetInputStream();
                    Streams.PipeAll(unc, output);
                }
                else
                {
                    PgpLiteralData Ld = null;
                    Ld = (PgpLiteralData)message;
                    //Stream output = File.Create(outputpath + "\\" + Ld.FileName);
                    Stream output = File.Create(outputpath);
                    Stream unc = Ld.GetInputStream();
                    Streams.PipeAll(unc, output);
                }
            }
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
    }
 类似资料:
  • 我试图使用java BouncyCastle库解密和验证PGP消息,但遇到了一些问题,抱怨PartialInputStream过早结束。 我知道encrypt工作得很好,因为我可以在命令行上使用gpg解密和验证使用encrypt函数创建的消息。

  • 我有一个使用Bouncy Castle进行PGP解密的应用程序,它在过去的8个月里没有任何问题,而在过去的两天里,突然出现了一个问题,GetDataStream方法抛出了一个异常: 异常消息:“错误设置非对称密码”。 内部异常消息:“不是RSA密钥”。 更新2--我从上周找到了工作的文件,我还下载了BouncyCastle的源代码,这样我就可以通过调试查看异常抛出的位置,以及在工作的文件和不工作的

  • 问题内容: 我有一个名为’filename.txt.pgp’的PGP文件,需要解密。当我从命令行运行解密时,它仅询问我密码。我使用gpg命令: 密码足够,我的文件已解密。我可以阅读它的内容。 现在,我应该用Java创建一个实用程序。经过研究,我发现Bouncy Castle图书馆是我最好的选择。但是我可以找到的所有Java示例都使用我没有的公共/专用密钥文件。 您能帮我举一个Java示例,该示例仅

  • 问题内容: 我正在用Python编写程序,以通过安装程序分发给Windows用户。 该程序需要能够每天下载使用用户公钥加密的文件,然后再解密。 因此,我需要找到一个Python库,该库将允许我生成公共和私有PGP密钥,并解密使用该公共密钥加密的文件。 pyCrypto是否会做这件事(文档模糊)?还有其他纯Python库吗?使用任何语言的独立命令行工具如何? 到目前为止,我所看到的只是GNUPG,但

  • 在那之后,我试着拿回我的子键,以防它们还在身边。我可以看到我的钥匙和子钥匙在GPG钥匙串OSX应用程序。使用和进行列表时,我获得了与主密钥和子密钥相关联的所有公钥,但只获得了主密钥和其中一个子密钥的秘密(我没有导出到yubikey的那个)。 尝试调试更多,我决定使用一个较新版本的gpg来合并密钥等等,希望我能拿回秘密(我想在这一点上它已经不可能了,但我一直在尝试) 使用,它告诉我有一个主密钥和两个

  • 我目前正在用java编写一个加密消息传递服务,我使用的是bouncycastle PGP库。我编写了一个生成密钥对的测试程序,并对消息进行加密/解密。这已经工作了一段时间,但它最近在解密阶段停止了,给了我一个InvalidKeyException。 我做了一些研究,下载了JCE.jar文件,并将它们导入到我的项目中(通过Eclipse Project->Properties->add extern