2013-04-16 27 views
0

请首先阅读这个问题,因为标题不是很清楚,我无法用几句话来提出我的问题。创建和签署公钥/私钥对编程

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

我需要一点点头以编程方式创建这个公钥/私钥对。我再次需要通过中央服务器的私钥签署对等公钥,以便了解其真实性。

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

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

谢谢。

回答

0

经典PKI的情况......你想要一个CA ...

所有您同行需要提前了解的公共CA证书......

一次与服务器的同行寄存器,它应该加密自己的密钥,以便服务器可以确保接收到的密钥没有被篡改...

的数据结构,你应该使用X509

但从程序员点:

对A想用新的密钥对注册...

- >生成密钥对
- >填写证书的识别细节,并附上公钥 (你现在通常称为“证书请求”)

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

在服务器侧:

解密,检查数据,尤其是请求 的识别信息,如果这是确定,取请求(ID部分+公共密钥)并用CA密钥

报告回对等体A并且移交签名证书因斯它不包含任何秘密,这可能是明文或与同行一所提供的密钥)

,一旦你需要让同行之间的接触,你只需要一些联系人信息加密:

如果同行X想要联系同伴A,所有您必须分发的地址是如何联系A的地址......然后,X联系A并要求提供ID(“您好?这是A吗?请给我你的证书,这里是我的证书。“)...证书交换后,验证签名......如果CA sig确定,双方都会生成随机数(”nonces“;数字一旦使用)并用接收和验证的证书中的公钥对它们进行加密,并将它们交给另一个对等体......在接收到加密值时解密,并用其他方密钥重新加密,并且在接收到解密后该值与您自己的私人密钥,并验证它是相同的号码您发送...已验证的连接已建立,您现在可以继续交接对称密钥,并开始传输加密数据

如果您认为您可以在没有身份验证的情况下生活另一个节点,你可以直接开始传输加密数据后,你检查他们的证书上的CA信号......但考虑到在这种情况下,一个attac ker可以接收不适合他的数据(他不能解密,但他可以假装成另一个同伴......)

+0

非常感谢。我正在考虑类似于这个实现的东西,但我也有其他的实现,并没有能够找出哪一个去。我认为的另一种方法是让服务器在注册过程中创建密钥对和证书,并签署证书并将其发回给对等方。但我想我会去执行这个实现。而且我没有像真正的CA那样创建一个CA,但是我将拥有一个中央服务器的自签名证书和密钥对。并用它来签署所有的对等证书。 –

+0

您能否告诉我任何安全隐患:不使用已建立的CA软件并自己执行此类任务。签名部分看起来非常简单,我没有看到有任何CA软件的意义。 –

+0

好...什么是CA软件? ...如果你看看openssl,它包含一个“小CA”......围绕openssl的基本操作的一堆脚本......你正在构建的是一个CA ......事实上......您的CA将拥有自签名证书...好吧...查看其他CA ...浏览器中的所有根CA都有自签名证书......唯一的区别是:这些证书随浏览器或您的操作系统一起提供...你的应用将与你的应用一起交付......这个CA将和其他任何... – DarkSquirrel42

1

你在概念上得到很多点击的原因,但不是编程的原因是它很难拿出一个好的协议,而不是难以实际编程它。这也是正确的顺序,这种协议你不能随后编程和记录。

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

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

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

你应该只关心编程时,你已经知道了所有这些(至少)。

+0

这是很多免费的建议,应该向你收费:) –

+0

你能指点我任何有关X509和实现的良好教程? –