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

Bouncy Castle PGP解密问题

酆景辉
2023-03-14

我有一个使用Bouncy Castle进行PGP解密的应用程序,它在过去的8个月里没有任何问题,而在过去的两天里,突然出现了一个问题,GetDataStream方法抛出了一个异常:

异常消息:“错误设置非对称密码”。

内部异常消息:“不是RSA密钥”。

private static PgpObjectFactory getClearDataStream(PgpPrivateKey privateKey, PgpPublicKeyEncryptedData publicKeyED)
{
    // Exception throws here.
    Stream clearStream = publicKeyED.GetDataStream(privateKey);

    PgpObjectFactory clearFactory = new PgpObjectFactory(clearStream);
    return clearFactory;
}

更新2--我从上周找到了工作的文件,我还下载了BouncyCastle的源代码,这样我就可以通过调试查看异常抛出的位置,以及在工作的文件和不工作的文件之间变量有何不同。在PgpPublicKeyEncryptedData类的GetDataStream方法的开头引发异常:

byte[] plain = fetchSymmetricKeyData(privKey);

当我进入这个方法时,对于我可以毫无问题地解密的文件,我注意到keydata.algorithm变量被设置为“elgamalencrypt”,而对于异常引发的文件,文件keydata.algorithm被设置为“rsageneral”。为什么会有不同呢?给我发文件的公司有没有改变加密方法?而BouncyCastle是否不正确地支持这种加密方法呢?

private byte[] fetchSymmetricKeyData(PgpPrivateKey privKey)
{
    IBufferedCipher c1 = GetKeyCipher(keyData.Algorithm);

    try
    {
        c1.Init(false, privKey.Key);
    }
    catch (InvalidKeyException e)
    {
        throw new PgpException("error html" target="_blank">setting asymmetric cipher", e);
    }

此外,不确定这是否相关,我们的密钥的证书类型是DSA。

更新3-我一直无法找到如何解决这个问题,到目前为止,给出了当前的密钥。我昨天生成了新的密钥(类型DSA),使用新的密钥,这个问题已经解决了。

更新4-这个问题又出现了,使用了在我上次更新中起作用的新密钥。现在,PgpPublicKeyEncryptedData类中的KeyData.Algorithm被视为“rsageneral”,而不是“ElGamalEncrypt”。为什么算法属性会改变?加密文件的人是在改变什么吗?

共有1个答案

松烨烨
2023-03-14

这可能很重要(来源:http://www.opensourcejavaphp.net/csharp/itextsharp/pgppublickeyencrypteddata.cs.html):

它解释了你的keydata.algorithm的值是不同的,但为什么我仍然不确定。最有可能的是输入文件。可能会有所不同(客户端使用不同的密钥?)

private static IBufferedCipher GetKeyCipher(
            PublicKeyAlgorithmTag algorithm)
        {
            try
            {
                switch (algorithm)
                {
                    case PublicKeyAlgorithmTag.RsaEncrypt:
                    case PublicKeyAlgorithmTag.RsaGeneral:
                        return CipherUtilities.GetCipher("RSA//PKCS1Padding");
                    case PublicKeyAlgorithmTag.ElGamalEncrypt:
                    case PublicKeyAlgorithmTag.ElGamalGeneral:
                        return CipherUtilities.GetCipher("ElGamal/ECB/PKCS1Padding");
                    default:
                        throw new PgpException("unknown asymmetric algorithm: " + algorithm);
                }
            }
            catch (PgpException e)
            {
                throw e;
            }
            catch (Exception e)
            {
                throw new PgpException("Exception creating cipher", e);
            }
        }
 类似资料:
  • 6)当我尝试解密消息时,我得到两个“gpg:[不知道]:无效数据包”消息,解密失败:

  • 我的Arduino板上有以下代码: 它可以加密和解密,我在串行下一个输出: njf 00 xnz 92 nvczkexeuhkg = = < br >解密:123456789 但问题是,如果我使用在线工具进行解密https://www.devglan.com/online-tools/aes-encryption-decryption,键1234567891234567、IV 7654321987

  • 问题内容: 我有以下加密数据: 对其进行解密的密码是: (这是来自胡言乱语的例子) 在命令行中使用openssl: 输出为: 使用我的NodeJS应用程序: 我在一行中遇到以下错误。 我想念什么吗?谢谢。 问题答案: 加密的数据以8字节的“魔术”开头,表示存在盐(的ASCII编码)。然后接下来的8个字节是盐。现在是个坏消息:Node.js似乎没有对EVP_BytesToKey方法使用盐: 那是盐。

  • 我已经创建了Azure VM,并在其中安装了我的Java应用程序,然后连接到WASB存储。 我添加了以下jars和core-site.xml来从Java应用程序访问WASB存储。 Azure-存储 Hadoop-Azure core-site.xml 如何使用加密密钥访问WASB存储。上面的配置有样例吗? 注意:-我将Azure VM直接连接到WASB存储,而不使用HDInsight集群。

  • 我一直在试图找出java安全/加密库的方法,我相信我在理解发生了什么方面取得了一些进展。我想我设法让加密部分工作了。在encrypt方法中,如果我只是尝试返回,我会得到一些看起来像加密文本的不可读的杂乱无章的东西。当我试图不返回它,而是继续调用decrypt并进行明文-->encrypt-->decrypt是我所拥有的一切时,问题就来了 所以我用一些明文调用encrypt,并尝试返回明文以确保它工

  • 我面临AES填充问题。我使用的是Alcides Soares FIlho(用C#生成128位字符串)中建议的代码。请注意,我的加密侧码是。。。 另外,我传递给明文的值是“Z4YAZZSQ 001F295E2589AWAN HANS”。加密正在进行。但解密失败了。 解密侧码 我应该能拿回“Z4YAZZSQ 001F295E2589AWAN HANS” 但出现以下错误“填充无效,无法删除”请建议解决方