19

我有一个使用 Bouncy Castle 进行 PGP 解密的应用程序,它在过去 8 个月左右的时间里运行没有任何问题,而在过去的 2 天里突然出现了一个问题,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;
}

密钥没有过期,它没有过期日期:

在此处输入图像描述

我没有对应用程序进行任何更改,我没有触摸按键,所以我不太明白为什么会突然出现问题。有任何想法吗?我还可以使用我在应用程序中加载的相同密钥使用 Kleopatra 手动解密文件。

更新 1 - 我下载了适用于 .NET 的 OpenPGP 库的免费试用版,它看起来也可以使用 BouncyCastle,并且使用相同的密钥解密文件没有问题。出于某种原因,我使用已经工作了几个月的 BouncyCastle 进行解密的实现由于某种我无法识别的原因而停止工作。

更新 2 - 我从上周提取了有效的文件,并且我还下载了 BouncyCastle 的源代码,以便我可以逐步调试并查看异常抛出的位置以及变量在有效文件和一个不起作用的文件。在 PgpPublicKeyEncryptedData 类的 GetDataStream 方法的开头抛出异常:

byte[] plain = fetchSymmetricKeyData(privKey);

当我进入此方法时,对于我可以毫无问题地解密的文件,我注意到 keyData.Algorithm 变量设置为“ElGamalEncrypt”,而对于异常抛出的文件,文件 keyData.Algortithm 设置为“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 setting asymmetric cipher", e);
    }

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

在此处输入图像描述

更新 3 - 在给定当前密钥的情况下,我一直无法弄清楚如何解决该问题。我昨天生成了新密钥(类型 DSA),并且使用新密钥问题已经解决。

更新 4 - 这个问题刚刚再次出现,我上次更新时使用的新密钥。再一次,PgpPublicKeyEncryptedData 类中的 keyData.Algorithm 现在被“RsaGeneral”而不是“ElGamalEncrypt”看到。为什么算法属性会改变?加密文件的人是否在改变某些东西?

4

2 回答 2

1

这可能很重要(来源: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);
            }
        }
于 2012-06-21T09:47:10.507 回答
0

看起来另一方正在加密其他/不同的密钥。可能您的密钥环也包含 RSA 密钥,但 BouncyCastle 仅使用第一个 (???)。使用 gpg,您可以通过发出 gpg --list-packets YourEncryptedFile.pgp 检查加密文件的内容

之后,将相同的命令应用于“好”文件和您的密钥环,并将密钥标识符与加密文件进行比较。由于您使用的是 DSA 密钥,因此应将文件加密为 ElGamal 子密钥。

于 2012-12-02T09:59:18.053 回答