我想创建一个应用程序,其中多个人应该能够安全地相互通信(想想一个分散的群聊) - 听起来很简单,但这是我的问题:
据我所知,对于非对称加密,您有一个公钥和一个私钥。每个想要向某人发送消息的人都必须使用公钥对其进行加密,并且收件人可以使用私钥对其进行解密。
但如果有两个以上的人应该能够阅读所有信息,我不知道这应该如何运作......
每个人都有公钥和私钥 - 我认为这是一个坏主意 - 或者每个人都必须拥有每个公钥,并且必须向每个收件人发送单独的邮件。
另外,我想100%肯定,发送信息的人确实是他假装的人。 (所以没有人能够“伪造”消息)
是否有解决我问题的加密算法?
答案 0 :(得分:3)
在a comment到Richard Schwartz' good answer,您要求
使用此算法是否可以确保只有一个人能够邀请其他人?据我所知,每个人都可以分发解密的会话密钥。
在群聊项目中应用协议时,请不要让词语"会话密钥"误导你。相反,将对称加密的关键视为"消息密钥":每当有人向组发送消息时,他们应该生成新的随机对称密钥,并使用每个合法的接收者对其进行加密。公钥分开并将所有这些密码前置到对称加密的消息中。通过这种方式,每个发件人可以独立决定他们认为自己发送邮件的合法收件人组的一部分。
这会给协议带来更多的传输开销,但这在实践中可能不重要。重要的是成本'得到更多的“好”'随机性(熵)生成足够不可预测的消息密钥。因此,可接受的优化可能是,如果合法接收者组保持不变,则发送者可以重新使用他们自己先前发送的消息的会话密钥。但是,他们永远不应该重新使用从另一个组成员收到的会话密钥来发送他们自己的消息。
当然,即使每个发件人独立决定他们认为是他们信息的合法接收者,也不能让任何合法的收件人妥协他们收到的邮件:他们可以简单地转发未加密的邮件(或为某人加密)对于他们想要的任何人,不在原始收件人组中。
在原始问题的修改中,您添加了
另外,我想100%肯定,发送信息的人确实是他假装的人。 (所以没有人能够"假的"消息)
加密不能这样做,但加密有另一种方法来确保
确保这些事情的方式是签名,这也是公钥 - 私钥密码术所能实现的。让发件人使用私钥签署他们的邮件。 (这通常意味着使用私钥加密消息的加密安全散列。)并让接收方验证签名(通过“解密”签名与发件人的签名)公钥并将结果与他们自己计算的消息的散列进行比较。)
理查德的答案建议你不要推出自己的(伪)随机数生成器。对于您计划在制作中使用的任何内容,我将其扩展为任何加密:
相反,使用完善的加密库。这些都是由加密理论和编写安全软件实践的专家撰写和审阅的。虽然这些图书馆经常被发现有(有时令人尴尬的)安全问题,但你自己想出的任何内容都不会像他们那样安全。
尽管如此,对于学习,实现任何或所有列出的内容(包括伪随机数生成器)都是很好的练习,并且可以帮助您理解底层加密的至少某些方面。这种理解很重要,因为即使你做对这些概念有一些了解,它也很难正确,安全地使用成熟的库。他们通过他们的界面透露出来。
当然,对于密码学中的创新,发明新东西(并由该领域的专家社区仔细审查)也是必要的。只有的新内容不应该用于之前 之前已成功通过该审核的任何内容。
答案 1 :(得分:2)
我认为你的意思是非对称加密,而不是异步加密。
在大多数情况下,我们实际上并不使用非对称密码来加密消息内容。这是因为消息可能很大,并且与对称密码相比,非对称密码很慢。这也是因为你在这里争论的问题:在一个多方通信中,你希望能够只发送一次消息并让每个人都能阅读它。因此,技巧是我们将非对称和对称技术结合到一个解决问题的协议中。
首先,我们生成一个随机对称密钥,我们可以将其称为“会话密钥”。我们要将此会话密钥分发给所有收件人,但我们需要安全地执行此操作。这是我们实际使用非对称加密的地方。我们使用每个公钥和非对称密码(例如RSA)为每个收件人加密一次会话密钥,并将加密的会话密钥发送到每个recipeint。我们可以单独发送给每个收件人,或者我们可以构建一个如下所示的结构:
"recip1|recip1EncryptedSessionKey|recip2|recip2EncryptesSessionKey..."
并将所有收件人发送给所有收件人,每个收件人都可以解析它并解密他们自己的会话密钥加密副本。 (这通常是在加密电子邮件中完成的方式:所有收件人的会话密钥的所有加密版本列表都附有邮件,每个人都收到完全相同的电子邮件。)
一旦我们将会话密钥安全地分发给所有收件人,我们就可以使用会话密钥使用对称密码(例如AES)对每封邮件进行一次加密,并将相同的加密邮件发送给所有收件人。由于他们都收到了会话密钥的副本,所以他们都可以阅读并对其进行操作。
请注意,与所有与加密有关的事情一样,至关重要会话密钥实际上是随机的。不要只依靠普通的香草随机数生成器,为了天堂,不要自己动手。确保使用cryptographically secure pseudorandom number generator。
真正的聊天系统可能会相当复杂,可能会有一种定期重新建立新会话密钥的机制,而且安全协议的细节可能非常复杂。即,考虑如何防止一个坏人踩到并愚弄每个人使用他选择的会话密钥!但基本原理如上所述。