У меня было приложение, использующее 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. Я загрузил бесплатную пробную версию для OpenPGP Library for.NET, которая использует BouncyCastle также, и у меня нет проблем с расшифровкой файлов с использованием того же ключа. По какой-то причине моя реализация расшифровки с использованием BouncyCastle, которая работала несколько месяцев, перестала работать по какой-то причине, которую я еще не смог идентифицировать.
Обновление 2. Я вытащил файлы с прошлой недели, которые сработали, и я также загрузил исходный код BouncyCastle, чтобы я мог выполнить и отладить, чтобы увидеть, где выбрасывается исключение, и как переменные различаются между файлом, который работает, и файлом, который не работает. Исключение создается в начале метода GetDataStream класса PgpPublicKeyEncryptedData:
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. Эта проблема снова появилась, с новым ключом, который работал в моем последнем обновлении. Еще раз, keyData.Algorithm в классе PgpPublicKeyEncryptedData теперь рассматривается как "RsaGeneral" вместо "ElGamalEncrypt". Почему свойство Algorithm изменилось? Является ли человек, который шифрует файл, что-то меняет?