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:
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.
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?
Bitrot. xxxxxxx – Joshua
Forse il certificato con le chiavi RSA è scaduto? Puoi controllare questo? – Oleksi
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