9

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

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

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

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

4

5 回答 5

21

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

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

于 2008-09-02T05:04:02.670 回答
6

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

于 2008-09-02T05:01:35.843 回答
1

如果我理解正确,您有一些数据愿意加密并分发加密密钥,该密钥分为 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

于 2014-08-06T11:27:16.617 回答
0

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

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)

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

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

于 2008-09-02T05:16:02.067 回答
0

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

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

于 2008-09-15T20:05:14.780 回答