基于数字签名和加密二维码技术的电子投票系统的实现

2020-08-21 01:01蔡群英
现代计算机 2020年20期
关键词:私钥公钥数字签名

蔡群英

(韩山师范学院计算机与信息工程学院,潮州521000)

0 引言

随着计算机和网络技术的发展,信息化程度越来越高。很多社会活动和事务,都可以通过计算机来完成,代替人工操作。比如各级选举投票,传统的选举投票使用的是纸质的选票,不便于调整候选人名单;填写纸质选票一旦笔迹不清晰或涂改便会造成废票;还要在现场集中进行投票,经过计票然后才能出结果。整个过程,既浪费时间也容易泄露投票内容,计票环节也容易造假。

针对传统选举投票的种种问题,本文考虑采用数字签名和加密二维码技术,通过分析投票的业务流程,设计并实现一个电子投票系统[1]。从发放选票、验证选票、进行投票、计票到查验选票内容都在网络上进行,利用非对称密码算法RSA 对选票进行加密,然后生成二维码,选民进行投票后投票内容使用SHA512WithRSA 算法进行数字签名,确保所选内容不被篡改。通过密码学的技术和网络技术,使得整个投票过程顺利进行[2-4]。

1 QR码简介

QR 码(Quick Response Code)即快速响应矩阵码,是日本Denso 公司于1994 年9 月研制的一种矩阵二维码,能够有效地表示各种英文字符和汉字,具有信息容量大、可靠性高、高速识读性和全方位(360°)识读等特点,目前,已广泛地应用于移动支付、农产品溯源、各种导航宣传链接上,开发方通过Web 平台将信息加密、编制成二维码图像,用户通过手机扫描进行识读认证,作为交易或身份识别的凭证来支撑各种应用[5]。

2 RSA算法与数字签名

2.1 RSA算法

RSA 算法是美国麻省理工学院(MIT)的Rivest、Shami 和Adleman 于1987 年提出的非对称密码算法,是第一个理论上最为成功的公开密钥密码体制,目前广泛地应用于信息交换和身份认证,本系统使用RSA进行二维码的信息加密。RSA 算法对信息进行加解密的过程:首先,通过程序产生一对密钥对:公钥PK={e,n}和私钥SK={d,n};然后使用公钥对信息进行加密,形成密文,进行发送;接收时使用私钥对密文进行解密,得到原来的信息。在RSA 算法中,数据都要转换为整数,然后利用整数的求余运算进行加解密[6]。加密:Y=Xemod n,解密:X=Ydmod n,具体如图1 所示。

图1 RSA密码体制图

2.2 SHA512WithRSA数字签名

作为电子投票系统,我们既要保证投票人所投选的信息不被篡改,同时又要投票人对自已的投票内容确认,不能事后抵赖,就要采用相应的技术来保障。在计算机中模仿现实中的签名和盖章的技术称为数字签名。我们采用RSA 技术来实现数字签名,当RSA 算法用于数字签名时,不同于加密,签名者用私钥参数d 加密,也就是签名;验证者用签名者的公钥参数e 解密来完成认证[7-9]。

但是,由于RSA 算法存在计算方法本身同构造成签名易被伪造和计算时间长的弱点,所以在实际的运用中,通常是先对消息进行SHA-512 变换,SHA-512函数是一种散列函数,它将任意长度的消息压缩成512位的消息摘要。SHA-512 具有两个方面的特性:一是单向性,给定散列值,计算消息很难;二是抗碰撞性,即给定消息M,要找到另一消息M'并满足两者的散列值很难。基于这个特性,可以配合RSA 实现数字签名。实现过程如图2 所示。

图2 SHA512WithRSA算法实现数字签名的过程

3 系统架构及投票流程的分析

3.1 系统架构

传统投票的流程是发放选票、进行投票、验证选票和计票,公布投票结果。根据传统投票的流程,开发电

子投票系统涉及的对象有选民、投票管理机构和计票中心[2]。系统采用JSP+Servlet+Javabean 架构,服务器采用Tomcat,数据库采用MySQL,使用JavaBean 实现业务逻辑,Servlet 进行流程控制。为了符合安全性方面的要求,把投票管理机构和计票中心的数据分别存放于两台独立的数据库服务器。

3.2 投票流程

(1)身份注册(发放选票):用户在注册页面进行注册,填写有关的注册项目,通过手机号来标识不同的用户,连接投票管理机构的数据库服务器,查询手机号,如果没有注册过,则使用系统统一的一对密钥对,使用公钥对注册信息(手机号和姓名)进行加密,形成密文,再将密文生成二维码,此二维码为“选票二维码”,作为选票凭证。

(2)用户验证(验证选票):使用识读设备来识读选票的二维码图片,解密出二维码的信息,读出用户手机号,然后连接投票管理机构的数据库服务器进行查询,如果有此手机号,说明选票合法,则给此选票生成一个临时ID,否则,则说明选票不合法,验证通不过。

(3)进行投票:选票验证通过后,进入投票界面,用户可以进行投票,投票内容(所选的候选人姓名和选民的临时ID)使用SHA512WithRSA 算法进行数字签名,同时,对有关的表进行更新。最后投票内容的数字签名、投票内容和公钥进行QR 编码,生成“投票二维码”,发送给客户端。

(4)公布投票结果:整个投票过程结束后,计票中心公布投票结果,选民如果对投票结果有质疑,则持“投票二维码”进行检验。首先解码,得到投票内容的数字签名、投票内容和公钥,然后用公钥对投票内容的数字签名进行RSA 解密,得到消息摘要①,再连接到计票中心数据库,根据投票内容中的选民临时ID 得到所选的候选人姓名,再将选民临时ID 和候选人姓名使用SHA512 算法提取消息摘要②,消息摘要①和②如果不一致,表示投票内容被篡改。

4 关键技术

4.1 加密二维码的生成和识别

本系统使用一对密钥对选民信息进行加密,在项目部署到服务器时,进行初始化,如果检测到没有公钥文件和私钥文件,则产生公钥文件和私钥文件,保存在服务器项目的RSAKey 目录中,以Skey_RSA_pri.dat 和Skey_RSA_pub.dat 命名,使用java.security 包的相应类来实现RSA 加解密。

产生公钥和私钥的算法如下:创建密钥对生成器KeyPairGenerator,指定加密和解密算法为RSA,指定密钥的长度1024,初始化密钥对生成器。通过gen⁃KeyPair()得到密钥对,getPublic()得到公钥,getPrivate()得到私钥,公钥和私钥都是对象,写入文件中[9]。

加密算法如下:首先,通过读取服务器的公钥文件,取得公钥对象RSAPublicKey,通过getPublicExpo⁃nent()得到公钥中的e,通过getModulus()得到公钥中的n,然后对明文进行URL 编码,以解决中文乱码问题,接着将编码后的明文转换为字节数组,再将字节数组转换为BigInteger 类型c,然后通过c.modPow(e,n),得到密文的BigInteger 类型m,再转换为字符形式,即得到密文。

解密算法如下:将要解密的密文转换成对应的BigInteger 类型c,然后从服务器读取私钥文件,得到RSAPrivateKey 对象,通过getPrivateExponent()得到私钥中的d,通过getModulus()得到私钥中的n,这样就得到私钥{d,n},通过c.modPow(d,n)得到明文的BigIn⁃teger 类型m,将m 的每个字节转换成字符,连接起来,就得到明文。涉及到中文字符,则要进行URL 解码,得到最终的明文,避免了中文乱码。

进行二维码的编码:实现QR 码的编码和解码需要使用两个类库:Qrcode_swetake.jar 和qrcode.jar,这两个类库在网上可以下载。编写一个TwoDimensionCo⁃deImage 类用于设置二维码图片,编写QRCodeEncoder⁃Handler 类和QRCoderDecoderHandler 类,用于实现编码和解码。生成的二维码图片的大小由所压缩的信息量来确定,默认情况下图片的大小是139×139,这个大小是比较适合QrcodeVersion 为7 的情况,通过new BufferedImage(139,139,BufferedImage.TYPE_INT_RGB)创建图像对象。但针对密钥的长度是1024,Qrcode⁃Version 就要设置为20,纠错等级设置为M,编码模式设置为B,这个版本的数据容量是666 个8 位字节,图片的大小要设置为300×300,才可能正常的解码[10]。

4.2 SHA512WithRSA算法的签名和验证签名

用SHA512WithRSA 算法进行数字签名是用于检验服务器端有没有篡改投票信息,所以把服务器端做为发送方,由发送方产生RSA 的公钥和私钥。

选民进行投票时,将投票内容(即所选的候选人姓名和选民的临时ID)使用SHA512WithRSA 算法进行数字签名,在具体的处理上是每个选民有一对密钥,首先对投票内容使用SHA512 算法提取消息摘要,然后使用私钥对消息摘要进行RSA 加密,这样就实现了签名,投票内容的数字签名、投票内容和公钥进行QR 编码,保存在二维码中,称为“投票二维码”。

选民如果对投票结果有质疑,可持“投票二维码”进行检验,首先解码,得到投票内容的数字签名、投票内容和公钥,然后用公钥对投票内容的数字签名进行RSA 解密,得到消息摘要①。再连接到计票中心数据库,根据投票信息中的选民临时ID 得到所投的候选人姓名,再将选民临时ID 和候选人姓名使用SHA512 算法提取消息摘要②,消息摘要①和②如果不一致,表示投票内容被篡改。

5 系统部署和测试

将系统部署到Tomcat 服务器,如图3 所示,运行,进行测试。

图3 系统部署图

选民在注册时,填写手机号和姓名,即生成一张“选票二维码”,作为一种身份的凭证,这是一张加密的二维码,如图4 所示,在其他的系统中识别不了。

图4 生成“选票二维码”图

进行投票时,选民拿着“选票二维码”在投票终端进行身份识别,验证通过后则进入投票界面。如已投过票,则显示“您已投过票,不能再投”,并且投票按钮失效,投票页面如图5 所示。

图5 投票页面图

投票完成后,则得到一个“投票二维码”,如图6所示。

图6 生成“投票二维码”

最后,计票中心公布投票结果,选民如果对投票结果有质疑,则持“投票二维码”进行检验。当显示“数字签名验证通过”,则表示你的投票内容没有被纂改,如图7 所示。

图7 验证投票结果图

6 结语

本文通过对传统投票系统的业务流程进行分析,针对现有的一些电子投票系统存在的不足,设计并实现了一种基于数字签名和加密二维码技术的电子投票系统,并对系统的工作流程、功能和关键技术进行详细介绍,最后进行系统的部署和测试。该系统通过数字签名和加密二维码技术达到了投票系统的安全要求,可用于各类评优评奖的投票,还可以用于单位的年度考核,整个过程实现无纸化,投票过程全程自动化,不受人工干预,做到了评选的公平公正。

猜你喜欢
私钥公钥数字签名
比特币的安全性到底有多高
Spatially defined single-cell transcriptional profiling characterizes diverse chondrocyte subtypes and nucleus pulposus progenitors in human intervertebral discs
程序员把7500枚比特币扔掉损失巨大
交通运输行业数字签名系统的设计与实现分析
神奇的公钥密码
数字签名技术在计算机安全防护中的应用
国密SM2密码算法的C语言实现
关于电子商务中安全数字签名的研究
基于身份的聚合签名体制研究
掌握方法用好数字签名