Un "certificado" según la definición utilizada en criptografía es información sobre una entidad criptográfica en un formato específico y firmada por una "autoridad de certificación" o CA; X.509 es el tipo de certificado más común y el utilizado por PKCS # 7 o su versión actualizada de CMS (y S / MIME, que es una envoltura delgada en CMS). Si desea firmar sus propios datos, no datos de certificados criptográficos especiales, desea SignedData , que es una de varias opciones (con algunas subopciones también) en PKCS # 7 / CMS. Los datos no necesitan ser ASCII, pero si están bien, y si se trata de ASCII imprimible canónico (sin caracteres de control excepto CRLF para el salto de línea), entonces puede usar la subopción "firma separada", lo que permite que cualquiera pueda ver la parte de datos sin ninguna herramienta especial (pero no puede modificarla sin invalidar la firma). Tener una CA raíz que emite certificados para varias entidades que usan esos certificados y sus claves para firmar y verificar datos es un uso bog estándar de PKCS # 7 / CMS .
Tenga en cuenta que PKCS # 7 a veces se usa como "transportista" para certificados X.509 y / o CRL, pero no los datos del usuario. Los certificados y las CRL están firmados internamente por la CA que los emite, y no necesitan ni obtienen protección adicional. Eso es diferente del caso SignedData, donde los datos del usuario necesitan y se agrega una firma.
Según el comentario, el formato PGP , implementado por GnuPG y algunos competidores, tiene las mismas capacidades básicas (y casi todos los objetivos) que PKCS # 7 / CMS / SMIME: las partes generan pares de teclas que puede estar certificado o puede ser distribuido y confiable por otros medios; luego, las partes utilizan una clave privada para firmar (de forma arbitraria) los datos que cualquier destinatario puede verificar utilizando la publicación, o utiliza una publicación (o varias) para cifrar los datos que solo los destinatarios pueden descifrar utilizando la clave privada (s). (PKCS # 7 / CMS llama a este último "envolvente" para distinguirlo de otras formas de cifrado.)
Existen diferencias técnicas : PKCS # 7 / CMS usa la codificación ASN.1 (al igual que X.509), mientras que PGP usa su propia estructura de paquetes etiquetada. ambos usualmente usan base64 "armadura"; PGP identifica las claves por una identificación hexadecimal abreviada y las partes generalmente por una dirección de correo electrónico, mientras que X.509 y PKCS # 7 / CMS identifican las claves por (generalmente) un hash y las partes por una estructura de "Nombre Distinguido" que puede ser terriblemente complicada pero en Una situación que controlas puede ser bastante simple.
Pero la diferencia más visible es que PGP se presenta principalmente como una línea de comandos o programa GUI que ejecuta para generar claves, firmar, etc. PKCS # 7 / CMS se implementa en al menos algunas bibliotecas y como parte de algunas Otros programas como Microsoft Outlook, pero el único programa independiente que conozco es la utilidad de línea de comandos en OpenSSL, que después de una larga evolución tiene algunas peculiaridades que requieren un poco de tiempo para acostumbrarse. OTOH si desea que su programa (s) lea y verifique el archivo (y posiblemente también lo cree y firme), la API de la biblioteca OpenSSL es en su mayoría sencilla y razonablemente bien documentada, si están utilizando C o C ++ o cualquier cosa que pueda llamar a C. Para Java hay una buena biblioteca de terceros de BouncyCastle. MSDN dice que dot-NET tiene soporte. Cualquier otra cosa, haz tu pregunta más específica.