2012-06-19 29 views
19

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:

enter image description here

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.

enter image description here

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?

+3

Bitrot. xxxxxxx – Joshua

+2

¿Quizás expiró el certificado que contiene las claves RSA? ¿Puedes verificar esto? – Oleksi

+0

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

Respuesta

1

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

En él se explica el valor de su keyData.Algorithm ser diferente, pero la razón por la que todavía estoy seguro de.Lo más probable es que el archivo de entrada sea el caso. Podría ser diferente (¿el cliente usa 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); 
      } 
     } 
0

Parece que otra parte está encriptando a otras claves o diferentes. Probablemente su llavero también contenga clave RSA, pero BouncyCastle usa solo la primera (???). Usando GPG, puede comprobar el contenido de su archivo cifrado mediante la emisión de gpg --list-paquetes YourEncryptedFile.pgp

Después de que se aplica el mismo comando en el archivo de 'bueno', y para sus archivos de claves, y comparar identificadores de clave a qué archivo está encriptado Dado que está utilizando claves DSA, el archivo se debe cifrar a la subclave ElGamal.

Cuestiones relacionadas