我想知道是否有一些强大的(如AES等)加密函数可以这样工作:
Key1(Key2(plaintext))== Key2(Key1(plaintext)) 例如“交换” (也需要解密 - 你需要两把钥匙,顺序无关紧要)
感谢
答案 0 :(得分:7)
这可以通过将任何块加密算法放入CTR mode来轻松完成。使用单个键的点击率模式如下所示:
ciphertext = plaintext XOR cipher(key, counter)
其中,计数器初始化为IV,并为每个块递增。解密是完全相同的操作。因此,如果您使用两个密钥进行两次CTR加密,则会得到:
ciphertext = plaintext XOR cipher(key0, counter) XOR cipher(key1, counter)
由于XOR是可交换的,你可以按任意顺序反转它。
这具有很好的属性,您不需要在同一位置拥有所有密钥。考虑一下:Alice,Bob和Charlie正在参与一个协议,其中Charlie将对Alice和Bob的数据进行双重加密(该协议将假设所有点对点通信都通过类似SSL的通道进行保护):
稍后,解密:
此处签名的元组和DH交换的目的是确保Alice和Bob不会通过向其发送不同的IV来欺骗解密错误的流。这可能与您的使用方案无关。此外,查理的角色可能由Alice或Bob在真实的实现中扮演。
如果您担心CTR模式的潜在安全风险,另一个选择是对会话密钥使用CTR模式加密,而后者又用于以更正常的模式加密,例如{{ 3}}。那就是:
sessionkey = RANDOM
IV_0 = RANDOM
IV_1 = RANDOM
enc_sessionkey = sessionkey XOR cipher(key0, IV_0) XOR cipher(key1, IV_0)
ciphertext = enc_sessionkey + IV_0 + IV_1 + cipherCBC(IV_1, sessionkey, plaintext)
虽然其他一些海报已经对秘密共享发表了评论,但如果您不需要只需要一部分密钥进行解密的属性,那就太过分了 - 例如,秘密共享可能会使用三个密钥进行加密,但只需要任何两个解密。如果您想要所有密钥,则不一定需要秘密共享方案。
答案 1 :(得分:4)
这不是一种可交换的加密技术,但是有一些经过验证的秘密共享算法(请注意,这与不是与“密钥协议”相同。)
两种最着名的方法是Shamir和Blakley。通常,这些算法会产生秘密并产生许多“共享”。当有足够的份额可达到阈值时,可以恢复该秘密。在最简单的情况下,需要两个共享,但阈值可能更高。
用简单的术语解释Shamir的方法,想想图上的一条线。如果您知道线路上的任何两个点,您就会知道该线路的所有内容。任何字节串,如对称密码的加密密钥,只是一个很大的数字,基数为256。 Shamir算法将此秘密视为线的“y轴截距”(当x = 0时线的y坐标)。然后随机选择线的斜率。计算x = 1,x = 2,x = 3,......处的线的y坐标,并且将每个点给予不同的共享持有者。
如果这些股东中的任何一个聚在一起,他们可以通过他们的两个点画回一条线,回到y轴。它与轴交叉的y坐标是原始秘密。但是,每个股东只有一个点;他们自己也无法猜出原来的秘密。
可以通过增加多项式的次数来增加阈值。例如,如果使用抛物线而不是线,则需要三个共享而不是两个。
还有更多真正的实现,比如使用模块化算法,但这是它背后的概念。 Blakley的方法类似,但它使用平面的交叉来编码秘密。
的实现答案 2 :(得分:0)
您可以制作交换加密算法,但加密方法必须限制为commutative operations。这将限制加密函数的强度,因为它极大地减少了可以使用的加密方法。因此,如果一个黑客想破坏你的算法而新的它是可交换的,那么由于他需要尝试的解密方法的减少,它将大大提高他破解它的机会。但是,它可能适合您的目的,具体取决于您期望的黑客攻击程度。
此外,正如atk所提到的,我不确定“秘密分裂”是否适合你。我简要地看了一下,但是从我所看到的情况来看(至少在基本情况下)你不能单独执行操作,因为两个密钥需要一起提供来执行加密/解密操作。换句话说,您不能使用一个人的密钥调用加密来获得可以使用第二个密钥调用加密的结果。但是,如果您同时拥有这两个密钥,这可能是一种很好的尝试方法。
答案 3 :(得分:-1)
你在谈论秘密分裂。是的,已经有很多关于它的研究。维基百科将是一个很好的起点。