复杂的加密/解密模型 - 这甚至可能吗?

时间:2011-06-27 11:08:43

标签: java security scala encryption public-key-encryption

假设我有一个服务器向四方发布信息(例如通过消息总线):A,B,C和D.所有流量都可以由任何一方以加密形式发现。为了利用这些信息,显然需要对其进行解密:

  • 甲方应该能够阅读所有信息(即解密用于A,B和C的信息)
  • 乙方应该能够阅读针对B和C的信息
  • C方应该只能阅读针对C方的信息
  • D方应该能够阅读B和D的信息

显然,这可以通过为每一方提供完全独立的公钥/私钥对,然后按照上述要求共享私钥来实现。不幸的是,这个不能很好地扩展到数百个派对。

有更好的方法吗?


修改

基本上,我想要做的是让每个人都拥有他们的私钥,并且在加密消息时,我要说它是用key = A | B | C加密的,这意味着这意味着任何密钥A,B或C的人都可以解密它。想象一下可以装上n锁的行李箱,其中任何一个都可以打开后备箱。

4 个答案:

答案 0 :(得分:3)

  

想象一家超市。每个货架都可以独立存放。有一百个货架堆垛机,每个堆垛机堆叠多个货架。这些堆垛机有经理,他们可以查看所有下属的货架。这些股票经理的部门经理可能有复杂的关系,例如经理A能够看到经理B的货架子集。有几家商店经理可以看到一切。

我认为可扩展性问题不是来自使用公钥加密。它取决于您的需求的复杂性(希望拥有如此多的可配置组)。

如果您要将相同的加密邮件发送给数百个参与方,并且可能存在应该读取它们的任意子集,并且您希望以后能够修改这些权限,则需要提供每个人都是他自己的钥匙对。

然后,您将发送对称加密的消息(使用随机会话密钥)以及为所有收件人加密的会话密钥副本。

如果您经常看到完全相同的子集,则可以扩展这些会话密钥的有效性以跨越多个消息。然后你不需要每次都传输所有的密钥(不过你应该在一段时间之后仍然将它们过期)。

  

货架堆垛机,库存经理,区段经理或商店经理都不会对公钥/私钥加密有任何线索

好吧,他们的软件/设备会处理它。

答案 1 :(得分:1)

这是一种需要n次密钥交换的方式,但是将消息本身保持为与双方通信一样小。

假设您的问题的一般形式是:

  • 有n个派对,编号为p_1到p_n
  • 消息的安全级别为m,这样只有派对p_1到p_m才能解密消息。

您可以使用此密钥交换步骤:

  • 生成n个AES密钥,编号为k_1到k_n。
  • 安全地将每个密钥k_i提供给所有参与方p_1到p_i。

然后发送一个安全级别为m的消息,只需用密钥k_m对其进行加密。

该方案的一个副作用是,如果一个< p_b,则p_b没有能力阻止聚会p_a解密他们发送的消息。湾希望没关系。

答案 2 :(得分:1)

使用基于公钥加密的常规协议可以实现您的目标。 Bouncy Castle Crypto APIs支持OpenPGPCMS,其中任何一种都可以在Scala中使用。

设置一切:

  • 每一方都有公钥/私钥对
    • 没有人永远共享私钥。私钥必须保密。
  • 每一方都知道每一方的公钥

协议允许使用多个公钥进行加密。例如,如果您使用PGPEncryptedDataGenerator之类的内容,则可以为希望能够解密邮件的每个收件人调用addMethod(PGPPublicKey)方法。

API有很多细微差别,但单元测试和示例将真正帮助您导航它们。

实施细则

两种协议的工作原理基本相同。

  1. 安全地生成随机对称密钥
  2. 对于每个收件人,使用收件人的公钥加密对称密钥。所有加密的公钥都写入邮件头。
  3. 使用对称密钥加密邮件。这将成为消息内容。
  4. 收件人撤消解密邮件的过程

    1. 搜索发送给自己的密钥的邮件标题。
    2. 使用私钥解密对称密钥。
    3. 使用对称密钥解密邮件内容。

答案 3 :(得分:-1)

你能使用像Blowfish这样的自定义加密吗? 在这种情况下,您可以共享Blowfish加密密钥并将其存储在一个属性文件中! 当数据到达时,根据目标和属性文件中的键值,您可以尝试解密它们