He tenido una aplicación que usa Bouncy Castle para el desencriptado de PGP que se ha ejecutado sin problemas durante los últimos 8 meses, y en los últimos 2 días ha surgido un problema donde el El método GetDataStream está lanzando una excepción:Bouncy Castle PGP Decryption Issue
Mensaje de excepción: "error al establecer el cifrado asimétrico".
Mensaje de excepción interna: "No es una clave 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 clave no ha expirado, no tiene fecha de caducidad:
no he hecho ningún cambio en la aplicación, no he tocado las teclas, por lo que no puedo entender por qué un problema ha surgido de la nada. ¿Algunas ideas? También puedo descifrar manualmente los archivos usando Kleopatra usando las mismas claves que cargué en la aplicación.
Actualización 1 - He descargado la versión de prueba para OpenPGP Library for .NET, que se parece a usar BouncyCastle también, y no tengo ningún problema de descifrar los archivos que utilizan la misma clave. Por algún motivo, mi implementación de descifrado con BouncyCastle que funcionó durante varios meses dejó de funcionar por algún motivo que aún no he podido identificar.
Actualización 2 - Me tiró de archivos desde la semana pasada que trabajó, y también he descargado el código fuente de BouncyCastle con el fin de que pueda pasar a través de depuración y para ver dónde está lanzando la excepción y cómo difieren las variables entre un archivo que funciona y un archivo que no funciona. La excepción está siendo lanzado al inicio del método de la clase GetDataStream PgpPublicKeyEncryptedData:
byte[] plain = fetchSymmetricKeyData(privKey);
Cuando entro en este método, para los archivos que puedo descifrar sin ningún problema, me he dado cuenta de que el keyData.Algorithm la variable se establece en "ElGamalEncrypt", mientras que para los archivos que arroja la excepción, el archivo keyData.Algortithm se establece en "RsaGeneral". ¿Por qué diferirían? ¿La empresa que me envió los archivos cambió su método de encriptación? ¿Y BouncyCastle no es compatible con este método de encriptación?
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);
}
Además, no estoy seguro de si está relacionado, el tipo de certificado de nuestra clave es DSA.
Actualización 3 - He sido incapaz de encontrar la manera de resolver el problema hasta el momento, dadas las claves actuales. Genere nuevas claves (tipo DSA) ayer, y con las nuevas claves el problema se ha resuelto.
Actualización 4 - Este problema acaba de volver a surgir, con la nueva clave que funcionó en mi última actualización. Una vez más, el keydata.Agorgorm dentro de la clase PgpPublicKeyEncryptedData se está viendo ahora en "RsaGeneral" en lugar de "ElGamalEncrypt". ¿Por qué cambiaría la propiedad Algorithm? ¿La persona que encripta el archivo está cambiando algo?
Bitrot. xxxxxxx – Joshua
¿Quizás expiró el certificado que contiene las claves RSA? ¿Puedes verificar esto? – Oleksi
Lo he comprobado anteriormente, y acabo de agregar una captura de pantalla, nuestra clave no tiene una fecha de vencimiento. Además, puedo descifrar los archivos manualmente usando una utilidad como Kleopatra usando las mismas teclas. Entonces las llaves son buenas. – mservidio