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

Security 如何为多个收件人加密一封邮件?,security,encryption,cryptography,Security,Encryption,Cryptography,使用两个密钥(可以是基于密码的)完成数据加密的基本原理是什么,但只需要两个密钥中的一个(任意一个)来解密数据 例如,使用用户密码和其公司密码对数据进行加密,然后用户或其公司可以解密数据。他们两个都不知道另一个密码。只存储加密数据的一个副本 我不是指公钥/私钥。可能是通过对称密钥加密,也可能是将密钥XORing在一起以用于加密 更新:我还想找到一个根本不涉及存储密钥的解决方案。一般来说,您要做的是使用随机生成的密钥加密数据,然后附加使用每个已知密钥加密的随机密钥的版本。因此,任何拥有有效密钥的人都

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

例如,使用用户密码和其公司密码对数据进行加密,然后用户或其公司可以解密数据。他们两个都不知道另一个密码。只存储加密数据的一个副本

我不是指公钥/私钥。可能是通过对称密钥加密,也可能是将密钥XORing在一起以用于加密


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

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

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


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

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

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)
然后,任何一个人都可以解密另一个人的散列,然后将它们组合起来解密其余的数据


不过,也许有比这更好的解决方案?

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


一种方法是创建一个t-1阶多项式,将秘密设置为第一个系数,然后随机选择其余系数。然后,在这条曲线上选择n个随机点并成为共享。

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

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

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

为了重新组装密钥,我们在Rn块上使用XOR操作:
K=R1⊕ R2⊕ R3⊕ . . . ⊕ 注册护士−1.⊕ 注册护士

使用XOR函数(⊕) 每一个片段在密钥的重建中都具有内在的重要性,如果任何片段中的任何位都发生了变化,则密钥是不可恢复的

有关更多信息和代码,您可以查看我为此编写的Android实用程序:
GitHub项目:

您还可以尝试使用该实用程序的密钥拆分器演示应用程序:

GooglePlay:

对于他的用例,秘密共享将退化,因为t=1,并且“曲线”将是穿过秘密的水平线。另外,请注意,随机选取共享点并不重要。实际上,共享通常按顺序发行:1、2、3…此方法是否存在安全问题?如果我将多个文件(每个文件具有不同的对称密钥)发送到同一收件人列表中(称为A和B)。A能否查看B的对称密钥(源文本)和加密形式,并确定B的密钥(如果发送了足够多的消息)?Asa,这将取决于用于加密内容(消息)的算法加密密钥。某些算法可能容易受到攻击。我通常使用RSA加密内容加密密钥,因此,正确的填充模式可以抵御明文攻击。我尽可能使用OAEP。erickson,因此您将拥有用于加密消息的密钥A,然后向用户1发送一份使用1的pub密钥加密的副本,发送用户2使用2的发布密钥等加密的副本?@user8675309Yes@nrek他不会仅仅发布解密后的消息吗?但是,是的,发布他的密钥也会这样做。没有办法向某人透露秘密,但阻止他们向他人透露;这是每个DRM方案失败的核心。尽管h当有超过2把钥匙时,它会变得笨拙。另请参见: