2

请先阅读问题,因为标题不是很清楚,我无法用几句话表达我的问题。

我的场景是这样的: 我正在创建一个 P2P 应用程序。对等点在安装期间生成公钥和私钥对并将公钥上传到我的中央服务器。当对等体 A 想要与对等体 B 通信时,它会下载 B 的公钥并进行正常的加密和数据传输。

我需要一点提示以编程方式创建这个公钥/私钥对。我再次需要对等点的这个公钥由中央服务器的私钥签名,以便知道它的真实性。

我是否必须创建一个私有 CA 之类的东西或任何其他可能的方式?如果有人可以从编程的角度帮助我理解这种创建、签名等,那就太好了。我在谷歌搜索中得到了很多概念,但在编码方面却不多。我是密码学的新手,所以任何其他实现相同的想法都会有所帮助。

注意:我不能使用任何第三方 CA。而且我不是将证书用于身份验证,而是用于加密。

谢谢。

4

2 回答 2

2

您在概念上获得很多成功但在编程上没有获得成功的原因是,很难提出一个好的协议,而实际对其进行编程并不。这也是正确的顺序,这种协议你不能只是在以后编程和记录。

如果您想使用证书/私钥进行签名或加密,这并不重要。关键是公钥需要被信任。如果您不能信任公钥,那么您就不能保证为正确的实体执行了加密。这意味着例如对等点 A 使用 M 的公钥而不是 B 进行加密。这几乎总是一个问题,除非您只对窃听攻击感兴趣。

由于您似乎有一个中央服务器,因此使用分层信任模型似乎是合乎逻辑的。对于这样的系统 PKI,使用 X509 证书和中央 CA 是最有意义的。您可以使用基于 OpenSSL 的 CA 系统或任何其他免费 CA 解决方案,例如 EJBCA 或某些基于 Windows 服务器的解决方案。

当您运行 CA 时,您还没有到那里。您需要一种方法让对等方信任 CA 的根证书。之后,您需要一种方法让 CA 信任对等方发送的证书请求。如果没有更多信息,很难说哪种方法最适合您。

只有在弄清楚所有这些后(至少),您才应该担心编程。

于 2013-04-16T22:35:41.673 回答
0

经典的 PKI 场景……你想要一个 CA……

您所有的同行都需要提前知道公共 CA 证书...

一旦对等点向服务器注册,它应该加密自己的密钥,以便服务器可以确保接收到的密钥没有被篡改......

对于数据结构,您可能应该使用 X509

从程序员的角度来看:

对等体 A 想要注册一个新的密钥对...

-> 生成密钥对
-> 填写证书的标识详细信息,并附上公钥(您现在拥有的通常称为“证书请求”)

-> 对称加密请求(带有随机 IV 的 AES-CBC-256 看起来是一个不错的选择)
-> 加密对称密钥,并将其与加密请求和明文 IV 一起发送到服务器(可选地,包括服务器在加密部分提供随机数或附加会话数据)

在服务器端:

解密,检查数据,尤其是请求的标识信息,如果没问题,获取请求(ID 部分 + 公钥)并使用 CA 密钥签名

向对等点 A 报告并移交签名证书(因为它不包含任何秘密,可能是明文或使用为对等点 A 提供的密钥加密)

一旦你需要在同行之间建立联系,你只需要一些联系信息:

如果对等点 X 想联系对等点 A,您只需提供如何联系 A 的地址...我的证书。”)......在交换证书后,验证签名......如果 CA sig 没问题,双方都会生成随机数(“nonce”;使用过的数字)并使用来自收到并验证的证书并将它们移交给另一个对等方......在收到加密值时解密,并使用其他方密钥重新加密,然后发回......在使用您自己的私钥收到解密值后,并验证它是否与您发送的号码相同...已建立经过身份验证的连接,您现在可以继续移交对称密钥并开始传输加密数据

如果您认为无需对其他对等方进行身份验证就可以生存,则可以在检查其证书上的 CA 签名后直接开始传输加密数据……但请考虑在这种情况下,攻击者可以接收不适合他的数据(他可以'不解密,但他可以假装是另一个同行......)

于 2013-04-16T23:02:35.950 回答