Encryption 有两个密钥对称交换加密函数吗?

Encryption 有两个密钥对称交换加密函数吗?,encryption,cryptography,encryption-symmetric,Encryption,Cryptography,Encryption Symmetric,我想知道是否有一些强大的(如AES等)加密功能可以这样工作: 对称的 2个键:纯文本->2个键->加密文本,但不能影响键的顺序,即 Key1(Key2(明文))==Key2(Key1(明文)) e、 g.“交换的” (解密也需要-您需要两个密钥,顺序无关紧要) 谢谢你说的是秘密分裂。是的,有很多关于它的研究。维基百科将是一个很好的起点。您可以制作一个交换加密算法,但加密方法必须限于。这将限制加密功能的强度,因为它大大减少了可能使用的加密方法。因此,如果一个黑客想要破坏你的算法,而新算法是可交

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

  • 对称的
  • 2个键:纯文本->2个键->加密文本,但不能影响键的顺序,即
Key1(Key2(明文))==Key2(Key1(明文)) e、 g.“交换的” (解密也需要-您需要两个密钥,顺序无关紧要)


谢谢

你说的是秘密分裂。是的,有很多关于它的研究。维基百科将是一个很好的起点。

您可以制作一个交换加密算法,但加密方法必须限于。这将限制加密功能的强度,因为它大大减少了可能使用的加密方法。因此,如果一个黑客想要破坏你的算法,而新算法是可交换的,这将大大提高他破坏它的机会,因为他需要尝试的解密方法会减少。然而,这对于您的目的来说可能是好的,这取决于您预期的黑客攻击量


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

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

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

要用简单的术语解释沙米尔的方法,请考虑图形上的一条线。如果你知道这条线上的任何两点,你就知道这条线的一切。任何字节字符串,如对称密码的加密密钥,在base-256中都只是一个大数字。Shamir的算法将此秘密视为直线的“y-截距”(x=0时直线的y坐标)。然后随机选择直线的斜率。计算x=1、x=2、x=3……处直线的y坐标,并将每个点指定给不同的股东

如果这些股东中的任何两人聚在一起,他们可以通过他们的两点画一条线,回到y轴。它与轴相交处的y坐标是原始机密。然而,每个股东只有一点;单凭他们自己,他们猜不出关于原始秘密的任何事情

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

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


您可以使用

的实现,这可以通过将任何块加密算法放入。单键CTR模式如下所示:

ciphertext = plaintext XOR cipher(key, counter)
其中计数器初始化为,并为每个块递增。解密是完全相同的操作。因此,如果您使用两个密钥对CTR加密两次,您将得到:

ciphertext = plaintext XOR cipher(key0, counter) XOR cipher(key1, counter)
由于XOR是可交换的,所以可以按任意顺序反转它

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

  • Alice和Bob执行经过身份验证的Diffie Helmann交换以生成IV。然后将该IV发送给Charlie
  • Alice计算ctr=0…密文块数的摘要(key0,IV+ctr),并将结果KS_A发送给Charlie
  • Bob计算ctr=0…密文块数的摘要(键1,IV+ctr),并将结果KS_B发送给Charlie
  • Charlie计算KS_A XOR KS_B XOR明文,并将生成的密文发送给Alice和Bob
  • Alice和Bob各自签署一个元组(IV,哈希(密文),加密数据的描述)。这是附在密文上的
  • 稍后,要解密:

  • Charlie(执行解密)将签名(IV,哈希(密文))元组以及密文发送给Alice和Bob
  • Alice验证他的签名元组,计算KS_A,并将密文XOR KS_A=D_A发送给Charlie
  • Bob验证他的签名元组,计算KS_B,并将密文XOR KS_B=D_B发送给Charlie
  • 查理计算KS=D_A XOR D_B=KS_A XOR KS_B
  • Charlie计算明文=密文XOR KS
  • 这里的签名元组和DH exchange的目的是确保不会通过向Alice和Bob发送不同的IV来欺骗他们解密错误的流。这可能与您的使用场景无关。此外,在实际实现中,Charlie的角色可能由Alice或Bob扮演

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

    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)
    
    尽管其他一些海报对秘密共享发表了评论,但如果你不需要解密只需要密钥子集的属性,那么这就太过分了——也就是说,在秘密共享中,你可以用三个密钥加密,但只需要任意两个密钥就可以解密。如果您需要所有密钥,请使用秘密共享