我有一个使用Bouncy Castle进行PGP解密的应用程序,过去8个月左右一直没有任何问题,但是在过去的两天中突然出现了一个问题,GetDataStream方法抛出了异常:
异常信息:"error setting asymmetric cipher"。
内部异常信息:"Not an RSA key"。
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 Library 免费试用版,它看起来也使用 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”。为什么算法属性会改变?加密文件的人是否更改了某些内容?