bouncycastleprovider bouncy c# encryption bouncycastle pgp encryption-asymmetric

bouncycastleprovider - bouncy castle c# download



Bouncy Castle PGP Decryption Issue (2)

He tenido una aplicación que utiliza Bouncy Castle para el descifrado PGP que se ha ejecutado sin problemas durante los últimos 8 meses aproximadamente, y los últimos 2 días, de repente, surgió un problema en el que el método GetDataStream está generando una excepción:

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 caducado, 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 cargo en la aplicación.

Actualización 1 : descargué la versión de prueba gratuita de OpenPGP Library para .NET , que también parece usar BouncyCastle, y no tengo problemas para descifrar los archivos con la misma clave. Por alguna razón, mi implementación de descifrado con BouncyCastle que ha funcionado durante varios meses dejó de funcionar por alguna razón que aún no he podido identificar.

Actualización 2 : saqué los archivos de la semana pasada que funcionaron, y también descargué el código fuente de BouncyCastle para poder avanzar y depurar para ver dónde está la excepción y cómo difieren las variables entre un archivo que funciona y un archivo que no funciona. La excepción se lanza al principio del método GetDataStream de la clase PgpPublicKeyEncryptedData:

byte[] plain = fetchSymmetricKeyData(privKey);

Cuando paso a este método, para los archivos que puedo descifrar sin ningún problema, he notado que la variable keyData.Algorithm está establecida en "ElGamalEncrypt", mientras que para los archivos que arroja la excepción, el archivo keyData.Algortithm está establecido en "RsaGeneral". ¿Por qué estos difieren? ¿La empresa que me envió los archivos cambió su método de encriptación? ¿Y este método de cifrado no es soportado adecuadamente por 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); }

Además, no está seguro de si esto está relacionado, el tipo de certificado de nuestra clave es DSA.

Actualización 3 : no he podido averiguar cómo resolver el problema hasta ahora, dadas las claves actuales. Ayer generé nuevas claves (tipo DSA), y con las nuevas claves se resolvió el problema.

Actualización 4 : este problema acaba de aparecer nuevamente, con la nueva clave que funcionó en mi última actualización. Una vez más, el keyData.Algorithm dentro de la clase PgpPublicKeyEncryptedData se está viendo a "RsaGeneral" en lugar de "ElGamalEncrypt" ahora. ¿Por qué cambiaría la propiedad del algoritmo? ¿Está la persona encriptando el archivo cambiando algo?


Esto podría ser importante (Fuente: http://www.opensourcejavaphp.net/csharp/itextsharp/PgpPublicKeyEncryptedData.cs.html ):

Explica el valor de su keyData. El algoritmo es diferente, pero aún no estoy seguro de por qué. Es muy probable que el archivo de entrada sea el caso. Podría ser diferente (cliente usando una clave diferente?)

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


Parece que otra parte está encriptando a otras claves / diferentes. Probablemente, su anillo de claves también contenga la clave RSA, pero BouncyCastle usa solo la primera (???). Usando gpg, puede verificar el contenido de su archivo encriptado emitiendo gpg --list-packets YourEncryptedFile.pgp

Después de eso, aplique el mismo comando al archivo ''bueno'', ya sus llaveros, y compare los identificadores de clave con los que está cifrado el archivo. Ya que está utilizando claves DSA, el archivo debe estar cifrado en la subclave ElGamal.