使用两个密钥(可能是基于密码的)完成数据加密的基本原理是什么,但只需要两个密钥中的一个(任一个)来解密数据?
例如,数据使用用户密码和公司密码加密,然后他或他的公司可以解密数据。他们都不知道其他密码。只存储一份加密数据副本。
我不是指公钥/私钥。可能通过对称密钥密码术,可能涉及将密钥异或一起用于加密。
更新:我还希望找到一个不涉及存储密钥的解决方案。
答案 0 :(得分:19)
通常这样做的方法是生成单个对称密钥来加密数据。然后,您使用每个收件人的密钥或密码加密对称密钥,以便他们可以自己解密。 S / MIME(实际上是S / MIME所基于的加密消息语法)使用这种技术。
这样,您只需存储加密邮件的一个副本,但需要存储其密钥的多个副本。
答案 1 :(得分:6)
一般来说,您所做的是使用随机生成的密钥加密数据,然后附加已使用每个已知密钥加密的随机密钥的版本。因此,任何拥有有效密钥的人都可以发现用于加密数据的“真实”密钥。
答案 2 :(得分:1)
如果我理解正确,您有一些数据表明您愿意加密并将加密密钥分发为n个“关键部分”。(在您的情况下为2件)
为此您可以使用基于XOR的拆分,以下是它的工作原理:
您提供所需的件数 - n和密钥 - K.要生成n个密钥,您需要创建(n - 1)个随机数:R1,R2,R3,.... 。 。 ,Rn-1。为此,您可以使用SecureRandom数字生成器,这将防止我们重复。然后您在这些Rn-1件上操作XOR功能和您的密钥 - K:
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
答案 3 :(得分: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)
然后,任何一个人都可以解密另一个人的哈希值,然后将它们组合起来解密其余的数据。
也许有比这更好的解决方案呢?
答案 4 :(得分:0)
在更一般的情况下,秘密(在此应用程序中,数据的解密密钥)可以分成共享,这样需要一些阈值数量的这些共享来恢复密钥。这称为秘密共享或n股和阈值t,a(t,n) - 阈值方案。
这可以做的一种方法是创建一个t-1阶多项式,将秘密设置为第一个系数,然后随机选择其余系数。然后,选择该曲线上的n个随机点并成为共享。