Un "certificato" dalla definizione utilizzata in crittografia è informazioni su un'entità crittografica in un formato specifico e firmata da una "autorità di certificazione" o CA; X.509 è il tipo più comune di certificato e quello utilizzato da PKCS # 7 o dalla sua versione aggiornata CMS (e S / MIME, che è un sottile wrapper su CMS). Se vuoi firmare i tuoi dati, non i dati speciali del certificato crittografico, allora vuoi SignedData , che è una delle varie opzioni (con alcune opzioni secondarie) in PKCS # 7 / CMS. Non è necessario che i dati siano ASCII, ma se è corretto, e se è canonico stampabile ASCII (nessun carattere di controllo eccetto CRLF per l'interruzione di riga), allora puoi usare la sotto-opzione "stacca staccata", che consente a chiunque di visualizzare la parte dati senza alcuno strumento speciale (ma non è possibile modificarlo senza invalidare la firma). Avere una CA radice che emette certificati per più entità che utilizzano tali certificati e le relative chiavi per firmare e verificare i dati è un utilizzo standard di bog di PKCS # 7 / CMS .
Si noti che PKCS # 7 viene talvolta utilizzato come "carrier" per i certificati X.509 e / o CRL, ma no per i dati dell'utente. I certificati e i CRL sono firmati internamente dalla CA che li emette e non necessitano di protezione aggiuntiva. Questo è diverso dal caso SignedData, in cui i dati dell'utente hanno bisogno e viene aggiunta una firma.
Come per il commento, il formato PGP , implementato da GnuPG e alcuni concorrenti, ha le stesse funzionalità di base (e praticamente obiettivi) di PKCS # 7 / CMS / SMIME: le parti generano coppie di chiavi che può essere certificato o può essere distribuito e considerato affidabile con altri mezzi; le parti quindi usano una chiave privata per firmare (arbitrariamente) i dati che ogni destinatario può verificare usando la chiave pubblica, o usano un publickey (o diversi) per crittografare i dati che solo i destinatari possono decifrare usando il PrivateKey (s). (PKCS # 7 / CMS chiama quest'ultimo "enveloping" per distinguerlo da altre forme di crittografia).
Esistono differenze tecniche : PKCS # 7 / CMS utilizza la codifica ASN.1 (così come X.509) mentre PGP utilizza la propria struttura di pacchetto con tag; entrambi usano solitamente "armatura" base64; PGP identifica le chiavi con un ID esadecimale piuttosto breve e le parti di solito da un indirizzo email, mentre X.509 e PKCS # 7 / CMS identificano le chiavi di (solitamente) un hash e le parti secondo una struttura "Distinguished Name" che può essere orribilmente complicata ma in una situazione che controlli puoi rendere abbastanza semplice.
Ma la differenza più evidente è che PGP viene principalmente come un programma a riga di comando o GUI che si esegue per generare la chiave, firmare, ecc. PKCS # 7 / CMS è implementato da almeno alcune librerie e come parte di alcuni altri programmi come Microsoft Outlook, ma l'unico programma standalone che conosco è l'utilità della riga di comando in OpenSSL, che dopo una lunga evoluzione ha alcune peculiarità alle quali ci vuole un po 'per abituarsi. OTOH se vuoi i tuoi programmi per leggere e verificare il file (e possibilmente anche crearlo e firmarlo), l'API della libreria OpenSSL è per lo più semplice e ragionevolmente ben documentata, se stai usando C o C ++ o qualsiasi cosa possa chiamare C. Per Java c'è una buona libreria di terze parti da BouncyCastle. MSDN dice che dot-NET ha il supporto. Qualcos'altro, rendi la tua domanda più specifica.