蔡群英
(韓山師范學院計算機與信息工程學院,潮州521000)
隨著計算機和網絡技術的發展,信息化程度越來越高。很多社會活動和事務,都可以通過計算機來完成,代替人工操作。比如各級選舉投票,傳統的選舉投票使用的是紙質的選票,不便于調整候選人名單;填寫紙質選票一旦筆跡不清晰或涂改便會造成廢票;還要在現場集中進行投票,經過計票然后才能出結果。整個過程,既浪費時間也容易泄露投票內容,計票環節也容易造假。
針對傳統選舉投票的種種問題,本文考慮采用數字簽名和加密二維碼技術,通過分析投票的業務流程,設計并實現一個電子投票系統[1]。從發放選票、驗證選票、進行投票、計票到查驗選票內容都在網絡上進行,利用非對稱密碼算法RSA 對選票進行加密,然后生成二維碼,選民進行投票后投票內容使用SHA512WithRSA 算法進行數字簽名,確保所選內容不被篡改。通過密碼學的技術和網絡技術,使得整個投票過程順利進行[2-4]。
QR 碼(Quick Response Code)即快速響應矩陣碼,是日本Denso 公司于1994 年9 月研制的一種矩陣二維碼,能夠有效地表示各種英文字符和漢字,具有信息容量大、可靠性高、高速識讀性和全方位(360°)識讀等特點,目前,已廣泛地應用于移動支付、農產品溯源、各種導航宣傳鏈接上,開發方通過Web 平臺將信息加密、編制成二維碼圖像,用戶通過手機掃描進行識讀認證,作為交易或身份識別的憑證來支撐各種應用[5]。
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密碼體制圖
作為電子投票系統,我們既要保證投票人所投選的信息不被篡改,同時又要投票人對自已的投票內容確認,不能事后抵賴,就要采用相應的技術來保障。在計算機中模仿現實中的簽名和蓋章的技術稱為數字簽名。我們采用RSA 技術來實現數字簽名,當RSA 算法用于數字簽名時,不同于加密,簽名者用私鑰參數d 加密,也就是簽名;驗證者用簽名者的公鑰參數e 解密來完成認證[7-9]。
但是,由于RSA 算法存在計算方法本身同構造成簽名易被偽造和計算時間長的弱點,所以在實際的運用中,通常是先對消息進行SHA-512 變換,SHA-512函數是一種散列函數,它將任意長度的消息壓縮成512位的消息摘要。SHA-512 具有兩個方面的特性:一是單向性,給定散列值,計算消息很難;二是抗碰撞性,即給定消息M,要找到另一消息M'并滿足兩者的散列值很難。基于這個特性,可以配合RSA 實現數字簽名。實現過程如圖2 所示。

圖2 SHA512WithRSA算法實現數字簽名的過程
傳統投票的流程是發放選票、進行投票、驗證選票和計票,公布投票結果。根據傳統投票的流程,開發電
子投票系統涉及的對象有選民、投票管理機構和計票中心[2]。系統采用JSP+Servlet+Javabean 架構,服務器采用Tomcat,數據庫采用MySQL,使用JavaBean 實現業務邏輯,Servlet 進行流程控制。為了符合安全性方面的要求,把投票管理機構和計票中心的數據分別存放于兩臺獨立的數據庫服務器。
(1)身份注冊(發放選票):用戶在注冊頁面進行注冊,填寫有關的注冊項目,通過手機號來標識不同的用戶,連接投票管理機構的數據庫服務器,查詢手機號,如果沒有注冊過,則使用系統統一的一對密鑰對,使用公鑰對注冊信息(手機號和姓名)進行加密,形成密文,再將密文生成二維碼,此二維碼為“選票二維碼”,作為選票憑證。
(2)用戶驗證(驗證選票):使用識讀設備來識讀選票的二維碼圖片,解密出二維碼的信息,讀出用戶手機號,然后連接投票管理機構的數據庫服務器進行查詢,如果有此手機號,說明選票合法,則給此選票生成一個臨時ID,否則,則說明選票不合法,驗證通不過。
(3)進行投票:選票驗證通過后,進入投票界面,用戶可以進行投票,投票內容(所選的候選人姓名和選民的臨時ID)使用SHA512WithRSA 算法進行數字簽名,同時,對有關的表進行更新。最后投票內容的數字簽名、投票內容和公鑰進行QR 編碼,生成“投票二維碼”,發送給客戶端。
(4)公布投票結果:整個投票過程結束后,計票中心公布投票結果,選民如果對投票結果有質疑,則持“投票二維碼”進行檢驗。首先解碼,得到投票內容的數字簽名、投票內容和公鑰,然后用公鑰對投票內容的數字簽名進行RSA 解密,得到消息摘要①,再連接到計票中心數據庫,根據投票內容中的選民臨時ID 得到所選的候選人姓名,再將選民臨時ID 和候選人姓名使用SHA512 算法提取消息摘要②,消息摘要①和②如果不一致,表示投票內容被篡改。
本系統使用一對密鑰對選民信息進行加密,在項目部署到服務器時,進行初始化,如果檢測到沒有公鑰文件和私鑰文件,則產生公鑰文件和私鑰文件,保存在服務器項目的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]。
用SHA512WithRSA 算法進行數字簽名是用于檢驗服務器端有沒有篡改投票信息,所以把服務器端做為發送方,由發送方產生RSA 的公鑰和私鑰。
選民進行投票時,將投票內容(即所選的候選人姓名和選民的臨時ID)使用SHA512WithRSA 算法進行數字簽名,在具體的處理上是每個選民有一對密鑰,首先對投票內容使用SHA512 算法提取消息摘要,然后使用私鑰對消息摘要進行RSA 加密,這樣就實現了簽名,投票內容的數字簽名、投票內容和公鑰進行QR 編碼,保存在二維碼中,稱為“投票二維碼”。
選民如果對投票結果有質疑,可持“投票二維碼”進行檢驗,首先解碼,得到投票內容的數字簽名、投票內容和公鑰,然后用公鑰對投票內容的數字簽名進行RSA 解密,得到消息摘要①。再連接到計票中心數據庫,根據投票信息中的選民臨時ID 得到所投的候選人姓名,再將選民臨時ID 和候選人姓名使用SHA512 算法提取消息摘要②,消息摘要①和②如果不一致,表示投票內容被篡改。
將系統部署到Tomcat 服務器,如圖3 所示,運行,進行測試。

圖3 系統部署圖
選民在注冊時,填寫手機號和姓名,即生成一張“選票二維碼”,作為一種身份的憑證,這是一張加密的二維碼,如圖4 所示,在其他的系統中識別不了。

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

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

圖6 生成“投票二維碼”
最后,計票中心公布投票結果,選民如果對投票結果有質疑,則持“投票二維碼”進行檢驗。當顯示“數字簽名驗證通過”,則表示你的投票內容沒有被纂改,如圖7 所示。

圖7 驗證投票結果圖
本文通過對傳統投票系統的業務流程進行分析,針對現有的一些電子投票系統存在的不足,設計并實現了一種基于數字簽名和加密二維碼技術的電子投票系統,并對系統的工作流程、功能和關鍵技術進行詳細介紹,最后進行系統的部署和測試。該系統通過數字簽名和加密二維碼技術達到了投票系統的安全要求,可用于各類評優評獎的投票,還可以用于單位的年度考核,整個過程實現無紙化,投票過程全程自動化,不受人工干預,做到了評選的公平公正。