假设我有一个服务器向四方发布信息(例如通过消息总线):A,B,C和D.所有流量都可以由任何一方以加密形式发现。为了利用这些信息,显然需要对其进行解密:
显然,这可以通过为每一方提供完全独立的公钥/私钥对,然后按照上述要求共享私钥来实现。不幸的是,这个不能很好地扩展到数百个派对。
有更好的方法吗?
修改
基本上,我想要做的是让每个人都拥有他们的私钥,并且在加密消息时,我要说它是用key = A | B | C
加密的,这意味着这意味着任何密钥A,B或C的人都可以解密它。想象一下可以装上n
锁的行李箱,其中任何一个都可以打开后备箱。
答案 0 :(得分:3)
想象一家超市。每个货架都可以独立存放。有一百个货架堆垛机,每个堆垛机堆叠多个货架。这些堆垛机有经理,他们可以查看所有下属的货架。这些股票经理的部门经理可能有复杂的关系,例如经理A能够看到经理B的货架子集。有几家商店经理可以看到一切。
我认为可扩展性问题不是来自使用公钥加密。它取决于您的需求的复杂性(希望拥有如此多的可配置组)。
如果您要将相同的加密邮件发送给数百个参与方,并且可能存在应该读取它们的任意子集,并且您希望以后能够修改这些权限,则需要提供每个人都是他自己的钥匙对。
然后,您将发送对称加密的消息(使用随机会话密钥)以及为所有收件人加密的会话密钥副本。
如果您经常看到完全相同的子集,则可以扩展这些会话密钥的有效性以跨越多个消息。然后你不需要每次都传输所有的密钥(不过你应该在一段时间之后仍然将它们过期)。
货架堆垛机,库存经理,区段经理或商店经理都不会对公钥/私钥加密有任何线索
好吧,他们的软件/设备会处理它。
答案 1 :(得分:1)
这是一种需要n次密钥交换的方式,但是将消息本身保持为与双方通信一样小。
假设您的问题的一般形式是:
您可以使用此密钥交换步骤:
然后发送一个安全级别为m的消息,只需用密钥k_m对其进行加密。
该方案的一个副作用是,如果一个< p_b,则p_b没有能力阻止聚会p_a解密他们发送的消息。湾希望没关系。
答案 2 :(得分:1)
使用基于公钥加密的常规协议可以实现您的目标。 Bouncy Castle Crypto APIs支持OpenPGP和CMS,其中任何一种都可以在Scala中使用。
设置一切:
协议允许使用多个公钥进行加密。例如,如果您使用PGPEncryptedDataGenerator之类的内容,则可以为希望能够解密邮件的每个收件人调用addMethod(PGPPublicKey)方法。
API有很多细微差别,但单元测试和示例将真正帮助您导航它们。
实施细则
两种协议的工作原理基本相同。
收件人撤消解密邮件的过程
答案 3 :(得分:-1)
你能使用像Blowfish这样的自定义加密吗? 在这种情况下,您可以共享Blowfish加密密钥并将其存储在一个属性文件中! 当数据到达时,根据目标和属性文件中的键值,您可以尝试解密它们