Вопрос по c#, bouncycastle, encryption-asymmetric, encryption, pgp – Bouncy Castle PGP Проблема с расшифровкой

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

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

enter image description here

Я не вносил никаких изменений в приложение, я не касался клавиш, поэтому я не совсем понимаю, почему возникла проблема. Есть идеи? Я также могу вручную расшифровать файлы, используя Kleopatra, используя те же ключи, которые я загружаю в приложение.

Update 1 - Я скачал бесплатную пробную версию дляБиблиотека OpenPGP для .NET, который также использует BouncyCastle, и у меня нет проблем с расшифровкой файлов с использованием того же ключа. По какой-то причине моя реализация дешифрования с использованием BouncyCastle, которая работала в течение нескольких месяцев, перестала работать по какой-то причине, которую я пока не смог определить.

Update 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

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

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

Я действительно надеялся, что это может быть API для отказов луны. BigOmega
Может быть, срок действия сертификата с ключами RSA истек? Вы можете это проверить? Oleksi
Чего долгие. ххххххх Joshua
Большую часть времени, когда вы сталкиваетесь с проблемами, которые случаются время от времени, это не сам процесс шифрования / дешифрования. Обычно это связано с неправильным вводом / выводом. В случае шифрования наиболее распространенной проблемой является то, что байты рассматриваются как символы и передаются как таковые. Проблема в том, что не все байты кодируются в символы, что приводит к потере данных. Самое интересное в криптографии - то, что результат должен выглядеть как случайные символы, поэтому часто возникают проблемы такого рода.now and then, Тестируйте с большими, случайно сгенерированными наборами данных, чтобы избежать таких проблем. Maarten Bodewes
Я проверил это ранее и только что добавил скриншот, у нашего ключа нет срока годности. Кроме того, я могу вручную расшифровать файлы с помощью такой утилиты, как Kleopatra, используя те же ключи. Так что ключи хорошие. mservidio

Ваш Ответ

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

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

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

Похожие вопросы