蔡群英
(韓山師范學(xué)院計(jì)算機(jī)與信息工程學(xué)院,潮州521000)
隨著計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的發(fā)展,信息化程度越來(lái)越高。很多社會(huì)活動(dòng)和事務(wù),都可以通過(guò)計(jì)算機(jī)來(lái)完成,代替人工操作。比如各級(jí)選舉投票,傳統(tǒng)的選舉投票使用的是紙質(zhì)的選票,不便于調(diào)整候選人名單;填寫(xiě)紙質(zhì)選票一旦筆跡不清晰或涂改便會(huì)造成廢票;還要在現(xiàn)場(chǎng)集中進(jìn)行投票,經(jīng)過(guò)計(jì)票然后才能出結(jié)果。整個(gè)過(guò)程,既浪費(fèi)時(shí)間也容易泄露投票內(nèi)容,計(jì)票環(huán)節(jié)也容易造假。
針對(duì)傳統(tǒng)選舉投票的種種問(wèn)題,本文考慮采用數(shù)字簽名和加密二維碼技術(shù),通過(guò)分析投票的業(yè)務(wù)流程,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)電子投票系統(tǒng)[1]。從發(fā)放選票、驗(yàn)證選票、進(jìn)行投票、計(jì)票到查驗(yàn)選票內(nèi)容都在網(wǎng)絡(luò)上進(jìn)行,利用非對(duì)稱密碼算法RSA 對(duì)選票進(jìn)行加密,然后生成二維碼,選民進(jìn)行投票后投票內(nèi)容使用SHA512WithRSA 算法進(jìn)行數(shù)字簽名,確保所選內(nèi)容不被篡改。通過(guò)密碼學(xué)的技術(shù)和網(wǎng)絡(luò)技術(shù),使得整個(gè)投票過(guò)程順利進(jìn)行[2-4]。
QR 碼(Quick Response Code)即快速響應(yīng)矩陣碼,是日本Denso 公司于1994 年9 月研制的一種矩陣二維碼,能夠有效地表示各種英文字符和漢字,具有信息容量大、可靠性高、高速識(shí)讀性和全方位(360°)識(shí)讀等特點(diǎn),目前,已廣泛地應(yīng)用于移動(dòng)支付、農(nóng)產(chǎn)品溯源、各種導(dǎo)航宣傳鏈接上,開(kāi)發(fā)方通過(guò)Web 平臺(tái)將信息加密、編制成二維碼圖像,用戶通過(guò)手機(jī)掃描進(jìn)行識(shí)讀認(rèn)證,作為交易或身份識(shí)別的憑證來(lái)支撐各種應(yīng)用[5]。
RSA 算法是美國(guó)麻省理工學(xué)院(MIT)的Rivest、Shami 和Adleman 于1987 年提出的非對(duì)稱密碼算法,是第一個(gè)理論上最為成功的公開(kāi)密鑰密碼體制,目前廣泛地應(yīng)用于信息交換和身份認(rèn)證,本系統(tǒng)使用RSA進(jìn)行二維碼的信息加密。RSA 算法對(duì)信息進(jìn)行加解密的過(guò)程:首先,通過(guò)程序產(chǎn)生一對(duì)密鑰對(duì):公鑰PK={e,n}和私鑰SK={d,n};然后使用公鑰對(duì)信息進(jìn)行加密,形成密文,進(jìn)行發(fā)送;接收時(shí)使用私鑰對(duì)密文進(jìn)行解密,得到原來(lái)的信息。在RSA 算法中,數(shù)據(jù)都要轉(zhuǎn)換為整數(shù),然后利用整數(shù)的求余運(yùn)算進(jìn)行加解密[6]。加密:Y=Xemod n,解密:X=Ydmod n,具體如圖1 所示。

圖1 RSA密碼體制圖
作為電子投票系統(tǒng),我們既要保證投票人所投選的信息不被篡改,同時(shí)又要投票人對(duì)自已的投票內(nèi)容確認(rèn),不能事后抵賴,就要采用相應(yīng)的技術(shù)來(lái)保障。在計(jì)算機(jī)中模仿現(xiàn)實(shí)中的簽名和蓋章的技術(shù)稱為數(shù)字簽名。我們采用RSA 技術(shù)來(lái)實(shí)現(xiàn)數(shù)字簽名,當(dāng)RSA 算法用于數(shù)字簽名時(shí),不同于加密,簽名者用私鑰參數(shù)d 加密,也就是簽名;驗(yàn)證者用簽名者的公鑰參數(shù)e 解密來(lái)完成認(rèn)證[7-9]。
但是,由于RSA 算法存在計(jì)算方法本身同構(gòu)造成簽名易被偽造和計(jì)算時(shí)間長(zhǎng)的弱點(diǎn),所以在實(shí)際的運(yùn)用中,通常是先對(duì)消息進(jìn)行SHA-512 變換,SHA-512函數(shù)是一種散列函數(shù),它將任意長(zhǎng)度的消息壓縮成512位的消息摘要。SHA-512 具有兩個(gè)方面的特性:一是單向性,給定散列值,計(jì)算消息很難;二是抗碰撞性,即給定消息M,要找到另一消息M'并滿足兩者的散列值很難。基于這個(gè)特性,可以配合RSA 實(shí)現(xiàn)數(shù)字簽名。實(shí)現(xiàn)過(guò)程如圖2 所示。

圖2 SHA512WithRSA算法實(shí)現(xiàn)數(shù)字簽名的過(guò)程
傳統(tǒng)投票的流程是發(fā)放選票、進(jìn)行投票、驗(yàn)證選票和計(jì)票,公布投票結(jié)果。根據(jù)傳統(tǒng)投票的流程,開(kāi)發(fā)電
子投票系統(tǒng)涉及的對(duì)象有選民、投票管理機(jī)構(gòu)和計(jì)票中心[2]。系統(tǒng)采用JSP+Servlet+Javabean 架構(gòu),服務(wù)器采用Tomcat,數(shù)據(jù)庫(kù)采用MySQL,使用JavaBean 實(shí)現(xiàn)業(yè)務(wù)邏輯,Servlet 進(jìn)行流程控制。為了符合安全性方面的要求,把投票管理機(jī)構(gòu)和計(jì)票中心的數(shù)據(jù)分別存放于兩臺(tái)獨(dú)立的數(shù)據(jù)庫(kù)服務(wù)器。
(1)身份注冊(cè)(發(fā)放選票):用戶在注冊(cè)頁(yè)面進(jìn)行注冊(cè),填寫(xiě)有關(guān)的注冊(cè)項(xiàng)目,通過(guò)手機(jī)號(hào)來(lái)標(biāo)識(shí)不同的用戶,連接投票管理機(jī)構(gòu)的數(shù)據(jù)庫(kù)服務(wù)器,查詢手機(jī)號(hào),如果沒(méi)有注冊(cè)過(guò),則使用系統(tǒng)統(tǒng)一的一對(duì)密鑰對(duì),使用公鑰對(duì)注冊(cè)信息(手機(jī)號(hào)和姓名)進(jìn)行加密,形成密文,再將密文生成二維碼,此二維碼為“選票二維碼”,作為選票憑證。
(2)用戶驗(yàn)證(驗(yàn)證選票):使用識(shí)讀設(shè)備來(lái)識(shí)讀選票的二維碼圖片,解密出二維碼的信息,讀出用戶手機(jī)號(hào),然后連接投票管理機(jī)構(gòu)的數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行查詢,如果有此手機(jī)號(hào),說(shuō)明選票合法,則給此選票生成一個(gè)臨時(shí)ID,否則,則說(shuō)明選票不合法,驗(yàn)證通不過(guò)。
(3)進(jìn)行投票:選票驗(yàn)證通過(guò)后,進(jìn)入投票界面,用戶可以進(jìn)行投票,投票內(nèi)容(所選的候選人姓名和選民的臨時(shí)ID)使用SHA512WithRSA 算法進(jìn)行數(shù)字簽名,同時(shí),對(duì)有關(guān)的表進(jìn)行更新。最后投票內(nèi)容的數(shù)字簽名、投票內(nèi)容和公鑰進(jìn)行QR 編碼,生成“投票二維碼”,發(fā)送給客戶端。
(4)公布投票結(jié)果:整個(gè)投票過(guò)程結(jié)束后,計(jì)票中心公布投票結(jié)果,選民如果對(duì)投票結(jié)果有質(zhì)疑,則持“投票二維碼”進(jìn)行檢驗(yàn)。首先解碼,得到投票內(nèi)容的數(shù)字簽名、投票內(nèi)容和公鑰,然后用公鑰對(duì)投票內(nèi)容的數(shù)字簽名進(jìn)行RSA 解密,得到消息摘要①,再連接到計(jì)票中心數(shù)據(jù)庫(kù),根據(jù)投票內(nèi)容中的選民臨時(shí)ID 得到所選的候選人姓名,再將選民臨時(shí)ID 和候選人姓名使用SHA512 算法提取消息摘要②,消息摘要①和②如果不一致,表示投票內(nèi)容被篡改。
本系統(tǒng)使用一對(duì)密鑰對(duì)選民信息進(jìn)行加密,在項(xiàng)目部署到服務(wù)器時(shí),進(jìn)行初始化,如果檢測(cè)到?jīng)]有公鑰文件和私鑰文件,則產(chǎn)生公鑰文件和私鑰文件,保存在服務(wù)器項(xiàng)目的RSAKey 目錄中,以Skey_RSA_pri.dat 和Skey_RSA_pub.dat 命名,使用java.security 包的相應(yīng)類(lèi)來(lái)實(shí)現(xiàn)RSA 加解密。
產(chǎn)生公鑰和私鑰的算法如下:創(chuàng)建密鑰對(duì)生成器KeyPairGenerator,指定加密和解密算法為RSA,指定密鑰的長(zhǎng)度1024,初始化密鑰對(duì)生成器。通過(guò)gen?KeyPair()得到密鑰對(duì),getPublic()得到公鑰,getPrivate()得到私鑰,公鑰和私鑰都是對(duì)象,寫(xiě)入文件中[9]。
加密算法如下:首先,通過(guò)讀取服務(wù)器的公鑰文件,取得公鑰對(duì)象RSAPublicKey,通過(guò)getPublicExpo?nent()得到公鑰中的e,通過(guò)getModulus()得到公鑰中的n,然后對(duì)明文進(jìn)行URL 編碼,以解決中文亂碼問(wèn)題,接著將編碼后的明文轉(zhuǎn)換為字節(jié)數(shù)組,再將字節(jié)數(shù)組轉(zhuǎn)換為BigInteger 類(lèi)型c,然后通過(guò)c.modPow(e,n),得到密文的BigInteger 類(lèi)型m,再轉(zhuǎn)換為字符形式,即得到密文。
解密算法如下:將要解密的密文轉(zhuǎn)換成對(duì)應(yīng)的BigInteger 類(lèi)型c,然后從服務(wù)器讀取私鑰文件,得到RSAPrivateKey 對(duì)象,通過(guò)getPrivateExponent()得到私鑰中的d,通過(guò)getModulus()得到私鑰中的n,這樣就得到私鑰{d,n},通過(guò)c.modPow(d,n)得到明文的BigIn?teger 類(lèi)型m,將m 的每個(gè)字節(jié)轉(zhuǎn)換成字符,連接起來(lái),就得到明文。涉及到中文字符,則要進(jìn)行URL 解碼,得到最終的明文,避免了中文亂碼。
進(jìn)行二維碼的編碼:實(shí)現(xiàn)QR 碼的編碼和解碼需要使用兩個(gè)類(lèi)庫(kù):Qrcode_swetake.jar 和qrcode.jar,這兩個(gè)類(lèi)庫(kù)在網(wǎng)上可以下載。編寫(xiě)一個(gè)TwoDimensionCo?deImage 類(lèi)用于設(shè)置二維碼圖片,編寫(xiě)QRCodeEncoder?Handler 類(lèi)和QRCoderDecoderHandler 類(lèi),用于實(shí)現(xiàn)編碼和解碼。生成的二維碼圖片的大小由所壓縮的信息量來(lái)確定,默認(rèn)情況下圖片的大小是139×139,這個(gè)大小是比較適合QrcodeVersion 為7 的情況,通過(guò)new BufferedImage(139,139,BufferedImage.TYPE_INT_RGB)創(chuàng)建圖像對(duì)象。但針對(duì)密鑰的長(zhǎng)度是1024,Qrcode?Version 就要設(shè)置為20,糾錯(cuò)等級(jí)設(shè)置為M,編碼模式設(shè)置為B,這個(gè)版本的數(shù)據(jù)容量是666 個(gè)8 位字節(jié),圖片的大小要設(shè)置為300×300,才可能正常的解碼[10]。
用SHA512WithRSA 算法進(jìn)行數(shù)字簽名是用于檢驗(yàn)服務(wù)器端有沒(méi)有篡改投票信息,所以把服務(wù)器端做為發(fā)送方,由發(fā)送方產(chǎn)生RSA 的公鑰和私鑰。
選民進(jìn)行投票時(shí),將投票內(nèi)容(即所選的候選人姓名和選民的臨時(shí)ID)使用SHA512WithRSA 算法進(jìn)行數(shù)字簽名,在具體的處理上是每個(gè)選民有一對(duì)密鑰,首先對(duì)投票內(nèi)容使用SHA512 算法提取消息摘要,然后使用私鑰對(duì)消息摘要進(jìn)行RSA 加密,這樣就實(shí)現(xiàn)了簽名,投票內(nèi)容的數(shù)字簽名、投票內(nèi)容和公鑰進(jìn)行QR 編碼,保存在二維碼中,稱為“投票二維碼”。
選民如果對(duì)投票結(jié)果有質(zhì)疑,可持“投票二維碼”進(jìn)行檢驗(yàn),首先解碼,得到投票內(nèi)容的數(shù)字簽名、投票內(nèi)容和公鑰,然后用公鑰對(duì)投票內(nèi)容的數(shù)字簽名進(jìn)行RSA 解密,得到消息摘要①。再連接到計(jì)票中心數(shù)據(jù)庫(kù),根據(jù)投票信息中的選民臨時(shí)ID 得到所投的候選人姓名,再將選民臨時(shí)ID 和候選人姓名使用SHA512 算法提取消息摘要②,消息摘要①和②如果不一致,表示投票內(nèi)容被篡改。
將系統(tǒng)部署到Tomcat 服務(wù)器,如圖3 所示,運(yùn)行,進(jìn)行測(cè)試。

圖3 系統(tǒng)部署圖
選民在注冊(cè)時(shí),填寫(xiě)手機(jī)號(hào)和姓名,即生成一張“選票二維碼”,作為一種身份的憑證,這是一張加密的二維碼,如圖4 所示,在其他的系統(tǒng)中識(shí)別不了。

圖4 生成“選票二維碼”圖
進(jìn)行投票時(shí),選民拿著“選票二維碼”在投票終端進(jìn)行身份識(shí)別,驗(yàn)證通過(guò)后則進(jìn)入投票界面。如已投過(guò)票,則顯示“您已投過(guò)票,不能再投”,并且投票按鈕失效,投票頁(yè)面如圖5 所示。

圖5 投票頁(yè)面圖
投票完成后,則得到一個(gè)“投票二維碼”,如圖6所示。

圖6 生成“投票二維碼”
最后,計(jì)票中心公布投票結(jié)果,選民如果對(duì)投票結(jié)果有質(zhì)疑,則持“投票二維碼”進(jìn)行檢驗(yàn)。當(dāng)顯示“數(shù)字簽名驗(yàn)證通過(guò)”,則表示你的投票內(nèi)容沒(méi)有被纂改,如圖7 所示。

圖7 驗(yàn)證投票結(jié)果圖
本文通過(guò)對(duì)傳統(tǒng)投票系統(tǒng)的業(yè)務(wù)流程進(jìn)行分析,針對(duì)現(xiàn)有的一些電子投票系統(tǒng)存在的不足,設(shè)計(jì)并實(shí)現(xiàn)了一種基于數(shù)字簽名和加密二維碼技術(shù)的電子投票系統(tǒng),并對(duì)系統(tǒng)的工作流程、功能和關(guān)鍵技術(shù)進(jìn)行詳細(xì)介紹,最后進(jìn)行系統(tǒng)的部署和測(cè)試。該系統(tǒng)通過(guò)數(shù)字簽名和加密二維碼技術(shù)達(dá)到了投票系統(tǒng)的安全要求,可用于各類(lèi)評(píng)優(yōu)評(píng)獎(jiǎng)的投票,還可以用于單位的年度考核,整個(gè)過(guò)程實(shí)現(xiàn)無(wú)紙化,投票過(guò)程全程自動(dòng)化,不受人工干預(yù),做到了評(píng)選的公平公正。