数字签名主要用于对数字消息进行签名,以防消息的伪造或篡改。盲签名用来在保证投票者匿名的情况下,生成签名。
RSA算法
- 投票者使用RSA算法生成公私钥对(),并将公钥公布。
- 选取两个不同的大素数p和q,计算它们的乘积n=pq。令,代表对于n,比n小但与n互为素数的正整数的个数(由欧拉函数)
- 随机选取一个整数e,,计算满足 的d。
- 以(e,n)为公钥,(d,n)为私钥。
- 投票者使用私钥d和hash函数h对选票m签名生成m`,并公布(m,m`,e,h)。
- 使用一个安全的hash函数h来生成消息摘要h(m)
- 加密信息m,
- 其他节点对其选票进行检验,检验通过,则接收。
- 解密,如果,则验证通过。
RSA盲签名
系统生成秘钥对(e,n)和(d,n),(e,n)为公钥,(d,n)为私钥,公布公钥(d,n),并选择一个安全hash函数h(sha-256)。
-
投票者选择盲化因子r(选择要求),盲化选票m(此时选票上应有候选人的编号和时间戳)
投票者把盲化选票m' 和投票者唯一身份标识发送给系统
-
系统确认投票者身份,对盲化选票m`签名,代表授权证明,再把选票发回给投票者(盲化因子r的存在使得该选票即使被其他人截获,也无法使用)
-
投票者去盲,获得已签名授权的选票
投票将选票(m,s')广播到网络上
其他人只要验证 是否为真即可
ECC算法(elliptic curve cryptography)
-
系统初始化
首先选择一个椭圆曲线,接着构造椭圆群,选择上一点G,G的阶是满足安全要求的素数p,pG=0。选择1到n-1之间的随机数作为用户的私钥,计算作为用户的公钥
-
签名生成
用户对明文m进行签名,选择1到n-1之间的随机数k,,计算签名值(r,s)。如果r=0或s=0,则另选随机数k,重新执行上面的过程。
-
签名验证
接收方在收到消息m和签名值(r,s)后,先计算h(m),。然后验证等式 。如果为真,接收签名,否则,签名无效
基于ECC的盲签名
为了保护投票者的隐私,使用盲签名来使得其他任何人无法通过选票上的签名追踪到投票者,且该选票可被证明是合法的。
-
初始化
构造椭圆群
系统选择上一点G,G的阶是满足安全要求的素数p,pG=O(O为无穷远点)。选择1到n-1之间的随机数作为系统的私钥,计算作为系统的公钥
系统选择1到n-1之间的随机数k,计算,公开和公钥P和一个个安全hash函数h(sha-256)
-
投票者随机在上选择点$G`(x_i,y_i),并计算
投票者发送盲化消息m'和其唯一身份标识给系统
-
系统确认投票者身份,对盲化选票m'进行签名,代表授权证明,再把选票发回给投票者(盲化因子的存在使得该选票即使被其他人截获,也无法使用)
-
投票者去盲化,获得签名授权(R,S)
投票者将选票(m,R,S,r)广播到网络上
其他人只要验证 是否为真即可