Подтвердить что ты не робот

Проблема с расшифровкой Bouncy Castle PGP

У меня было приложение, использующее 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;
}

Ключ не истек, у него нет даты истечения срока действия:

enter image description here

Я не внес никаких изменений в приложение, я не коснулся ключей, поэтому я не могу понять, почему проблема возникла из-под контроля. Есть идеи? Я также могу вручную расшифровать файлы с помощью 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.

enter image description here

Обновление 3. Мне не удалось выяснить, как решить эту проблему, но с учетом текущих ключей. Вчера я создал новые ключи (тип DSA), а с новыми ключами проблема была решена.

Обновление 4. Эта проблема снова появилась, с новым ключом, который работал в моем последнем обновлении. Еще раз, keyData.Algorithm в классе PgpPublicKeyEncryptedData теперь рассматривается как "RsaGeneral" вместо "ElGamalEncrypt". Почему свойство Algorithm изменилось? Является ли человек, который шифрует файл, что-то меняет?

4b9b3361

Ответ 1

Это может быть важно (Источник: http://www.opensourcejavaphp.net/csharp/itextsharp/PgpPublicKeyEncryptedData.cs.html):

Он объясняет значение вашего ключевого слова. Алгоритм отличается, но почему я все еще не уверен. Скорее всего, это входной файл. Он может быть другим (клиент использует другой ключ?)

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);
            }
        }

Ответ 2

Похоже, что другая сторона шифрует другие/разные ключи. Вероятно, ваш keyring содержит ключ RSA, но BouncyCastle использует только первый (???). Используя gpg, вы можете проверить содержимое зашифрованного файла, выпустив gpg --list-пакеты YourEncryptedFile.pgp

После этого примените ту же команду к "хорошему" файлу, к вашим ключам и сравните идентификаторы ключей, в которые файл зашифрован. Поскольку вы используете ключи DSA, файл должен быть зашифрован в подраздел ElGamal.