如何为多个收件人加密一封邮件?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

另见:superuser.com/q/554513/199930 【参考方案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...

以上是关于如何为多个收件人加密一封邮件?的主要内容,如果未能解决你的问题,请参考以下文章

Flask Mail:如何为发件人添加自定义名称?

是否可以在 cloudformation 模板中创建具有多个电子邮件收件人的 SNS 主题?

使用 ActionMailer 在 Rails 中发送给多个收件人

给大伙推荐一款全自动加密软件-密信MeSince

不要向收件人发送电子邮件

emil 的使用