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

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

我的意思不是公钥/私钥。可能通过对称密钥加密,可能涉及将密钥异或在一起以使用它们进行加密之类的事情。

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

有帮助吗?

解决方案

通常完成此操作的方法是生成单个对称密钥来加密数据。然后,您使用每个收件人的密钥或密码对对称密钥进行加密,以便他们可以自行解密。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 演示应用程序:
谷歌播放: 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个点作为股票。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top