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

时间:2020-03-05 18:46:15  来源:igfitidea点击:

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

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

我不是说公钥/私钥。可能通过对称密钥加密,可能涉及诸如对密钥进行异或者以使用它们进行加密的操作。

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

解决方案

回答

一般而言,我们要做的是使用随机生成的密钥对数据进行加密,然后添加已使用每个已知密钥加密的该随机密钥的版本。因此,拥有有效密钥的任何人都可以发现用于加密数据的"真实"密钥。

回答

通常这样做的方法是生成一个对称密钥以加密数据。然后,使用每个收件人的密钥或者密码对对称密钥进行加密,以使他们可以自己解密。 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个随机点并成为份额。