X.509 es un formato para certificados : un certificado es una secuencia de bytes que contienen, en un formato específico, un nombre y una clave pública , sobre los cuales un firma digital se calcula y se inserta en el certificado. El firmante es una Autoridad de Certificación que afirma que la clave pública es de hecho propiedad de la entidad conocida bajo ese nombre Al verificar la firma, puede asegurarse de que el certificado sea genuino, es decir, es realmente lo que emitió la CA; y, de esa manera, usted gana confianza en la vinculación del nombre con la clave pública (en la medida en que confía en la CA para ser honesto y no demasiado crédulo, y como sabe la clave de la CA para la verificación de la firma, que puede implicar la obtención de un certificado para la CA, y verificando ese certificado, y así sucesivamente, hasta un ancla de confianza también conocido como certificado raíz ).
Por lo tanto, X.509 es una forma de distribuir claves públicas , lo que quiero decir: un método que permite que varios actores (por ejemplo, usted) sepan, con cierta garantía de no alteración por terceros maliciosos partes (es decir, "atacantes") las claves públicas de otros actores.
OpenPGP es un formato estándar para muchas cosas. Una de las cosas que define OpenPGP es una forma de codificar una clave pública junto con un "nombre" (una dirección de correo electrónico) y una firma sobre estas dos. Eso es, en realidad, un certificado por derecho propio (aunque con un formato que no es compatible con X.509). Pero OpenPGP también define cómo usar la clave pública de un individuo determinado (llamémosle Butch) para cifrar un montón de bytes que solo Butch, usando su clave private , podrá descifrar. Técnicamente, esto utiliza una clave de sesión generada aleatoriamente, utilizada con AES (o similar) para cifrar los datos sin procesar, y esa clave de sesión es lo que se cifra con la clave pública del destinatario (generalmente de tipo RSA o ElGamal).
Por lo tanto, para su problema, no desea "cifrar con X.509". X.509 no define nada acerca del cifrado. Lo que desea es utilizar un formato estándar que describa el cifrado con la clave pública del destinatario y se basa en los certificados X.509 para la distribución de la clave pública. Este formato estándar, junto con X.509, sería análogo a OpenPGP. Este formato estándar existe y se llama CMS (anteriormente conocido como "PKCS # 7"). Cuando los objetos de CMS se envían por correo electrónico, esto se convierte en otra capa de estándar, que se llama S / MIME .
CMS (o S / MIME) es lo que necesita para la comunicación asíncrona: usted prepara un blob para enviarlo más tarde al destinatario, como lo que hace con OpenPGP. Si puede realizar una comunicación sincrónica (el remitente y el destinatario están "en línea" al mismo tiempo), entonces puede usar SSL / TLS (o su homólogo en la Web HTTPS ). En SSL, el servidor tiene una clave pública, que envía al cliente como un certificado X.509. El cliente valida el certificado, luego usa la clave pública contenida en él para establecer una clave de sesión con el servidor y cifrar los datos con esa clave de sesión.
En cualquier caso, se sabe que el ensamblaje de algoritmos criptográficos en
protocolos es difícil de hacer correctamente, casi imposible de probar para la seguridad, y lleno de peligros. Así que no imagines que puedes construir tu propia mezcla; realmente debería confiar en un estándar existente, como CMS o SSL.