秘密共享的原理与实践
引言
如今,隐私计算技术不仅在政府政策的推动下发展迅猛,也在企业级应用方面迎来了前所未有的机遇。一些领先的科技公司,如微软、IBM、谷歌等,纷纷加入隐私计算的领域,并且将其应用到各自的产品和服务中。例如,微软公司推出了基于隐私计算技术的Azure Confidential Computing,IBM公司则推出了IBM Z和IBM LinuxONE等可信执行环境,而谷歌则通过联邦学习技术实现了不同设备之间的数据共享和训练。
此外,隐私计算技术还被广泛应用于金融、医疗、物联网等领域。在金融领域,隐私计算技术能够帮助保护用户的个人隐私和交易数据,提高数据共享的安全性和可信度。在医疗领域,隐私计算技术能够解决医疗数据隐私保护的难题,同时还能够促进不同医疗机构之间的数据共享和合作。在物联网领域,隐私计算技术能够帮助保护用户设备的隐私和安全,同时还能够实现设备之间的安全数据共享和联合决策。
综上所述,隐私计算技术在政策、企业和应用等方面均迎来了快速发展的机遇,其应用前景广阔,未来将会在更多的领域得到广泛的应用和推广。
多方安全计算(Security Multi-party Computation, MPC)是隐私计算在密码学领域的最主流技术,其核心思想是设计特殊的加密算法和协议,基于密码学原理实现在无可信第三方的情况下,在多个参与方输入的加密数据之上直接进行计算。
秘密共享(Secret Sharing,SS)是1979年由Shamir和Blakey提出的,并在此之后40多年秘密共享被广泛认识和深入研究。?秘密分享是隐私加密计算中常用的密码学工具。本章将详细介绍与秘密共享相关的问题模型及定义、剖析秘密共享的主流方案及技术原理,并结合代码给出示例。
问题模型
秘密共享经典的(t, n)阈值方案如图所示,秘密分享的问题可描述为将一个秘密S拆分成n份S1,S2...,St, ...Sn, 分发给不同的参与方P1, P2,...Pn管理。只有至少t个参与方合作才能恢复秘密。问题限定:? 1. 单方无法自己恢复秘密;2. 不需要所有参与方合作就能恢复(1 < t < n);3. t个参与方为随机挑选,且随机选出t个参与方必须能够恢复秘密
概念
秘密共享(Secret Sharing)是一种密码学技术,它通过将一个秘密数据分割成多个部分,分配给不同的参与者,以确保数据的安全性。只有当多个部分同时合并时,才能恢复原始的秘密数据。因此,在秘密共享方案中,任何单个参与者无法看到完整的秘密数据。
原理与实现
秘密共享最早由著名的密码学家Shamir和Blakley在1979年提出,两个人给出了各自的实现方案。之后又陆续出现了很多秘密共享的方案。其中较为经典的方案包括:Shamir秘密共享方案、Brickell秘密共享方案、Blakley秘密共享方案及基于"中国剩余定理"的秘密共享方案
Shamir秘密共享方案
Shamir's Secret Sharing 是一种秘密共享方案,用于将一个秘密信息(例如一个密码)分割成多个部分,分配给多个参与方,只有当一定数量的参与方合作才能够重构出原始秘密信息。这种方法可以增强数据安全性,保护个人隐私。
具体来说,假设 Alice 有一个秘密信息 S,她希望将其分割成 n 份,分配给 n 个参与方,但要求只有当 k(k ≤ n)个参与方合作时才能够重构出原始秘密信息。Shamir's Secret Sharing 就可以实现这样的要求。
具体过程如下:
选择一个质数 p,使得 p > S,然后选择一个 k-1 次的随机多项式 f(x),满足 f(0) = S。这里的 k-1 次多项式表示的是 k-1 个随机系数确定的多项式,其中 f(0) = S 表示该多项式在 x = 0 时的取值等于 S。
选择 n 个不同的参与方,为每个参与方分配一个独立的 x 坐标值(称之为 xi),其中 0 ≤ xi < p。这些参与方可以是 Alice 选择的特定人员,也可以是随机选择的。
对于每个参与方 i,计算出对应的 y 坐标值(称之为 yi),其中 yi = f(xi) mod p。这里的 mod p 表示对 p 取模,保证 yi 的范围在 0 到 p-1 之间。
将所有的 (xi, yi) 对分配给对应的参与方,每个参与方只能获得自己对应的 (xi, yi) 对。这样,所有的参与方都知道了自己的 (xi, yi) 值,但并不知道其他参与方的值。
当需要恢复原始秘密信息时,只需要任意 k 个参与方合作,使用拉格朗日插值法计算出 f(0) = S 即可。
需要注意的是,Shamir's Secret Sharing 通过选取随机多项式和随机 x 坐标值,保证了秘密信息的安全性。只有同时掌握 k 个参与方的信息才能够恢复出原始秘密信息,这大大增加了秘密信息的保护程度。
Shamir's Secret Sharing 的安全性基于离散对数问题,即没有足够的信息可以用来推导出多项式的系数和秘密数据。只有当至少 k 个参与者合作时,才能重构出原始的秘密数据。因此,它可以用于各种需要秘密共享的场景,例如安全多方计算、密钥管理、数字签名等。
如下是基于Syft框架的代码实现:
1. 首先需要安装 PySyft:
pip install syft
2. 代码:
import syft as sy
from syft.frameworks.torch.he.fv.util.operations import random_uint
# 创建本地虚拟工作节点
hook = sy.TorchHook()local_worker = hook.local_worker
# 设置参数
n = 5
# 总共的秘密数据份额
k = 3
# 恢复秘密数据需要的最少份额
p = 2**127-1
?# 模数# 生成秘密数据
secret = random_uint(64).item()
print("秘密数据:", secret)
# 生成多项式并求出数据点
coeffs = [secret] + [random_uint(64).item() for i in range(k-1)]points = [(i+1, sum([coeffs[j]*i**j for j in range(k)]) % p) for i in range(n)]
print("数据点:", points)
# 将数据点分配给不同的工作节点
workers = [sy.VirtualWorker(hook, id=f"worker_{i}") for i in range(n)]
shares = [sy.crypto.encode_shares(point, workers) for point in points]
# 任意 k 个份额就可以恢复出原始数据
selected_shares = shares[:k]
recovered_secret = sy.crypto.decode_secret(selected_shares, workers[:k])
print("恢复的秘密数据:", recovered_secret)
这个代码演示了如何使用 PySyft 框架实现 Shamir's Secret Sharing。在这个示例中,我们使用了 HE 库中的 random_uint 函数生成随机数,并使用 encode_shares 和 decode_secret 函数分别对秘密数据进行分配和恢复。请注意,我们将秘密数据和多项式系数都设置为 64 位的随机数,但在实际应用中,我们可能需要更大的秘密数据和更高次数的多项式来确保安全性。
Brickell秘密共享方案
Brickell秘密共享方案是一种基于多项式插值的秘密共享方案,类似于Shamir的秘密共享方案,但采用了不同的多项式插值方法,其主要优点是可以支持更高的参与方数目,并具有更高的效率和更强的安全性。
具体来说,Brickell秘密共享方案的实现步骤如下:
选择一个大质数p,并选择一个正整数n,表示参与方的数量。
选择一个k次多项式f(x),满足f(0) = s,其中s为要秘密共享的值。
选择n个互不相同的随机数a1, a2, ..., an,并计算f(ai)对p取模后的值yi。
将秘密值s和所有的yi发送给参与方。
任意k个参与方可以使用拉格朗日插值法来重构多项式f(x),并计算出f(0)的值,即秘密值s。
Brickell秘密共享方案与Shamir秘密共享方案相比,主要的不同在于选择多项式时的插值方法不同。Shamir方案采用拉格朗日插值法,而Brickell方案则采用了差分插值法。差分插值法的优势在于支持更高次数的多项式,并且具有更高的效率和更强的安全性。
Brickell秘密共享方案已经在很多应用场景中得到了应用,例如分布式数据库和云计算等领域。同时,Brickell方案也常常与其他隐私计算技术结合使用,如同态加密、安全多方计算等,以进一步提高数据隐私和安全性。
如下是基于Python的Brickell秘密共享方案的代码实现:
import syft as sy
from syft.frameworks.torch.crypto
import utils as cryptoutils
from syft.frameworks.torch.crypto
import brickell as brickell
?# 创建两个本地工作节点
bob = sy.VirtualWorker(hook, id="bob")
alice = sy.VirtualWorker(hook, id="alice")
?# 定义秘密值
secret = cryptoutils.random_mpz(1024)
# 生成共享密钥
key = brickell.generate_shares(secret, n=2, k=2, field_order=brickell.PRIME)
# 将共享密钥发送给两个本地工作节点
bob_key = key[0].send(bob)
alice_key = key[1].send(alice)
?# 从本地工作节点接收共享密钥
bob_key = bob_key.get()
alice_key = alice_key.get()
# 将共享密钥合并
merged_key = brickell.merge_shares([bob_key, alice_key])
# 使用共享密钥进行加密和解密
encrypted = cryptoutils.encrypt(secret, merged_key)
decrypted = cryptoutils.decrypt(encrypted, merged_key)
# 打印加密和解密结果
print("Secret: ", secret)
print("Encrypted: ", encrypted)
print("Decrypted: ", decrypted)
Blakley秘密共享方案
Blakley秘密共享方案是一种比较早期的秘密共享方案,它最初是由Blakley在1979年提出的。与Shamir's Secret Sharing方案类似,Blakley秘密共享方案也是基于多项式插值原理实现的。
假设有一份秘密S需要共享给n个人,Blakley秘密共享方案的实现步骤如下:
随机选择n个线性无关的向量作为公共密钥。这n个向量可以组成一个矩阵P,即 P=[p1, p2, ..., pn],其中每个向量pi的维度均为m。
将秘密S表示为向量形式,并与矩阵P相乘,即:
V = S × P
其中V为一个长度为m的向量。
将V拆分成n个部分,并分别分配给n个人,每个人获得一个长度为m的向量vi。
要恢复秘密S,需要至少有n个人合作,每个人将自己拥有的向量vi与公共密钥矩阵P进行线性组合,得到一个长度为m的向量W,即:
W = a1 × p1 + a2 × p2 + ... + an × pn
其中a1, a2, ..., an为任意实数。因为n个向量p1, p2, ..., pn线性无关,所以可以通过求解线性方程组来得到向量W。然后将W与公共密钥矩阵P的逆矩阵相乘,即可得到原始的秘密向量S。
与Shamir's Secret Sharing方案相比,Blakley秘密共享方案的优点在于实现较为简单,且不需要进行多项式插值运算。但是,它的缺点也比较明显,即需要在选择公共密钥矩阵P时保证n个向量的线性无关性,这在实践中可能比较困难。此外,Blakley秘密共享方案也不支持任意的门限t,只能保证需要n个人合作才能恢复秘密。
以下是使用SecretSharing库实现Blakley方案的示例代码:
from secretsharing import BlakleySecretSharing
# 分享一个长度为10的秘密,需要至少3个分享才能恢复秘密
sss = BlakleySecretSharing(minimum=3, shares=10)
# 生成秘密并分发给10个参与者
secret = sss.generate_secret()
shares = sss.split_secret(secret)
# 选择任意3个参与者,使用他们的分享恢复秘密
recovered_secret = sss.recover_secret(shares[:3])
assert secret == recovered_secret
在这个例子中,我们使用BlakleySecretSharing类创建了一个秘密共享实例,设置了至少需要3个分享才能恢复秘密,并且生成了10个分享。然后我们随机生成了一个秘密并将其分发给10个参与者,最后使用其中的3个分享成功恢复了秘密。
优缺点
相对于其他隐私计算技术,秘密共享的优点是:
? ? ? ? 1. 安全性较高:秘密共享方案能够保证秘密数据的安全,只有多个参与方一起才能够获取原始秘密数据,保证了隐私的安全性。
? ? ? ? 2. 灵活性较高:秘密共享方案可以适用于多种计算场景,不需要像差分隐私技术那样需要针对不同的查询场景进行设计和调整。
秘密共享的缺点是:
? ? ? ? 1. 计算代价较高:秘密共享需要在多个参与方之间进行数据通信和计算,因此需要消耗更多的计算资源和带宽资源。
? ? ? ? 2. 实现复杂性较高:秘密共享方案需要对多项式运算、加密算法等进行深入的理解和掌握,实现难度较高。
????????因此,在实际应用中,需要权衡秘密共享方案的优缺点,并根据实际需求选择最合适的隐私计算技术。
Shamir's Secret Sharing, Brickell's Secret Sharing, 和 Blakley's Secret Sharing都是秘密共享方案,用于将一个秘密分割成多份,然后分配给多个参与者,使得只有在满足一定条件下,参与者才能重建出原来的秘密。这三个方案各有优缺点,下面做一个简单的对比:
Shamir's Secret Sharing:
优点:
? ? 1. 在加密和解密过程中,计算开销小,效率高。
? ? 2. 可以适用于不同的分布式系统场景。
缺点:
? ? 1. 需要事先知道参与者的个数和重建秘密所需的最小阈值。
? ? 2. 不支持动态增减参与者。
Brickell's Secret Sharing:
优点:
? ? 1. 在数据安全方面具有较好的保护性能。
? ? 2. 可以在不泄露重建秘密的情况下,检查参与者的行为是否一致。
? ? 3. 支持动态增减参与者,即使不知道最终参与者的个数。
缺点:
? ? 1. 在加密和解密过程中,计算开销相对较大,效率较低。
Blakley方案的优点和缺点如下:
优点:
????1. Blakley方案只需要一个密钥,不需要进行多次计算,因此在密钥管理方面比较简单。
? ? 2. Blakley方案在计算上相对简单,只需要进行一次矩阵乘法运算即可。
? ? 3. Blakley方案的安全性较高,由于它使用了线性代数的方法,因此在一定程度上可以抵御已知明文攻击。
缺点:
? ? 1. Blakley方案的存储需求较高,需要存储一个矩阵和一个向量,这会占用较多的存储空间。
? ? 2. Blakley方案的加密效率较低,需要进行一次矩阵乘法运算,因此计算效率较低。
? ? 3. Blakley方案在参与方的数量较多时,需要进行多次矩阵乘法运算,因此运算时间会变得更长,效率更低。
综上所述,Blakley方案在一些特定场景下可能会更适合使用,例如只有少数几个参与方的情况下,但在大多数情况下,Shamir's和Brickell方案更为流行和实用。
应用场景
秘密共享(secret sharing)是一个非常有用的密码学技术,它已经被广泛应用于许多领域。以下是一些成功的秘密共享应用案例:
? ? 1. 多方安全计算(multi-party secure computation):秘密共享允许多个参与者将他们的私人数据共享,并以一种安全的方式进行计算,从而保护他们的隐私。例如,在医疗保健领域,医院可以使用秘密共享计算技术来分析病人的数据,同时保护他们的隐私。
? ? 2. 数字签名(digital signature):秘密共享可以用于数字签名,以确保签名是由多个参与者共同生成的。例如,在法律文件或金融交易中,多个签名者可以使用秘密共享技术来生成数字签名,从而增加签名的安全性。
? ? 3. 加密密钥管理(encryption key management):秘密共享可以用于管理加密密钥,以确保密钥只能被授权的人访问。例如,在网络安全中,企业可以使用秘密共享来管理其加密密钥,以确保敏感数据的安全性。
? ? 4. 密码恢复(password recovery):秘密共享可以用于密码恢复,允许用户在忘记密码的情况下恢复其账户。例如,在社交媒体或电子邮件账户中,用户可以使用秘密共享技术来生成密码恢复密钥,以便在需要时恢复其账户。
总之,秘密共享技术在许多领域都有成功的应用,它提供了一种非常有用的工具,可以帮助保护隐私和确保安全。
总结
隐私计算秘密共享方案是一种保护隐私的技术,能让多个人在不暴露私密数据的情况下完成特定计算任务。参与者把私密数据分成多份,加密后分发给其他参与者,只有拥有所有分片的参与者才能解密数据并进行计算,保护每个参与者的隐私。这种方案可应用于各种需要多方参与计算的场景,比如金融风险评估和医疗数据分析。
参考资料
-?知乎 - 秃顶的码农 - 隐私计算加密技术-秘密分享
-《隐私计算白皮书2022》?
- 《隐私计算》 陈凯,杨强