encryption - 是否有两个 key 对称交换加密函数?

标签 encryption cryptography encryption-symmetric

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

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

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

谢谢

最佳答案

这可以通过将任何 block 加密算法放入 CTR mode 来轻松完成。单键点击率模式如下:

ciphertext = plaintext XOR cipher(key, counter)

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

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

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

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

  1. Alice 和 Bob 执行经过身份验证的 Diffie-Hellman 交换来生成 IV。然后将此 IV 发送给 Charlie。
  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. Charlie(执行解密)向 Alice 和 Bob 发送签名的 (IV, hash(ciphertext)) 元组以及密文。
  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 模式的潜在安全风险,另一种选择是对 session key 使用 CTR 模式加密,该 session key 又用于以更正常的模式进行加密,例如 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)

尽管其他一些发帖人评论了 secret 共享,但如果您不需要解密只需要 key 子集的属性,这将是多余的 - 即,通过 secret 共享,您可以使用三个 key 进行加密,但只需要任意两个解密。如果您想要求所有 key ,那么 secret 共享方案并不是必需的。

关于encryption - 是否有两个 key 对称交换加密函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6389849/

相关文章:

c# - 对Cookie进行加密编码

qt - QsslSocket : Cannot access peer (client) certificate on other peer (server)

hash - MD5 和 SHA 有哪些字符池?

encryption - go crypto/ecdsa 即使数据不同也要验证是否为真

cryptography - 从 X509 证书读取 RSA 私钥会导致 Windows Server 2016 与 Windows Server 2019 上的不同输出

c - openssl AES256 文件部分多重加密(稍后加入)

encryption - 对称密码学和盐

node.js - Node.js 中的加密和解密

java - Java 程序为 VB 应用程序生成的文件的编码问题

encryption - 使用 helm 和 gcp_kms 加密 Secrets.yml 文件时 key 权限被拒绝