使用两个密钥(可能是基于密码的)完成数据加密的基本原理是什么,但只需要两个密钥中的一个(任何一个)来解密数据?
例如,数据用用户的密码和他的公司密码加密,然后他或他的公司可以解密数据。他们都不知道另一个密码。仅存储一份加密数据的副本。
我不是指公钥/私钥。可能是通过对称密钥密码术,也许它涉及将密钥异或在一起以使用它们进行加密。
更新:我还想找到一个根本不涉及存储密钥的解决方案。
使用两个密钥(可能是基于密码的)完成数据加密的基本原理是什么,但只需要两个密钥中的一个(任何一个)来解密数据?
例如,数据用用户的密码和他的公司密码加密,然后他或他的公司可以解密数据。他们都不知道另一个密码。仅存储一份加密数据的副本。
我不是指公钥/私钥。可能是通过对称密钥密码术,也许它涉及将密钥异或在一起以使用它们进行加密。
更新:我还想找到一个根本不涉及存储密钥的解决方案。
通常这样做的方式是生成一个对称密钥来加密数据。然后,您使用每个收件人的密钥或密码加密对称密钥,以便他们可以自己解密。S/MIME(实际上是 S/MIME 所基于的加密消息语法)使用这种技术。
这样,您只需存储一份加密消息的副本,但要存储其密钥的多个副本。
一般来说,您所做的是使用随机生成的密钥加密数据,然后附加已使用每个已知密钥加密的该随机密钥的版本。因此,任何拥有有效密钥的人都可以发现用于加密数据的“真实”密钥。
如果我理解正确,您有一些数据愿意加密并分发加密密钥,该密钥分为 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
我想我想到了一个可行的解决方案:
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个随机点,成为股份。