深入学习区块链的隐私保护(四)秘密共享

 

秘密共享是指将秘密以适当的方式拆分,拆分后的每一个份额由不同的参与者管理,单个参与者无法恢复秘密信息,只有若干个参与者一同协作才能恢复秘密消息。秘密共享的概念最早由著名密码学家Shamir【1】和Blakley【2】于1979年分别基于拉格朗日插值法、多维空间点的性质给出了各自的方案。他们的方案由两个算法组成,秘密份额的分配算法和秘密的恢复算法。秘密份额的分配算法是将秘密分为若干子份,并将每个子份发送给不同参与者。秘密的恢复算法是指当参与者收集到足够多的子份后,可以调用该算法恢复出原始秘密。

Shamir和Blakley的方案都是基于参与者诚实的假设下进行设计的,这种假设在现实生活中无法得到满足。Chor等人于1985年提出了可验证秘密分享的概念【3】,用以解决分发者欺骗问题。可验证秘密分享在秘密分享的基础上增加了一个验证算法,即参与秘密共享的成员可以通过公开变量验证自己所拥有的子秘密的正确性。可验证秘密分享通过其验证算法是否需要参与者之间的交互分为两类:交互式的和非交互式的。交互式的可验证秘密共享方案包括【4-6】等,非交互式的可验证秘密共享方案包括【7-9】等。在可验证秘密共享中只有参与者自己可以验证自己收到的秘密份额是否正确,这使得可验证秘密共享的应用在一定程度上受到限制。因此公开可验证的秘密共享方案被提出\cite{ref14},即任何人都可以验证份额的正确性。随后,Schoenmakers【11】提出了一个构造简单、安全性和效率较高的公开可验证的秘密共享方案,该方案的安全性依赖于离散对数问题和Diffie-Hellman问题。

首先介绍经典的秘密共享方案-Shamir门限秘密共享,假设需要分享的秘密为s,参与者的个数为n,当参与者收集到至少k个子份额后可恢复秘密,过程如下:

  • 秘密份额的分配算法:秘密的拥有者随机选择一个经过点(0,s)k-1次多项式f(x),其中f(x)=s+a_{1}x+\cdots+a_{k}x^{k-1}。然后,计算每个参与者i\in\{1,\dots, n\}的秘密份额(i,s_{i}),其中  s_{i}=f(i)=s+a_{1}i+\cdots+a_{k}i^{k-1}。最后,将计算的秘密份额发送给各个参与者。
  • 秘密的恢复算法:当参与者收集到k个秘密份额(x_{1},y_{1}),\dots,(x_{k},y_{k})后,使用插值公式计算f(x)=\sum_{i=1}^{k}y_{i}\prod_{j=1,j\neq i}^{k}\frac{x-x_{j}}{x_{i}-x_{j}},计算秘密s=f(0)=\sum_{i=1}^{k}y_{i}\prod_{j=1,j\neq i}^{k}\frac{x_{j}}{x_{j}-x_{i}}

接下来介绍Schoenmakers提出的公开可验证的秘密共享方案,该秘密分享方案使用了一个非交互式证明方案DLEQ(g_{1},h_{1},g_{2},h_{2}),用来证明如下论据:证明者在不公开a的前提下,证明h_{1}=g_{1}^{a}h_{2}=g_{2}^{a}是使用同一个值a生成的,即\log_{g_{1}}h_{1}=\log_{g_{2}}h_{2}

  • 生成证据算法:证明者随机选取w\in Z_{q},计算a_{1}=g_{1}^{w}a_{2}=g_{2}^{w}。然后计算c=H(h_{1},h_{2},a_{1},a_{2})r=w-ac \; mod\; q,证据\pi =(g_{1},h_{1},g_{2},h_{2},c,r)
  • 验证证据算法:验证者在收到\pi =(g_{1},h_{1},g_{2},h_{2},c,r)后,计算a_{1}=g_{1}^{r}h_{1}^{c}a_{2}=g_{2}^{r}h_{2}^{c},计算c^{'}=H(h_{1},h_{2},a_{1},a_{2}),如果c^{'}==c,则验证通过,即相信证明者的论据。

假设G_{q}表示为一个阶为q的群,其中q为大素数。选取gG为相互独立的生成元,即没人知道如何由g生成G。参与者的个数为n,参与者i的私钥为x_{i}\in Z_{q},对应的公钥为y_{i}=G^{x_{i}}。秘密的拥有者选取s\in Z_{q},计算秘密S=G^{s}。Schoenmakers公开可验证的秘密共享方案如下:

  • 秘密份额的分配算法:秘密的拥有者随机选择一个经过点(0,s)k-1次多项式f(x),其中f(x)=b_{0}+b_{1}x+\cdots+b_{k}x^{k-1}b_{0}=s。然后,计算每个参与者i\in\{1,\dots, n\}的秘密份额(i,y_{i}^{s_{i}})X_{i}=g^{s_{i}},其中 s_{i}=f(i)=b_{0}+b_{1}i+\cdots+b_{k}i^{k-1}。令Y_{i}=y_{i}^{s_{i}},为每一对X_{i}Y_{i},调用DLEQ算法,生成公开可验证的证据\pi_{i}=(g,nil,G,Y_{i},c_{i},r_{i})。并且发布公开的承诺{\{C_{j}|C_{j}=g^{b_{j}},j=0,\dots,k\}}
  • 秘密份额的验证算法:任何人都可以通过\pi_{i}对碎片(i,y_{i}^{s_{i}})进行合法性验证,验证者计算X_{i}=\prod_{j=0}^{k}C_{j}^{i^{j}},其中C_{j}^{i^{j}}=g^{b_{j}i^{j}}。将X_{i}放入\pi_{i},此时\pi_{i}=(g,X_{i},G,Y_{i},c_{i},r_{i}),对\pi_{i}进行DLEQ验证,若通过,则该碎片合法。
  • 秘密份额的解密算法:参与者i使用私钥x_{i}对秘密份额(i,Y_{i})进行解密,计算S_{i}=G^{f(i)}=Y_{i}^{\frac{1}{x_{i}}},并且为了证明S_{i}确实是由Y_{i}生成,即需要证明参与者知道私钥x_{i},并且y_{i}=G^{x_{i}}Y_{i}=S_{i}^{x_{i}}使用了该私钥。因此调用DLEQ(G,y_{i},S_{i},Y_{i}),生成证据\pi_{i}^{S}
  • 秘密的恢复算法:当某个参与者收集到足够多的正确秘密份额S_{i}(正确秘密份额的判断是对证据\pi_{i}^{S}进行验证),该参与者通过如下计算恢复出秘密值G^{s}=\prod_{i=1}^{k}S_{i}^{\lambda _{i}}=\prod_{i=1}^{k}(G^{f(i)})^{\lambda _{i}}=G^{\sum_{i=1}^{k}f(i)\lambda _{i}}=G^{f(0)},其中\lambda _{i}=\prod_{j=1,j\neq i}^{k}\frac{j}{j-i}

 

参考文献:

【1】Shamir A. How to share a secret[J]. Communications of the ACM, 1979, 22(11): 612-613.

【2】Blakley G R. Safeguarding cryptographic keys[C]//1979 International Workshop on Managing Requirements Knowledge (MARK). IEEE, 1979: 313-318.

【3】Chor B, Goldwasser S, Micali S, et al. Verifiable secret sharing and achieving simultaneity in the presence of faults[C]//26th Annual Symposium on Foundations of Computer Science (sfcs 1985). IEEE, 1985: 383-395.

【4】Ben-Or M, Goldwasser S, Wigderson A. Completeness theorems for non-cryptographic fault-tolerant distributed computation[M]//Providing Sound Foundations for Cryptography: On the Work of Shafi Goldwasser and Silvio Micali. 2019: 351-371.

【5】Chaum D, Crépeau C, Damgard I. Multiparty unconditionally secure protocols[C]//Proceedings of the twentieth annual ACM symposium on Theory of computing. 1988: 11-19.

【6】Rabin T, Ben-Or M. Verifiable secret sharing and multiparty protocols with honest majority[C]//Proceedings of the twenty-first annual ACM symposium on Theory of computing. 1989: 73-85.

【7】Feldman P. A practical scheme for non-interactive verifiable secret sharing[C]//28th Annual Symposium on Foundations of Computer Science (sfcs 1987). IEEE, 1987: 427-438.

【8】Pedersen T P. Non-interactive and information-theoretic secure verifiable secret sharing[C]//Annual international cryptology conference. Springer, Berlin, Heidelberg, 1991: 129-140.

【9】Gennaro R, Rabin M O, Rabin T. Simplified VSS and fast-track multiparty computations with applications to threshold cryptography[C]//Proceedings of the seventeenth annual ACM symposium on Principles of distributed computing. 1998: 101-111.

【10】Stadler M. Publicly verifiable secret sharing[C]//International Conference on the Theory and Applications of Cryptographic Techniques. Springer, Berlin, Heidelberg, 1996: 190-199.

【11】Schoenmakers B. A simple publicly verifiable secret sharing scheme and its application to electronic voting[C]//Annual International Cryptology Conference. Springer, Berlin, Heidelberg, 1999: 148-164.

你可能感兴趣的:(区块链的隐私保护)