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:gensec(xi,yi=gxi)
ciphertext:(c1,c2)=(gr,(g(x1+x2...xi)rgm))
Dec:gm=c2/∏i=1nc1xi
- 明文m的空间不能特别大,因为最后解密出gm要爆破m
- 有同态加法的特性gm1∗gm2=gm1+m2
安全模型分析
当n-2个人作恶时,剩下两张选票,仍然无法知道他们分别属于谁投的
n-1个人无法抵御,因为他们能够联合恢复最后一张选票
投票过程
pre-vote阶段
分为set up和commit两个阶段
set up阶段
- 生成选民的公私钥
私钥xi
公钥yi=gxi
- 发布零知识证明,证明你拥有该公钥yi的私钥xi

commit阶段
- 先生成一对用于承诺阶段的公私钥(ρi,βi=gρi),生成承诺Ci=gviYiρi,其中vi就是某个人的投票结果取值为0或1(yes or not),其中Yi=∏j=1,j=inyi也就是收集其他成员的公钥进行求积计算
- 发布零知识证明
参数e,用于检查你返回的e1和e2是否有效,是否能合成e
参数a1,a2,用于检查你生成的承诺Ci=gviYiρi中的vi是否为合法值(0或1)
参数b1,b2,证明你有公钥βi的私钥ρi

vote阶段
- 零知识证明
参数e,用于检查你返回的e1和e2是否有效,是否能合成e
参数a1,a2,用于检查你生成的承诺Ci=gviYiρi中的vi是否为合法值(0或1)
参数b1,b2,用于检查你的Vi=hixigvi是否为0或1的合法范围
参数c1,c2,证明你拥有该公钥yi的私钥xi
参数d1,d2,证明你有公钥βi的私钥ρi
注意,这里vi=0的时候,b2的hi的指数应该是rx2

tally阶段
计算∏i=1nVi=∏i=1nhixigvi=g∑i=1nvi,其中hi=∏j=1i−1yi/∏j=i+1nyi,特别的,当i=1时分子为1,当i=n时,分母为1
通过暴力破解即可获得本次选票的结果∑i=1nvi
recover阶段
假设此时第i位选民是最后一个投票的,其余的选民用j来表示
如果最后一位选民没有在投票阶段投票,则其余选民仍然能一起将其投票结果恢复出来
gvi=Ci/∏j=1,j=inyjρi
因为Ci=gviYiρi,而Yi=Yi=∏j=1,j=inyi
只需要穷举0或者1的情况就能得出vi的结果
在剩余选民的范围内进行计算,每一个选民计算并发布hi^xi,其中hi^=∏k=j+1,k=jnyj/∏k=1,k=jj−1yj,这里n的范围就是原来的n-1
这样每个人就可以计算g∑vj=∏hi^xjVj,其中Vj=gvj,暴力计算得出的值跟最后一个投票的选票结果相加就是最后的结果∑vj+vi