是否有两个关键的对称交换加密函数?

kle*_*fas 3 encryption cryptography encryption-symmetric

我想知道是否有一些强大的(如AES等)加密功能,如下所示:

  • 对称的
  • 2个键:明文 - > 2个键 - >加密文本,但它必须与键的顺序无关,即

Key1(Key2(明文))== Key2(Key1(明文))例如"可交换"(也需要解密 - 你需要两个密钥,无关紧要)

谢谢

bdo*_*lan 7

通过将任何块加密算法置于CTR模式,可以轻松完成此操作.使用单个键的点击率模式如下所示:

ciphertext = plaintext XOR cipher(key, counter)
Run Code Online (Sandbox Code Playgroud)

其中,计数器初始化为IV,并为每个块递增.解密是完全相同的操作.因此,如果您使用两个密钥进行两次CTR加密,则会得到:

ciphertext = plaintext XOR cipher(key0, counter) XOR cipher(key1, counter)
Run Code Online (Sandbox Code Playgroud)

由于XOR是可交换的,因此您可以按任意顺序对其进行反转.

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

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

后来,要解密:

  1. 查理(执行解密)将签名的(IV,散列(密文))元组发送给Alice和Bob中的每一个,以及密文.
  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. 查理计算明文=密文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)
Run Code Online (Sandbox Code Playgroud)

虽然其他一些海报已经对秘密共享发表了评论,但如果您不需要只需要一部分密钥进行解密的属性,这就太过分了 - 即,使用秘密共享,您可以使用三个密钥加密,但只需要任何两个解密.如果您想要所有密钥,秘密共享方案并不是必需的.