X.509是一种证书格式:证书是一个字节序列,其中包含特定格式的名称和公钥,在其上计算数字签名并将其嵌入证书中。签名者是一个证书颁发机构,它断言公钥确实由以该名称已知的实体所有。通过验证签名,您可以确定证书是真实的,即真的是 CA 颁发的;并且,通过这种方式,您在名称与公钥的绑定中获得信任(只要您相信 CA 诚实且不太容易上当受骗,并且您知道用于签名验证的 CA 密钥,这可能需要为CA,并验证该证书,等等,直到信任锚又名根证书)。
因此,X.509 是一种分发公钥的方法,我的意思是:一种允许各种参与者(例如您)知道的方法,并保证恶意第三方(即“攻击者”)不会更改公钥的其他演员。
OpenPGP是很多事情的标准格式。OpenPGP 定义的其中一件事是将公钥与“名称”(电子邮件地址)以及对这两者的签名进行编码的方法。这实际上就是一个证书本身(尽管其格式与 X.509 不兼容)。但是 OpenPGP 还定义了如何使用给定个人(我们称他为 Butch)的公钥来加密一堆只有 Butch 使用他的私钥才能解密的字节。从技术上讲,这使用随机生成的会话密钥,与 AES(或类似方法)一起使用来加密原始数据,并且该会话密钥是使用接收者的公钥(通常为 RSA 或 ElGamal 类型)加密的。
因此,对于您的问题,您不想“使用 X.509 加密”。X.509 对加密没有任何定义。您想要的是使用一种标准格式,该格式描述使用收件人的公钥进行加密,并基于 X.509 证书进行公钥分发。这种标准格式与 X.509 相结合,类似于 OpenPGP。这种标准格式存在,称为CMS(以前称为“PKCS#7”)。当 CMS 对象通过电子邮件发送时,这将成为另一层标准,称为S/MIME。
CMS(或 S/MIME)是异步通信所需的:准备一个 blob,稍后发送给接收者,就像使用 OpenPGP 所做的一样。如果您可以进行同步通信(发送者和接收者同时“在线”),那么您可以使用SSL/TLS(或其 Web 对应物HTTPS)。在 SSL 中,服务器有一个公钥,它作为 X.509 证书发送给客户端。客户端验证证书,然后使用其中包含的公钥与服务器建立会话密钥,并使用该会话密钥加密数据。
无论如何,众所周知,将密码算法组装成协议很难正确完成,几乎不可能测试安全性,并且充满危险。所以不要想象你可以建立自己的混音;你真的应该依赖现有的标准,比如 CMS 或 SSL。