想起比多中心的匿名投票协议,有一种很简单的使用盲签名的投票协议,可以做到匿名投票。
1、具体流程
该协议的核心之处在于有一个验证机构,用于出具投票资格验证。投票人用资格证明去匿名投票:
- 验证机构有一个投票人列表。
- 每个投票人生成一个公钥私钥对,并将公钥$p$盲化后得到$p'$发送给验证机构。验证机构检查投票人的资格,然后对盲化的公钥$p'$进行签名。
- 投票人对收到的盲化公钥签名进行反盲化,便得到验证机构对公钥的签名。
- 投票人用第 2 步中的私钥加密自己的投票和上一步中得到的公钥签名,和公钥$p$一起发布。
- 计票人(任何人)统计所有所有的投票,并进行累加。
这里的核心之处在于,投票中用的是公钥$p$,但验证机构只能看到$p'$,也就是说它无法将投票人和投票关联起来。
2、盲签名算法
上述协议最核心之处是盲签名算法。RSA 本身便能实现盲签名算法。假设签名者公布的公钥为$(n, e)$,私钥为$(n, c)$。假设需要进行盲签名的文本为$x$,那么盲签名可分为三步:
- 盲化$x$:需签名的用户随机选取和$n$互质的$r$,计算$x' = xr^e$,并发送给签名者。
- 签名者对$x'$进行签名,得到签名$y'=(x')^c = x^cr^{ec}=x^cr$。
- 用户对签名进行反盲化:$y = y'/r=x^c$便是对原始文本$x$的签名。
3、缺陷
看上去这个比前面的双中心的匿名投票协议会更好,因为该中心绝对无法破坏匿名性。而在双中心协议中,两个中心合谋会破坏匿名性。
但该协议也有两个缺陷:
- 验证机构可以拒绝服务。由于投票者必须实名提交验证,验证机构可以拒绝某些人的投票(假设验证机构被共和党所控制,它可以拒绝民主党人的验证申请,比如假装没收到申请等等)。
- 验证机构可以伪造不存在的用户,甚至伪造投票者的投票。
在清华大学的一篇论文一种安全、实用的电子投票系统中,作者试图通过设置多个验证中心,投票者只需要经过其中若干个验证中心验证便算作有效投票。但这只是缓解,而不是完全解决上面的缺陷。
Q. E. D.