es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descifrar y verificar un mensaje PKCS7 en C#

Estoy tratando de descifrar y verificar una respuesta PKCS7 que recibo del cliente utilizando C#.
Inicialmente intenté encriptar y firmar mi carga útil y seguí la respuesta mencionada aquí.

Ahora estoy recibiendo nuevamente una respuesta en PKCS7 y tengo problemas para descifrar y verificar la respuesta.

Intenté usar EnvelopedCMS:

        ecms.Decode(Convert.FromBase64String(payloadContent));
        ecms.Decrypt(new X509.X509Certificate2Collection { _signerCert });
        string decodedContent = Encoding.UTF8.GetString(ecms.ContentInfo.Content);

Aquí, _signerCert es mi propio certificado con clave privada.

Puedo ver mi respuesta requerida en decodedContent junto con alguna información del cliente y algunos caracteres ASCII desconocidos.
Referencia de la ventana inmediata de Visual Studio

¿Alguien sabe cómo puedo lograr el descifrado y la verificación de la respuesta entrante?

Solución encontrada:

Usé SignedCms de la siguiente manera, como sugirió @bartonjs

SignedCms signedCMS = new SignedCms();
signedCMS.Decode(ecms.ContentInfo.Content);
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en c#, .net, criptografía, x509certificate y BouncyCastle, puedes utilizar la clase SignedCms para descifrar y verificar la respuesta entrante. Primero, deberás usar EnvelopedCMS para decodificar la respuesta entrante, y luego inicializar una instancia de la clase SignedCms. Una vez hecho esto, puedes decodificar el contenido de la instancia de EnvelopedCMS y utilizarlo para inicializar la instancia de SignedCms. Por último, puedes verificar la firma llamando al método SignedCms.CheckSignature(), pasando la instancia de X509Certificate2Collection como argumento.

    Aquí tienes un ejemplo de código que ilustra cómo lograr el descifrado y la verificación de la respuesta entrante:

    EnvelopedCms ecms = new EnvelopedCms();
    ecms.Decode(Convert.FromBase64String(payloadContent));
    byte[] encodedCMSSignedData = ecms.ContentInfo.Content;
    SignedCms signedCMS = new SignedCms();
    signedCMS.Decode(encodedCMSSignedData);
    X509Certificate2Collection collection = new X509Certificate2Collection(_signerCert);
    signedCMS.CheckSignature(collection, true);
    

    En este ejemplo de código, payloadContent contiene la respuesta PKCS7 que recibiste del cliente. Deberás reemplazar _signerCert con tu propia instancia de X509Certificate2, que contiene la clave privada que necesitas utilizar para el descifrado. Una vez que hayas decodificado la respuesta PKCS7 utilizando la instancia de EnvelopedCMS, puedes utilizar su propiedad ContentInfo.Content para inicializar la instancia de SignedCms. Luego, puedes llamar al método CheckSignature() para verificar la firma, pasando la instancia de X509Certificate2Collection como primer argumento. El segundo argumento indica si el método debe lanzar una excepción si falla la verificación de la firma.

    Espero que esto te ayude a lograr el descifrado y la verificación de la respuesta entrante. Avísame si tienes alguna otra pregunta o inquietud.

Comments are closed.