2012-06-19 7 views
19

У меня было приложение с использованием Bouncy Castle для расшифровки PGP, которое прошло без каких-либо проблем в течение последних 8 месяцев или около того, и последние 2 дня неожиданно возникла проблема, когда Метод GetDataStream генерирует исключение:Bouncy Castle PGP Decryption Issue

Сообщение об исключении: «установка асимметричного шифра».

Внутреннее сообщение об исключении: «Не ключ 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 Library for .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), а с новыми ключами проблема была решена.

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

+3

Bitrot. xxxxxxx – Joshua

+2

Возможно, срок действия сертификата с ключами RSA истек? Вы можете это проверить? – Oleksi

+0

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

ответ

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.

Смежные вопросы