基于区块链的安全投票系统设计与实现*

2018-09-03 09:53颜春辉
通信技术 2018年8期
关键词:以太计票选票

颜春辉,游 林

(杭州电子科技大学 通信工程学院,浙江 杭州 310018)

0 引 言

随着互联网、通信技术以及现代密码学技术的发展,电子投票成为一种新的投票方式,逐渐得到了社会的关注。自从Chaum[1]在1981年提出第一个电子投票协议以来,许多密码学研究者提出了不同密码体制的电子投票方案,目的是在互联网环境下实现安全、方便、高效的公平投票机制。这些成熟的解决方案也被应用到了政府选举、企业董事会投票以及重要决策投票中。

目前,电子投票方案主要有三类:基于盲签名、环签名的电子投票方案[2-3]、基于全同态加密的电子投票方案[4-5]和基于混合网络的电子投票方案[6-7]。这三类投票方案都存在各自的不足。基于盲签名、环签名的电子投票方案一般需要假设匿名信道和可信的签名机构;基于混合网络的电子投票方案从理论上可以实现解密计票的公开可验证性,但算法过于复杂,效率较低;基于同态加密的电子投票方案虽然可以实现密文计算保护选票的隐私性,但当前全同态加密的计算复杂度太高,并不能有效实用。

近年来,随着比特币等数字货币的逐渐流行,其底层账本技术——区块链技术也受到许多研究学者的关注。区块链的本质是一个公开透明的数据库账本,记录所有的交易记录。它的特点是没有第三方中介机构的情况下,可以提供去中心化、不可篡改、公开透明的安全特性。目前,已提出不少结合区块链技术的电子投票方案,如2015年Zhao和Chan等人[8]提出了一种结合比特币的电子投票协议,该协议对选民的投票行为引入了奖罚制度。尽管该协议有一些限制,但这是第一个尝试将电子投票与区块链相结合的方法。2016年,Lee、James、Ejeta和Kim等人[9]提出了另一种电子投票协议。该协议提出在区块链电子投票协议中利用TTP(可信第三方)来保护投票者的选票。2017年,Cruz等人[10]提出了一种利用盲签名技术结合区块链的电子投票方案。该方案是将盲化的选票内容写入比特币交易中附加了80 Byte信息中。另外,该方案还引入第三方计票机构来统计选票结果。

上述的方案都存在TTP来执行投票过程中计票与监督的职责,要求投票参与者都信任这个TTP。但是,无法排除第三方计票机构与管理者发生共谋攻击,导致投票过程中投票者的选票和投票结果发生篡改,还有计票机构提前泄露投票结果控制整个投票结果发生改变。另外,在比特币交易中附加信息空间的限制,也使该方案具有一定的缺陷性。

McCorry等人[11]使用区块链实现了一种分布式且具有自我计票功能的互联网电子投票方案,并最大化地保护选民的隐私。通过以太坊智能合约编写投票协议,有效取代了第三方计票机构,在投票过程中通过两轮零知识证明(ZKP)的方式保护投票者的选票隐私信息。但是,该投票方案只允许投票者选择两个候选者(yes/no),无法满足一次投票过程中出现多候选者的情况。

除了这些基于区块链电子投票协议外,目前也有不少在区块链上的电子投票应用被推广使用,如区块链投票机(Blockchain Voting Machine)[12]和Follow My Vote[13]。这些应用基本都是使用区块链作为一个投票箱,因此需要依赖第三方组织来保护投票者的隐私。

本文针对目前投票系统中的一些缺陷,提出了一种结合区块链的多候选者投票方案,通过智能合约实现本方案使其具有自我计票功能。其次,通过Node.js的Electron前端框架设计了本方案的投票系统web界面,使用web3.js提供JavaScript API来调用部署在智能合约中投票方案的方法实现与合约交互。最后,从本方案的安全性分析和实验结果分析中说明本方案结合区块链智能合约具有可行性,具有多候选者投票、保护投票者的隐私、具备自我计票的功能等特点。

1 预备知识

1.1 区块链

区块链是随着比特币等[14]数字加密货币而兴起的一种全新技术,本质是一个点对点网络(peerto-peer)的分布式账本数据库,通过建立一个共同维护且不可篡改的数据库来记录过去的所有交易几轮和历史数据。所有的数据都是分布式存储且公开透明的。这种技术下,任何互不相识的网络用户都可以通过合约、点对点记账、数字加密等方式达成信用共识,而不需要任何中央信任机构。

区块链分为公共链(Public Blockchain)、联盟链(Consortium Blockchain)和私有链(Private Blockchain)。而随着区块链技术的演进,依据不同架构,区块链可分为三个阶段:

(1)区块链1.0架构:比特币区块链;

(2)区块链2.0架构:以太坊区块链;

(3)区块链3.0架构:超越货币、金融范围的区块链应用。

区块链1.0的典型应用是比特币应用,也是现在最受欢迎的数字货币,设计目的是允许两个区块链地址账户进行点对点的交易,而不通过第三方可信机构。2013年,比特币的协议中引进了一项功能,即创建一种名为OP_RETURN的交易[15],允许用户在一笔交易中嵌入40 Byte的数据(目前是80 Byte),因此可以向比特币的区块链中写入任意信息。不少研究人员利用此特点相继提出了不少结合区块链的应用[16-17]。这些方案有很多弊端,一方面在一笔交易中写入的信息量有限,另一方面随着比特币的交易数量增大,区块链的数据也会变得越来越庞大,交易确认时间也会变得越来越慢。

1.2 以太坊与智能合约

比特币的区块链架构主要围绕支持虚拟货币的实现,虽然具有一定的灵活性,但用来支持虚拟货币意外的应用存在局限性。区块链2.0架构的以太坊则提供了一套新的协议,核心是采用图灵完备的计算环境——以太坊虚拟机(EVM),可以实行任意复杂算法的编程,把区块链作为一个可编程的去中心化应用平台支撑智能合约应用。另外,以太坊区块链上写入的数据没有限制且交易确认相对较快。

以太坊有两种类型的账户:

(1)外部所有账户(EOA),一般意义上的用户账户,由用户的私钥控制;

(2)合约(Contract)账户,一种特殊的可编程账户。合约是代码(功能)和数据(状态)的集合,受代码控制,并由外部账户激活。

智能合约(Smart Contract)是一个由计算机处理的、可执行合约条款的交易协议[18]。以太坊的智能合约是一段可被以太坊虚拟机执行的代码。以以太坊特有二进制形式存储在区块链上,并由以太坊虚拟机解释,被称为以太坊虚拟机码(Bytecode)。智能合约像一个可以被信任的人,可以临时保管资产,总是按照事先的规则执行操作。它对接收的信息进行回应,可以接收和存储价值,也可以向外发送信息价值。目前,主要使用一种类似JavaScript语言的Solidity语言进行智能合约开发。智能合约部署和调用流程如图1所示。

图1 以太坊智能合约的部署和调用流程

2 一种具有自我计票的多候选人投票方案

文献[11]提出,只允许投票者选择两个候选者,即“yes/no”。本文针对多候选者投票场景,提出一种应用于小规模的董事会投票场景的“1-outof-m”(即投票人可以从m位候选项中选择1个)类型的投票方案。第一轮中,所有选民向管理者注册后拥有投票资格,投票前还需要进行身份验证;第二轮中,合格的投票者选择投票意向后向系统广播自己的选票内容。使用区块链作为一个投票者认证的安全信道,通过运行在区块链上的智能合约实现整个投票流程和自我计票功能,通过多方共识后将投票数据写入区块链,可以让任何人都能验证投票的数据及结果。对于投票者隐私保护,在方案中采用了两轮零知识证明向系统证明自己的秘密信息和投票意向但不泄露任何信息。

2.1 两轮零知识证明协议

本投票方案的参与者主要包括n位合格投票者(V1,V2,…,Vn)和一个投票管理机构,对多位候选者(C1,C2,…,Ck)进行多选一形式表决投票,其中两轮零知识证明协议详细步骤如下。

2.1.1 第一轮零知识证明协议

(1)所有投票者一致同意选取满足安全要求的大素数p,Z*p为p阶有限乘法循环群,g为Z*p的生成元。每位投票者Vi选择一个随机数xi∈Zp作为他们的私钥,然后在本地计算得到gxi作为公钥并公开。

(2)每位投票者Vi广播他们的gxi,然后向系统的智能合约进行离散对数知识证明协议DKPP(xi)用于验证投票者的私钥有效性,即gxi的指数xi是否正确。投票者Vi发送(gv,r=v-xic),其中v∈RZp,c=H(g||gv||gxi||Ai)。智能合约验证 gv与 grgc·xi是否相等,如果相等则证明投票者知道g的指数xi正确合法性,从而相信投票者的身份。然后,投票者Vi从系统中得到重构的投票公钥:

2.1.2 第二轮零知识证明协议

(1)假定n位投票者,系统选取一个最小的正整数m,满足2m>n。然后,对k位候选项分别进行编码表示。投票者选择其中一个选项vi∈{20,2m2(k-1)m}进行投票表决,具体如下:

(2)投票者在本地表决完后发送自己的选票内容vi,并向智能合约进行一轮选票的合法性知识证明协议VKPP(vi)来证明自己选票的合法性。

关于加密选票的合法性知识证明协议具体执行过程如表1所示。实际执行过程中,先将选票内容vi转换成EIGamal密码体制的形式,即(x,y)=(gxi,(gyi)xi·gvi)=(gxi,hxi·ei), 其 中 ei∈ {g20,g2m,…,g2(k-1)m}。 例如:当选票内容为vi=20时,代表投票者选择第一个候选者,投票者的选票的EIGamal加密形式表示为(x,y)=(gxi,(gyi)xi·g20)。投票者在根据VKPP协议计算得到如下参数:(ai,bi)、c=H(Ai,g,x,y,ai,bi)、di和ri。其中,H为安全的哈希函数,Ai为投票者的账号索引值。之后,将(x,y,ai,bi,di,ri)作为验证条件发送到智能合约上进行验证,而智能合约验证H(Ai,g,x,y,ai,bi)=d1+d2+,…,dn是否成立来判断投票者选票内容的合法性,从而决定是否接受投票者的选票内容。此协议是为了表明投票者发送的加密选票gxiyigvi是对候选人列表{20,2m,…,2(k-1)m}其中之一的选择进行加密而不泄露具体的信息,也是实现“1-out-of-m”类型投票的关键所在。另一个目的,是防止破坏者进行重复投票的行为。此外,利用EIGamal加密体制的同态属性,配合智能合约的自动执行操作可以依据设计好的规则实现自我计票,有效取代第三方计票机构,使投票系统更具安全性。

(3)智能合约自动判断投票者加密选票的合法性知识证明协议过程,验证判断每一位投票者的选票内容是否正确、合法。如果正确,则接受投票者提交的选票内容;否则,放弃。当最后一位投票者提交选票后,计算所有选票的统计结果:

这里g∑ivi为离散对数。式(4)的值可以通过小步大步算法(Baby-step Giant-step)和指数积分法(Index Calculus)得到,表示为投票统计的结果,其中系数(c1,c2,…,ck)分别是k位候选者相对应票数。

对于 ∑ixiyi=0具体证明过程如下。

由上述重构密钥:

可得:

最终,可得:

2.2 投票方案的设计及流程说明

本文设计的投票方案采用EIGamal加密体制和两轮零知识证明协议,并运行在以太坊区块链上,通过以太坊智能合约取代传统可信第三方计票机构(TTP)实现自我计票功能。通过区块链的共识机制将投票过程的数据写入区块链账本中,能够满足用户的信任需求。通过EIGamal密码体制保护投票数据的隐私,经过两轮零知识证明协议一方面可以有效防止恶意攻击者的仿造冒充有效投票者进行假投票,另一方面投票者向系统验证自己的有效加密选票的正确性而不泄露具体内容,保护了投票者的隐私。本投票方案总共分为5个过程,由投票发起者、智能合约和投票者三部分组成。图2展示了整个投票方案的流程。

图2 投票方案的流程时序

表1 选票内容的合法性知识证明协议流程

具体的实施过程如下。

(1)登录账户

步骤1:投票发起者和每位投票者登录投票系统的账号都是自己的以太坊账号和密码;

步骤2:要保证每一个投票者账户里至少有少部分代币用于投票时所需的花费,如果投票者账户余额不足,可以向系统索要。

(2)系统设置

步骤1:投票发起者设置投票项目的名称、问题的数量及内容;

步骤2:投票发起者设置计时器,设置投票各个环节的起止时间,确保投票能顺利进行,具体时间参数如下:

TfinishRegistration:表示所有投票者一定要在这个时间点前完成注册;

TbeginVote:表示投票发起者通知系统在这个时间开始进行投票;

TfinishVote:表示所有投票者一定要在这个时间前投出他们的选票内容;

Tπ:最小的时间间隔,投票期间让投票者有足够时间进行投票,保证合约正常运行并写入区块链。

步骤3:投票发起者设置完上述参数后,通知系统开始进入注册阶段,并更新智能合约。

(3)注册

步骤1:投票发起者为每一位登记的投票者生成唯一的注册ID并发送给投票者;

步骤2:投票者向投票发起者发送注册ID来发起注册请求,投票发起者通过智能合约验证投票者的注册ID是否匹配,通过认证的合格投票者名单被写入投票合约中;

步骤3:如果匹配通过,投票者需要生成随机数xi作为私钥,然后计算他们的投票公钥gxi,通过智能合约进行DKPP(xi)(离散对数知识证明协议)来验证投票者私钥xi的有效性;

步骤4:投票者从系统中得到计算后的重构密钥gyi。

投票发起者认证每一个投票者的账号,只有通过认证的合格投票者名单写入投票合约中。注册阶段,应该在规定的注册时间TfinishRegistration内完成,否则系统不接受任何人的注册。同时,投票发起者确认后通知智能合约进入投票阶段。

(4)投票

投票阶段,投票者在投票界面中选择自己选项,然后生成自己的正式选票,通过系统的智能合约的投票方法发送他们的加密后选票内容,具体步骤如下:

步骤1:投票者将投票内容转化为加密后的形式gxiyigvi;

步骤2:投票者需执行VKPP(vi)(选票内容合法性知识证明协议)向系统的智能合约证明自己的投票内容合法,即vi∈{20,2m,…,2(k-1)m},且选票内容的加密形式是正确的;

步骤3:如果有人选择投弃权票,系统也会将此票作为弃权选票并统计到最终投票结果中。

投票工作必须在系统规定的投票时间TfinishVote内完成,当最后一个投票者提交选票后,投票发起者通知智能合约进入计票阶段。

(5)计票

系统调用智能合约中写好的统计投票结果的方法,无需任何第三方计票机构对选票进行统计。智能合约会验证每一张选票的有效性,然后统计所有选票包括弃权票生成最终的投票结果,写入区块链账本并在投票系统上公布。

步骤1:系统调用智能合约中计票的方法,统计所有有效的选票内容,即执行:

步骤2:要得到投票的最终结果就是计算得到统计结果的离散对数的值:

这里(c1,c2,…ck)分别代表相对应候选者的投票数量。另外,对弃权票进行单独统计并计入投票结果中。

步骤3:系统公布每一个候选者对应的统计结果和弃权票的结果,任何人都可以验证投票结果的正确性。

投票流程结束。

3 投票系统设计及实现

本文提出的投票方案实现方法基于以太坊智能合约,通过Web3.js库的JavaScript API接口调用部署在区块链上智能合约的相应方法,实现了整个投票过程。对于智能合约开发,使用目前应用最广泛的编程语言——Solidity语言。Solidity是一种语法与JavaScript相似的高级语言,为以太坊虚拟机编译代码而设计。另外,设计了基于Nodejs的Electron前端框架开发了投票系统的DApp,用于展示整个投票系统的交互过程。图3为投票系统架构图。

图3 投票系统架构

3.1 投票方案智能合约设计

将整个投票方案设计成三个智能合约,分别为 LocalCrypt.sol、Vote.sol和 VoteContractRegistery.sol。这三个合约的功能介绍如表2所示。

表2 智能合约功能介绍

3.2 投票系统设计及实现

基于区块链的多候选人投票系统DApp整体实现是通过web前端页面使用Web3.js库提供的JavaScript API接口调用部署在区块链上智能合约的相应方法,实现了投票交互的整个过程。该设计开发实现了管理员和投票者两个客户端,图4展示了投票系统DApp的界面功能和投票过程。

投票发起者客户端(admin.html):管理员管理、控制、监督整个投票过程,包括部署投票项目智能合约、认证投票者、建立合格投票者列表、发起投票问题、设置注册环节的起止时间、设置投票环节的起止时间、启动计票环节和强制关闭投票项目等功能。

投票者客户端(voter.html):选民登录注册成为合格投票者进行投票,包括登录注册、参与投票、提交选票和查询投票结果等功能。

图4 投票系统界面

4 性能分析与安全性分析

4.1 系统性能分析

本文实验平台使用Intel Core i5-3470 3.2GHz的CPU,8 GB内存,运行64位Windows10操作系统;采用以太坊作为区块链的框架,通过创世区块文件在本地搭建以太坊私链环境,以太坊geth客户端为1.7.2版本,以太坊钱包为win64-0.8.10版本。将以太坊钱包连接到本地私有链网络后,通过钱包将投票方案的智能合约部署在本地私链上,获取LocalCrypto.sol和Vote.sol的合约地址address和二进制文件ABI,把它们发送到主合约VoteContractRegistry.sol上,实现调用这两份合约的方法。另外,通过Web3.js库提供的JavaScript API接口与合约互动,设计了前端页面,实现整个投票的交互过程。

表3为一次投票过程中统计每项操作所需消耗的Gas和消耗的Gas总量。此次投票过程中包含40位投票者进行模拟投票,投票过程中产生的费用是由GasUsed(消耗量)和GasPrice(价格)两个因素决定,即Cost=GasPrice*GasUsed。其中GasUsed由交易(或执行合约代码)的计算量来决定,而GasPrice由交易的发起者来设置。

将投票方案的智能合约分成三份,一方面是为了区分彼此之间功能关系,如LocalCrypto. Sol主要涉及基本的加密解密方法和零知识证明协议的运行,这样模块化设计可以提高代码的重复使用。另一方面,考虑到以太坊上部署智能合约受GasLimit限制,无法将整个投票方案的合约代码通过一份合约上执行。采取的方案是通过主合约VoteContractRegistery.sol调用另外两个合约中的方法。通过表3中统计的Gas消耗显示,部署这三个智能合约都是在以太坊公链中单笔交易Gas最大限制值(8 000 000 Gas)之内,证明投票方案可以在本地私链中运行,同样可以让其在公链中正常运行。

表3 投票中每项操作所需Gas消耗统计表

表4列出了投票方案中一些方法计算所需的平均时间。投票协议合约Vote.sol主要包括注册投票、计算重构公钥、提交选票和计票这几个主要步骤。使用Web3框架提供的接口方法让Web浏览器和以太坊守护进程之间进行通信,所有智能合约中可执行的方法都可用.Call()来调用执行而不会产生Gas消耗,可以在本地的守护进程中测量代码执行时所需的计算时间。其中,加密合约LocalCrypto.Sol主要包括创建和认证零知识证明的两个步骤。在投票注册过程中,创建零知识协议所耗时为81 ms,验证零知识协议所耗时为180 ms;投票过程中,提交选票时创建选票合法性知识证明协议所耗时为356 ms,验证选票合法性知识证明协议耗时为548 ms。

表4 投票方案不同方法执行消耗平均时间

整个投票方案的执行流程都是按照智能合约的执行顺序进行。实验结果表明,整个投票方案最耗时的地方是零知识证明协议和统计投票结果,涉及验证选票的合法性知识证明协议和离散对数知识证明协议两个步骤。此外,还有计算投票结果的离散对数运算,主要是因为目前以太坊智能合约缺乏公钥加密体制的原生支持。

4.2 安全性分析

本文改进的具有自我计票的多候选投票方案是通过区块链上的智能合约实现的,投票者使用以太坊账号进行认证,在投票过程将自己加密后的选票提交到区块链上,投票系统调用智能合约计票方法实现自动计票并计算出投票结果,可以做到无需第三方计票机构。本方案的投票系统基于区块链的安全性,可以实现投票过程的公开可验证、数据防篡改特点。下面对投票系统进行以下几个方面的安全性分析。

4.2.1 选票完全保密性

本文设计的投票系统中,每一位投票者投出的选票内容gxiyigvi都是经过加密的,且投票者向系统发送两轮零知识证明协议验证选票内容的正确性。第一轮中,投票者发送自己的投票密钥gxi;第二轮中,投票者发送自己的选择内容vi。投票者的密钥xi是一个随机数,而yi也是一个随机值,所以对于攻击者来说无法确定。根据Diffie-Hellman假设,任何人无法区分gxiyi在群中所对应的阶数,其中间环节投票者没有透露一点关于自己投票的详细信息,所以任何人无法区分加密选票gxiyigvi所选择的投票内容vi,最大化保护选票的保密性。

智能合约的本质是运行在区块链上的具有特定业务逻辑的一段代码。智能合约的状态和内容是公开的,链上的用户可以对代码进行审查,从而判断合约的功能。智能合约的运行结果会写入账本并公开可验证,不会发生合约创建者规定之外的行为。区块链本身具有匿名性,即使攻击者获取投票者的数据,也无法确定投票者的身份和投票信息。

4.2.2 公平性

统计选票阶段,只有在规定投票时间内,当最后一位投票者广播了自己的投票结果vi后,系统的智能合约才能被管理者执行统计投票结果的方法并得到计票结果。所以,只要存在未在正确时间内广播选票的投票者,投票结果将无法被预先计算。因此,该方案具有公平性。

4.2.3 无争议性

本文方案中以区块链作为身份认证的通道,对于投票者的以太坊账号进行有效性验证,任何无效的账号都不能在投票系统中进行投票。此外,限定一人投一票,每一张选票选择一个候选者,保证了投票结果的准确性,投票方案是无争议的。

4.2.4 可验证性

投票者在提交选票后在系统统计投票结果前,可以在自己的客户端查询确认选票是否被篡改。基于区块链上的数据具有公开性可验证。在统计结果出来后,每一位投票者也获取到所有投票者的选票gxiyigvi去验证计算的值与系统给出的结果是否一致。本方案具有投票结果的可验证性。

4.2.5 合格性

方案中,投票者都在管理员那里进行登记注册。管理员会在投票智能合约中建立一份有效的投票者名单,确保登录到投票系统中的投票者都是合法的。之后在投票过程中,投票者还需要验证由管理者发送的唯一验证码进行双重验证,确保每一位投票者都是合格的,每一张选票都是合格有效的。

4.2.6 抗重播攻击

所有的投票密钥gxi和零知识证明DKPP(xi)被公开发送到以太坊区块链。因此,另外的合格投票者可能会尝试使用另一组gxi和DKPP(xi)来获得再一次的投票权。而在零知识证明过程中,要求投票者在哈希函数中包含msg.sender(即投票者的以太坊账号)。如果msg.sender与调用合约的账户不匹配,智能合约将不接受DKPP(xi)的验证。因此,在没有共谋的情况下,攻击者想重播攻击另一位投票者的投票密钥gxi来获得另一次投票是不可能的。同样,在对选票的零知识证明VKPP(vi)验证过程也是不能通过。

5 结 语

本文介绍了一种基于以太坊区块链的多候选人的电子投票方案,用特定业务逻辑的智能合约实现自我计票功能而取代了传统的第三方计票机构。同时,在投票方案的智能合约引入了两轮零知识证明,有效保护了投票者的隐私问题。从对投票方案的安全性分析中证明,投票方案是安全可靠的。另外,在本地的私有链节点上部署智能合约,模拟了40位投票者进行投票。从实验的数据中可知,投票系统在保护投票者隐私的前提下能做到公开可验证,可适用于小规模的董事会投票场景。

猜你喜欢
以太计票选票
基于活跃节点库的以太坊加密流量识别方法
以太万物理论概述
奥斯卡奖的偏好投票制
车易链:做汽车业的“以太坊”
A Study on the Contract Research Organization
中国戏剧家协会第七届理事会理事选举计票人名单
中国戏剧家协会第七届主席、副主席选举计票人名单
美国现在的选举投票方式比以往任何时候都脆弱