X.509 è un formato per certificati : un certificato è una sequenza di byte che contiene, in un formato specifico, un nome e una chiave pubblica , su cui un firma digitale è calcolata e incorporata nel certificato. Il firmatario è una Autorità di certificazione che afferma che la chiave pubblica è effettivamente posseduta dall'entità conosciuta sotto quel nome. Verificando la firma, è possibile accertarsi che il certificato sia autentico, cioè è ciò che ha emesso la CA; e, in questo modo, ottieni fiducia nell'associazione del nome con la chiave pubblica (nella misura in cui credi che la CA sia onesta e non troppo credulona, e come sai la chiave CA per la verifica della firma, che può comportare l'ottenimento di un certificato per la CA, e verificando tale certificato, e così via, fino ad un trust anchor alias certificato radice ).
Quindi, X.509 è un modo per distribuire le chiavi pubbliche , con cui intendo: un metodo che consente a vari attori (ad es. tu) di sapere, con una certa garanzia di non alterazione da parte di terzi malevoli parti (cioè "attaccanti") le chiavi pubbliche di altri attori.
OpenPGP è un formato standard per molte cose. Una delle cose che OpenPGP definisce è un modo per codificare una chiave pubblica insieme a un "nome" (un indirizzo email) e una firma su questi due. Questo è, in realtà, un certificato a sé stante (anche se con un formato che non è compatibile con X.509). Ma OpenPGP definisce anche come usare la chiave pubblica di un dato individuo (chiamiamolo Butch) per cifrare un mucchio di byte che solo Butch, usando la sua chiave privata , sarà in grado di decifrare. Tecnicamente, questo utilizza una chiave di sessione generata a caso, utilizzata con AES (o simile) per crittografare i dati non elaborati e quella chiave di sessione è ciò che è crittografato con la chiave pubblica del destinatario (generalmente di tipo RSA o ElGamal).
Pertanto, per il tuo problema, non vuoi "criptare con X.509". X.509 non definisce nulla sulla crittografia. Ciò che desideri è di utilizzare un formato standard che descrive la crittografia con la chiave pubblica del destinatario e si basa sui certificati X.509 per la distribuzione della chiave pubblica. Questo formato standard, abbinato a X.509, sarebbe analogo a OpenPGP. Questo formato standard esiste e si chiama CMS (precedentemente noto come "PKCS # 7"). Quando gli oggetti CMS vengono inviati tramite e-mail, questo diventa un altro livello dello standard, che è chiamato S / MIME .
CMS (o S / MIME) è ciò che serve per la comunicazione asincrona: si prepara un blob, da inviare in seguito al destinatario, come quello che si fa con OpenPGP. Se riesci a creare una comunicazione sincrona (mittente e destinatario sono "online" contemporaneamente), puoi utilizzare SSL / TLS (o la sua controparte Web HTTPS ). In SSL, il server ha una chiave pubblica, che invia al client come certificato X.509. Il client convalida il certificato, quindi utilizza la chiave pubblica in esso contenuta per stabilire una chiave di sessione con il server e crittografare i dati con quella chiave di sessione.
In ogni caso, l'assemblaggio degli algoritmi crittografici nei protocolli è noto per essere difficile da eseguire correttamente, quasi impossibile da testare per la sicurezza e pieno di pericoli. Quindi non immaginare di poter costruire il tuo mix; dovresti davvero fare affidamento su uno standard esistente, come CMS o SSL.