以编程方式创建和签署公钥/私钥对

时间:2013-04-16 19:53:38

标签: c++ windows cryptography public-key-encryption

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

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

当你想出所有这些(至少)时,你应该只担心编程。

答案 1 :(得分:0)

经典PKI场景......你想要一个CA ......

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

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

对于数据结构,你应该使用X509

从程序员的角度来看:

同伴A希望注册一个新的密钥对...

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

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

在服务器端:

解密,检查数据,特别是请求的标识信息 如果没关系,请接受请求(ID部分+公钥)并使用CA密钥签名

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

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

如果同伴X想要联系同伴A,你需要分发的地址是如何联系A的地址......然后联系A并询问身份证(“你好?这是A?请给我你的证书这是我的证书。“)...证书交换后,签名被验证...如果CA sigs没问题,双方都会生成随机数(”nonce“; number-once-used)并用它们加密来自接收和验证的证书的公钥并将其交给另一个对等方...一旦接收到加密值,就会被解密,并与其他方密钥重新加密,并在收到后用自己的密钥解密...私钥,并验证它与您发送的号码相同...已建立经过身份验证的连接,您现在可以继续切换对称密钥并开始传输加密数据

如果您认为可以在不验证其他对等方的情况下生存,则可以在检查其证书上的CA sig后直接开始传输加密数据...但请注意,在这种情况下,攻击者可以接收不适合他的数据(他无法解密,但他可以假装成另一个同伴......)