2012-06-19 25 views
19

Ho avuto un'applicazione che utilizza Bouncy Castle per la decodifica di PGP che è stata eseguita senza problemi negli ultimi 8 mesi o giù di lì, e negli ultimi 2 giorni è improvvisamente emerso un problema in cui il Il metodo GetDataStream lancia un'eccezione:Bouncy Castle PGP Decryption Issue

Messaggio di eccezione: "errore impostazione cifratura asimmetrica".

Messaggio di eccezione interno: "Non è una chiave RSA".

private static PgpObjectFactory getClearDataStream(PgpPrivateKey privateKey, PgpPublicKeyEncryptedData publicKeyED) 
{ 
    // Exception throws here. 
    Stream clearStream = publicKeyED.GetDataStream(privateKey); 

    PgpObjectFactory clearFactory = new PgpObjectFactory(clearStream); 
    return clearFactory; 
} 

La chiave non è scaduto, non ha data di scadenza:

enter image description here

Non ho fatto alcuna modifica all'applicazione, non ho toccato i tasti, così ho non riesco a capire perché un problema è venuto fuori dal nulla. Qualche idea? Posso anche decodificare manualmente i file usando Kleopatra usando gli stessi tasti che carico nell'applicazione.

Update 1 - ho scaricato la versione di prova gratuita per OpenPGP Library for .NET, che sembra utilizzare BouncyCastle anche, e non ho problemi di decifrare i file utilizzando la stessa chiave. Per qualche ragione, la mia implementazione della decrittografia con BouncyCastle che ha funzionato per diversi mesi ha smesso di funzionare per qualche motivo che non sono stato ancora in grado di identificare.

Update 2 - ho tirato i file dalla settimana scorsa che ha funzionato, e ho scaricato anche il codice sorgente di BouncyCastle in modo che io possa scorrere ed eseguire il debug per vedere dove l'eccezione sta gettando e come le variabili differiscono tra un file che funziona e un file che non funziona. L'eccezione è stato lanciato all'inizio del metodo GetDataStream della classe PgpPublicKeyEncryptedData:

byte[] plain = fetchSymmetricKeyData(privKey); 

Quando faccio un passo in questo metodo, per i file che posso decifrare senza alcun problema, ho notato che il keyData.Algorithm variabile è impostata su "ElGamalEncrypt", mentre per i file che l'eccezione genera, il file keyData.Algortithm è impostato su "RsaGeneral". Perché questi differirebbero? La società che ha inviato i file ha cambiato il loro metodo di crittografia? E questo metodo di crittografia non è supportato correttamente da 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); 
    } 

Inoltre, non è sicuro se questo è collegato, il tipo di certificato della nostra chiave è DSA.

enter image description here

Update 3 - Sono stato in grado di capire come risolvere il problema di come ancora date le chiavi attuali. Ho generato nuove chiavi (tipo DSA) ieri, e con le nuove chiavi il problema è stato risolto.

Aggiornamento 4 - Questo problema è appena uscito, con la nuova chiave che ha funzionato nel mio ultimo aggiornamento. Ancora una volta, l'algoritmo keyData.Algorithm all'interno della classe PgpPublicKeyEncryptedData viene ora visualizzato in "RsaGeneral" anziché in "ElGamalEncrypt". Perché la proprietà Algorithm cambia? La persona che sta crittografando il file sta cambiando qualcosa?

+3

Bitrot. xxxxxxx – Joshua

+2

Forse il certificato con le chiavi RSA è scaduto? Puoi controllare questo? – Oleksi

+0

L'ho verificato in precedenza e appena aggiunto uno screenshot, la nostra chiave non ha una data di scadenza. Inoltre, posso decifrare manualmente i file usando un'utilità come Kleopatra usando le stesse chiavi. Quindi le chiavi sono buone. – mservidio

risposta

1

questo potrebbe essere importante (Fonte: http://www.opensourcejavaphp.net/csharp/itextsharp/PgpPublicKeyEncryptedData.cs.html):

Spiega il valore della vostra keyData.Algorithm essere diversi, ma il motivo per cui io sono ancora incerti su.È molto probabilmente il file di input che è il caso. Potrebbe essere diverso (client utilizzando una chiave diversa?)

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

Sembra un altro partito è nella cifratura ad altri tasti/differenti. Probabilmente il tuo portachiavi contiene anche la chiave RSA, ma BouncyCastle usa solo il primo (???). Utilizzando gpg, è possibile controllare il contenuto del file crittografato mediante l'emissione di gpg --list-pacchetti YourEncryptedFile.pgp

Dopo di che applicare lo stesso comando per file 'buono', e per i vostri portachiavi, e confrontare identificatori chiave a quale file è crittografato. Poiché si utilizzano le chiavi DSA, il file deve essere crittografato nella sottochiave ElGamal.