一、 秘密分享
秘密分享的方式有很多种,我们根据论文《Publicly Verifiable Secret Sharing》中的描述,进行讨论。
egin{equation}s_{A i}=left{egin{array}{l}
ext { randomly chosen in } mathbb{Z}_{p} ext { for } i=j_{1}, ldots, j_{k-1} \
s-sum_{ell=1}^{k-1} s_{A j_{ell}}(mod p) ext { for } i=j_{k}
end{array}
ight.end{equation}
对于秘密s,我们给产生k-1的随机数,然后用秘密减去这些随机数的和对p求余,产生一个k份的秘密。
只有k个用户同时合作,才能把秘密恢复。
同时,我们可以公开验证,分享秘密的人有没有将正确的si分享给每个用户。我们只需要将公开的加密得到的S进行累乘,则可以实现所有秘密的累加。而秘密分享者,需要公开对秘密进行加密的S。
另外一种秘密分享的方式可以让每个用户独立验证,si是否正确。下文中xi是每个人的公钥。dealer选择k-1个随机数,然后公开egin{equation}S=g^{s} ext { and } F_{j}=g^{f}end{equation}。
因此每个人的秘密被加密为si,之后我们可以用下面这种方式计算出Si。
egin{equation}s_{i}=s+sum_{j=1}^{k} f_{j} x_{i}^{j}(mod p)end{equation}
然后我们可以验证,Si是否等于gsi。
egin{equation}S_{i}=S cdot prod_{j=1}^{k-1} F_{j}^{left(x_{i}^{j} ight)}end{equation}