论文解读A Blockchain-Based Self-Tallying Voting Protocol in DecentralizedloT

133 阅读2分钟

A Blockchain-Based Self-Tallying Voting Protocol in Decentralized IoT | IEEE Journals & Magazine | IEEE Xplore

文章的贡献

  • 实现了一个yes or not的投票系统,满足公平性、无争议性和最大程度的选票保密性
  • 修改了commit和recovery部分,以处理流产的问题(最后一位选民commit之后退出,而不发布选票,这样就能他自己计算最终结果,而其他人无法得知)

分布式elgamal算法

循环群G,阶为素数p,生成元为g

Setup:gen  sec  (xi,yi=gxi)Setup:gen\;sec\;(x_i,y_i=g^{x_i})
ciphertext:(c1,c2)=(gr,(g(x1+x2...xi)rgm))ciphertext:(c_1,c_2)=(g^r,(g^{(x_1+x_2...x_i)r}g^m))
Dec:gm=c2/i=1nc1xiDec:g^m=c_2/\prod_{i=1}^{n}c_{1}^{x_i}

  • 明文m的空间不能特别大,因为最后解密出gmg^m要爆破m
  • 有同态加法的特性gm1gm2=gm1+m2g^{m_1}*g^{m_2}=g^{m_1+m_2}

安全模型分析

当n-2个人作恶时,剩下两张选票,仍然无法知道他们分别属于谁投的 n-1个人无法抵御,因为他们能够联合恢复最后一张选票

投票过程

pre-vote阶段

分为set up和commit两个阶段

set up阶段
  1. 生成选民的公私钥
    私钥xix_i
    公钥yi=gxiy_i=g^{x_i}
  2. 发布零知识证明,证明你拥有该公钥yiy_i的私钥xix_i

image.png

commit阶段
  1. 先生成一对用于承诺阶段的公私钥(ρi,βi=gρi)(\rho_i,\beta_i=g^{\rho_i}),生成承诺Ci=gviYiρiC_i=g^{v_i}Y_{i}^{\rho_i},其中viv_i就是某个人的投票结果取值为0或1(yes or not),其中Yi=j=1,jinyiY_i=\prod^{n}_{j=1,j\ne i}y_i也就是收集其他成员的公钥进行求积计算
  2. 发布零知识证明
    参数e,用于检查你返回的e1e_1e2e_2是否有效,是否能合成e
    参数a1,a2a_1,a_2,用于检查你生成的承诺Ci=gviYiρiC_i=g^{v_i}Y_{i}^{\rho_i}中的viv_i是否为合法值(0或1)
    参数b1,b2b_1,b_2,证明你有公钥βi\beta_i的私钥ρi\rho_i

image.png

vote阶段

  1. 零知识证明 参数e,用于检查你返回的e1e_1e2e_2是否有效,是否能合成e
    参数a1,a2a_1,a_2,用于检查你生成的承诺Ci=gviYiρiC_i=g^{v_i}Y_{i}^{\rho_i}中的viv_i是否为合法值(0或1)
    参数b1,b2b_1,b_2,用于检查你的Vi=hixigviV_i=h_{i}^{x_i}g^{v_i}是否为0或1的合法范围
    参数c1,c2c_1,c_2,证明你拥有该公钥yiy_i的私钥xix_i
    参数d1,d2d_1,d_2,证明你有公钥βi\beta_i的私钥ρi\rho_i
    注意,这里vi=0的时候,b2的hi的指数应该是rx2 image.png

tally阶段

计算i=1nVi=i=1nhixigvi=gi=1nvi\prod_{i=1}^{n}V_i=\prod_{i=1}^{n}h_{i}^{x_i}g^{v_i}=g^{\sum_{i=1}^{n}v_i},其中hi=j=1i1yi/j=i+1nyih_i=\prod_{j=1}^{i-1}y_i/\prod_{j=i+1}^{n}y_i,特别的,当i=1时分子为1,当i=n时,分母为1
通过暴力破解即可获得本次选票的结果i=1nvi\sum_{i=1}^{n}v_i

recover阶段

假设此时第i位选民是最后一个投票的,其余的选民用j来表示
如果最后一位选民没有在投票阶段投票,则其余选民仍然能一起将其投票结果恢复出来
gvi=Ci/j=1,jinyjρig^{v_i}=C_i/\prod_{j=1,j\ne i}^{n}y_{j}^{\rho_i}
因为Ci=gviYiρiC_i=g^{v_i}Y_{i}^{\rho_i},而Yi=Yi=j=1,jinyiY_i=Y_i=\prod^{n}_{j=1,j\ne i}y_i
只需要穷举0或者1的情况就能得出viv_i的结果
在剩余选民的范围内进行计算,每一个选民计算并发布hi^xi\hat{h_i}^{x_i},其中hi^=k=j+1,kjnyj/k=1,kjj1yj\hat{h_i}=\prod^{n}_{k=j+1,k\ne j}y_j/\prod^{j-1}_{k=1,k\ne j}y_j,这里n的范围就是原来的n-1
这样每个人就可以计算gvj=hi^xjVjg^{\sum v_j}=\prod \hat{h_i}^{x_j}V_j,其中Vj=gvjV_j=g^{v_j},暴力计算得出的值跟最后一个投票的选票结果相加就是最后的结果vj+vi\sum v_j+v_i