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.
¿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);
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:
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 propiedadContentInfo.Content
para inicializar la instancia de SignedCms. Luego, puedes llamar al métodoCheckSignature()
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.