【问题标题】:How to encrypt one message for multiple recipients?如何为多个收件人加密一封邮件?
【发布时间】:2010-09-07 12:28:42
【问题描述】:

使用两个密钥(可能是基于密码的)完成数据加密的基本原理是什么,但只需要两个密钥中的一个(任意一个)来解密数据?

例如,数据用用户密码和他公司的密码加密,然后他或他的公司可以解密数据。他们都不知道另一个密码。仅存储一份加密数据。

我不是指公钥/私钥。可能是通过对称密钥加密技术,也许它涉及将密钥异或在一起以使用它们进行加密。

更新:我也想找到一个根本不涉及存储密钥的解决方案。

【问题讨论】:

标签: security encryption cryptography


【解决方案1】:

通常这样做的方式是生成一个对称密钥来加密数据。然后,您使用每个收件人的密钥或密码加密对称密钥,以便他们可以自己解密。 S/MIME(实际上是 S/MIME 所基于的加密消息语法)使用这种技术。

这样,您只需存储一份加密消息的副本,但要存储其密钥的多个副本。

【讨论】:

  • 这种方法有安全问题吗?如果我将多个文件(每个文件具有不同的对称密钥)发送到相同的收件人列表(称为 A 和 B)。 A 是否可以查看对称密钥(源文本)和 B 的加密形式,如果发送了足够多的消息,可以确定 B 的密钥吗?
  • Asa,它将取决于用于加密内容(消息)加密密钥的算法。一些算法可能容易受到攻击。我通常使用 RSA 来加密内容加密密钥,在那里,正确的填充模式可以防御明文攻击。我尽可能使用 OAEP。
  • erickson,因此您将拥有用于加密消息的密钥 A,然后向用户 1 发送使用 1 的 pub 密钥加密的 A 副本,向用户 2 发送使用 2 的 pub 密钥加密的 A 副本等等?
  • @user8675309 是的
  • @nrek 他不会只是发布解密的消息吗?但是,是的,发布他的密钥也会做同样的事情。没有办法向某人透露秘密,但要阻止他们向他人透露;这是每个 DRM 方案失败的核心。
【解决方案2】:

一般而言,您所做的是使用随机生成的密钥加密数据,然后附加已使用每个已知密钥加密的随机密钥版本。因此,任何拥有有效密钥的人都可以发现用于加密数据的“真实”密钥。

【讨论】:

    【解决方案3】:

    如果我对您的理解正确,您有一些数据愿意加密并分发加密密钥,分成 n 个“密钥块”。(在您的情况下为 2 块)

    为此,您可以使用基于 XOR 的拆分,它的工作原理如下: 您提供所需的数量 - n 和密钥 - K。要生成 n 件密钥,您需要创建 (n – 1) 个随机数:R1、R2、R3、... . . , Rn-1。为此,您可以使用 SecureRandom 数字生成器,这将防止我们重复。然后您对这些 Rn-1 件和您的密钥 - K 操作 XOR 函数:
    Rn = R1 ⊕ R2 ⊕ R3 ⊕ 。 . . ⊕ Rn−1 ⊕ K

    现在您有了 n 个片段:R1、R2、R3、...、Rn-1、Rn,您可以销毁 K。这些片段可以在您的代码中传播或发送给用户。

    要重新组装密钥,我们对 Rn 片段使用 XOR 运算:
    K = R1 ⊕ R2 ⊕ R3 ⊕ 。 . . ⊕ Rn−1 ⊕ Rn

    使用 XOR 函数 (⊕),每个部分在密钥的重建中都具有内在重要性,如果任何部分中的任何位发生更改,则密钥不可恢复。

    有关更多信息和代码,您可以查看我为此目的编写的 Android 实用程序:
    GitHub 项目:https://github.com/aivarsda/Secret-Key-Split-Util

    您还可以尝试使用该实用程序的 Secret Key Splitter 演示应用程序:
    GooglePlay:https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter

    【讨论】:

      【解决方案4】:

      我想我想到了一个可行的解决方案:

      D = data to encrypt
      h1 = hash(userpassword)
      h2 = hash(companyPassword)
      k = h1 concat h2
      
      E = function to encrypt
      //C is the encrypted data
      C = E_h1(h2) concat E_h2(h1) concat E_k(D)
      

      然后任何一个人都可以解密另一个人的哈希,然后将它们组合起来解密其余的数据。

      也许还有比这更好的解决方案?

      【讨论】:

      • 该解决方案将起作用,尽管当有超过 2 个键时它变得笨拙。
      【解决方案5】:

      在更一般的情况下,可以将秘密(在此应用程序中,数据的解密密钥)拆分为多个份额,以便恢复秘密需要一些阈值数量的这些份额。这称为秘密共享或具有 n 个共享且阈值为 t,即 (t,n)-阈值方案。

      可以做到这一点的一种方法是创建一个 t-1 阶的多项式,将秘密设置为第一个系数,然后随机选择其余的系数。然后,选择这条曲线上的n个随机点,成为股份。

      【讨论】:

      • 对于他的用例,秘密共享将是退化的,因为 t = 1,“曲线”将是穿过秘密的水平线。另外,请注意,随机选择共享点并不重要。在实践中,股票通常按顺序发行:1、2、3...
      猜你喜欢
      • 1970-01-01
      • 2012-12-23
      • 2017-03-30
      • 2018-05-30
      • 2019-04-26
      • 2014-05-11
      • 2011-11-15
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多