您在潜艇上,并且有一条您想要阅读的加密消息。两个人必须同时使用他们的密钥才能获得纯文本。什么是最好的加密原语?以下两种实现是否合适?
plain_text=decrypt(Key1 XOR key2,ciper_text,IV)
plain_text=decrypt(Key1,decrypt(key2,ciper_text,IV2),IV1)
(假设AES-256-CBC带有CMAC块,如果它对您很重要。)
答案 0 :(得分:18)
将两个随机生成的密钥拼凑在一起以获得最终的秘密肯定是安全的。这种方法的一般形式称为“secret sharing”,并且有一些安全算法允许您生成'm of n'方案,您可以在其中生成n个共享,并且任何m都足以推导出原始密钥。
最着名的方案是Shamir's Secret Sharing,并且涉及生成随机m-1次多项式,其中密钥为常数,然后在n个位置对其进行采样,并将这些多项式作为关键共享给予个人。
答案 1 :(得分:5)
通过对密钥进行异或,您可以保证Key1中的每个位都可能被Key2中的每个位修改(反之亦然)。这意味着Key1的持有者无法计算Key2或XORing Key1 / Key2的结果。
另一种说明这一点的方法是Key1的持有者必须强制每一个可能的位组合来耗尽可用的密钥空间。他已经拥有其中一把钥匙的事实根本无法帮助他。
还有其他方法可以将两个键组合在一起,但当键长度相同时,只需要一个简单的XOR。
答案 2 :(得分:3)
在考虑解决方案之前,您可能想要考虑这些要求。在给定的场景中,如果您有两个人都需要解密消息,则需要
是合理的毕竟你想避免一个人只选择一个随机的密文,假装这个刚刚进来,看到了另一个人的密钥,然后注意到密文一定是骗局。 此要求使选项1的解密变得困难。 由于你使用MAC,你可能也想要那个
这似乎排除了选项2.毕竟Key2的持有者怎么知道Key1的持有者解密了更正并且不只是用他选择的一个替换合法的明文。
我必须承认,我不知道你所描述的场景的一个好的解决方案。潜在的方案可能如下所示:密文是元组c1,c2,d1,d2,其中
c1 = EncryptAndMAC(Key1,Share1)
d1 = MAC(Key2,hash(Share1))
c2 = EncryptAndMAC(Key2,Share2)
d2 = MAC(Key1,Share2)
message = Share1 XOR Share2
现在需要两个密钥来查找消息,双方可以独立解密其共享而无需共享密钥,双方都可以验证对方是否正确解密。当然,这是一个临时协议,所以很可能我错过了一些东西。
答案 3 :(得分:1)
第二个选项:
plain_text=decrypt(Key1,decrypt(key2,ciper_text,IV2),IV1)
不遵守双方必须同时使用其密钥的要求。必须在Key1之前使用Key2,但一旦发生这种情况,第一方(Key1的拥有者)可以等到她选择的时间进行解密,使第二方退出循环。这可能是也可能不是应用程序的问题。
正如Cocowalla的Schneier引用所暗示的那样,XOR有效,除非其中一方能够获得组合密钥(解密器可以保密),而另一方密钥则有其他用途。如果密钥在统计上不是独立的,则XOR的速度意味着密钥组合步骤易受引导强制攻击(decrypt
仍然是瓶颈)。如果密钥是独立的,那么就不需要弄清楚任何部分密钥,也不需要知道一个部分密钥帮助找出组合密钥,因此暴力攻击也可以针对组合密钥而忽略部分。正如caf提到的那样,找出另一个部分密钥是没有意义的,因为它需要组合键;另外,你只能开一次核武器。如果一个密钥只与另一个密钥结合使用(我们不会为不同的系统重用密码,对吗?),XOR是安全的。
有几个加密系统允许k-out-of-n密钥在同时使用时对消息进行解密,但是我不记得他们的这个术语,我的副本{ {1}}不在眼前。
编辑:感谢Cocowalla,该方案的名称是“(m,n)阈值方案”。有关可视化示例,请阅读Dobbs博士发表的Daniel Stoleru撰写的“Visual Cryptography and Bit-Plane Complexity Segmentation”。 Visual cryptography由Naor和Shamir创建,并出现在EUROCRYPT '94(根据Doug Stinson)。
维基百科列出了更多k-out-of-n secret sharing的例子:使用n个点,其中秘密是k-1次多项式;使用k k-hyperplanes,秘密就是交叉点。
答案 4 :(得分:0)
有了这个,我看不出你怎么能实现这样一个要求,即任何两个有足够等级的人 - 能够一起阅读这个消息......
除此之外:根据底层加密算法,拥有一半XOR的密钥可能允许一个人获得完整密钥的一部分,从而显着削弱了保护。
然后,IANAC:)
答案 5 :(得分:-1)
XOR'ing键,而简单的方法,可能不是最好的。我不认为生成的密钥会足够随机 - 如果有密钥1的人能够获得生成的密钥,他们就可以得到密钥2.
为了进一步提高复杂性,也许某种一次性垫是一个很好的计划。重新使用这种系统的密钥可能不是一个好主意:)
以下是重复使用密钥导致问题的示例:
http://en.wikipedia.org/wiki/Venona_project
<强>更新强>
我刚刚从布鲁斯施奈尔出色的 Applied Cryptography 副本中抹去了灰尘,并看了3.6节秘密拆分。这是一个不同的场景,但他建议简单地用信息对密钥进行异或是安全的:
这是Trent可以在Alice和Bob之间拆分消息的协议:
(1)Trent生成一个随机位字符串R,其长度与消息M相同。
(2)Trent X与M一起产生S。
M⊕R= S
(3)特伦特给出 R到Alice和S到Bob。
请注意,他没有说这是否适合守卫导弹发射系统;)