3

我想知道是否有一些强大的(比如 AES 左右)加密功能可以像这样工作:

  • 对称的
  • 2个密钥:明文-> 2个密钥->密文,但是密钥的顺序必须无关紧要,即

Key1 (Key2 (plaintext)) == Key2 (Key1(plaintext)) 例如“交换”(解密也需要 - 你需要两个密钥,顺序无关)

谢谢

4

4 回答 4

7

这可以通过将任何块加密算法置于CTR 模式来轻松完成。单键 CTR 模式如下所示:

ciphertext = plaintext XOR cipher(key, counter)

其中 counter 初始化为您的IV并为每个块递增。解密是完全相同的操作。因此,如果您使用两个密钥进行 CTR 加密两次,您将获得:

ciphertext = plaintext XOR cipher(key0, counter) XOR cipher(key1, counter)

由于 XOR 是可交换的,因此您可以按任意顺序反转它。

这具有很好的属性,您不需要将所有键都放在同一位置。考虑:Alice、Bob 和 Charlie 正在参与一个协议,其中 Charlie 将为 Alice 和 Bob 双重加密数据(该协议将假设所有点对点通信都通过通常的类似 SSL 的通道进行保护):

  1. Alice 和 Bob 执行经过身份验证的 Diffie-Helmann 交换以生成 IV。然后将此 IV 发送给查理。
  2. Alice 为 ctr = 0...number-of-ciphertext-blocks 计算摘要(key0, IV + ctr),并将结果 KS_A 发送给 Charlie
  3. Bob 为 ctr = 0...number-of-ciphertext-blocks 计算摘要(key1, IV + ctr),并将结果 KS_B 发送给 Charlie
  4. Charlie 计算 KS_A XOR KS_B XOR 明文,并将生成的密文发送给 Alice 和 Bob。
  5. Alice 和 Bob 各自签署一个元组(IV、散列(密文)、加密数据描述)。这是附加到密文中的。

后来,解密:

  1. 查理(执行解密)将签名的(IV,散列(密文))元组发送给爱丽丝和鲍勃,以及密文。
  2. Alice 验证他的签名元组,计算 KS_A,并将密文 XOR KS_A = D_A 发送给 Charlie
  3. Bob 验证他的签名元组,计算 KS_B,并将密文 XOR KS_B = D_B 发送给 Charlie
  4. 查理计算 KS = D_A XOR D_B = KS_A XOR KS_B
  5. Charlie 计算明文 = 密文 XOR KS

此处签名元组和 DH 交换的目的是确保 Alice 和 Bob 不会通过向他们发送不同的 IV 来欺骗他们解密错误的流。这可能与您的使用场景无关。此外,在实际实现中,Charlie 的角色可能由 Alice 或 Bob 扮演。

如果您担心 CTR 模式的潜在安全风险,另一种选择是在会话密钥上使用 CTR 模式加密,而会话密钥又用于以更正常的模式进行加密,例如CBC。那是:

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)

尽管其他一些发帖者对秘密共享发表了评论,但如果您不需要解密只需要一个密钥子集的属性,这就是过大了 - 即,通过秘密共享,您可以使用三个密钥进行加密,但只需要两个密钥即可解密。如果您想要求所有密钥,那么秘密共享方案并不是必需的。

于 2011-06-17T18:52:04.780 回答
4

这不是交换加密,但有经过充分验证的秘密共享算法(注意,这与“密钥协议”不同。)

最著名的两种方法是 Shamir 和 Blakley。一般来说,这些算法采用秘密并产生许多“份额”。当有足够的份额达到阈值时,可以恢复秘密。在最简单的情况下,需要两股,但门槛可以更高。

为了简单地解释 Shamir 的方法,请考虑图表上的一条线。如果你知道线上的任意两点,你就会知道关于这条线的一切。任何字节串,例如对称密码的加密密钥,都只是一个大数字,以 base-256 为单位。Shamir 的算法将此秘密视为直线的“y 轴截距”(x=0 时直线的 y 坐标)。然后随机选择线的斜率。计算 x=1、x=2、x=3、... 处的线的 y 坐标,并将每个点分配给不同的股东。

如果这些股东中的任何两个聚在一起,他们可以通过他们的两个点画一条线,回到 y 轴。它与轴相交处的 y 坐标是原始秘密。但是,每个股东只有一个点;靠他们自己,他们根本猜不透原来的秘密。

可以通过增加多项式的次数来增加阈值。例如,如果使用抛物线而不是直线,则需要三股而不是两股。

真正的实现还有更多,比如使用模运算,但这是它背后的概念。Blakley 的方法类似,但它使用平面的交集来编码秘密。

您可以在网上玩转 Shamir 方法的实现。

于 2011-06-17T18:39:09.023 回答
0

您可以制作可交换加密算法,但加密方法必须限于可交换操作。这将限制加密函数的强度,因为它大大减少了可以使用的可能加密方法。因此,如果黑客想要破解你的算法并且新的算法是可交换的,这将大大提高他破解它的机会,因为他需要尝试的解密方法减少了。但是,这对于您的目的可能没问题,具体取决于您期望的黑客攻击程度。

另外,正如 atk 所提到的,我不确定“秘密分裂”是否是你想要的。我已经简要地查看了它,但是从我所看到的(至少对于基本情况)来说,您不能单独执行操作,因为需要同时提供两个密钥才能执行加密/解密操作。换句话说,您不能使用一个人的密钥调用 encrypt 以获得可以使用第二个密钥调用 encrypt 的结果。但是,如果您同时拥有两个密钥,这可能是一个不错的尝试方法。

于 2011-06-17T18:33:44.640 回答
-1

你说的是秘密分裂。是的,对此进行了大量研究。维基百科将是一个很好的起点。

于 2011-06-17T18:08:57.710 回答