摘? 要:QR二維碼因成本低、存儲(chǔ)容量大、存儲(chǔ)范圍廣等特點(diǎn),已經(jīng)是世界上應(yīng)用最廣泛的二維碼之一。本文探討了基于AES算法對(duì)QR二維碼進(jìn)行加密、解密的設(shè)計(jì),并使用Java語(yǔ)言對(duì)這一設(shè)計(jì)進(jìn)行了實(shí)現(xiàn),以增強(qiáng)QR二維碼在流通、傳播過(guò)程中的安全性。
關(guān)鍵詞:信息安全;AES加密算法;QR二維碼;Java
中圖分類號(hào):TP391.44;TP309? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2019)21-0144-03
Abstract:QR two-dimensional code is one of the most widely used two-dimensional codes in the world because of its low cost,large storage capacity and wide storage range. This paper discusses the design of encrypting and decrypting QR two-dimensional codes based on AES algorithm,and implements the design in Java language to enhance the security of QR two-dimensional codes in the process of circulation and transmission.
Keywords:information security;AES encryption algorithm;QR two-dimensional code;Java
1? 概述
隨著我國(guó)移動(dòng)互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,以QR碼為代表的二維碼信息存儲(chǔ)、傳輸和識(shí)別技術(shù)以其無(wú)可替代的高效性、靈活性及低成本等特點(diǎn),在移動(dòng)支付、信息共享等日常生活的中迅速普及。然而,利用二維碼傳播計(jì)算機(jī)木馬、病毒,以及盜竊用戶個(gè)人信息,導(dǎo)致隱私泄露等問(wèn)題也屢見(jiàn)不鮮??梢钥吹剑诤芏囝I(lǐng)域中,二維碼信息安全都是一個(gè)不可忽視、也無(wú)法回避的問(wèn)題,二維碼的安全和保密問(wèn)題也越來(lái)越有研究?jī)r(jià)值[1]。本文探討了一種通過(guò)利用AES加密算法對(duì)QR二維碼進(jìn)行加密的方式來(lái)提高二維碼信息安全的方法。
2? QR碼簡(jiǎn)介
QR碼(Quick Response Code)是由日本DENSO WAVE公司于1994年推出的一種矩陣二維碼編碼方式,也是目前世界上使用最廣泛的二維碼編碼方式之一。QR碼不僅具有存儲(chǔ)信息量大、成本低、誤碼率低等一些二維碼的共通特點(diǎn),還具有全方位快速識(shí)別,可以對(duì)包括漢字在內(nèi)的各種文字、圖形、圖像等幾乎所有數(shù)字媒體進(jìn)行編碼等優(yōu)點(diǎn)。根據(jù)ISO標(biāo)準(zhǔn)規(guī)定,QR碼由包含位置探測(cè)圖形、分隔符、定位圖形、校正圖形的功能區(qū)和包含格式信息、版本信息、數(shù)據(jù)和糾錯(cuò)碼在內(nèi)的編碼區(qū)兩部分組成。功能圖形區(qū)負(fù)責(zé)定位圖像、識(shí)別特定圖像等,不含有數(shù)據(jù)信息;編碼區(qū)主要用于保存數(shù)據(jù)信息和版本、格式信息,也提供糾錯(cuò)功能[2]。QR碼版本7的符號(hào)結(jié)構(gòu)示意圖如圖1所示[3]。
如圖1所示,QR碼的控制信息中本身并沒(méi)有對(duì)數(shù)據(jù)信息進(jìn)行加密,且由于QR碼編碼解碼的算法本身是公開(kāi)的,其所攜帶的信息如果被無(wú)關(guān)的組織、機(jī)構(gòu)或是個(gè)人隨意讀取,很容易造成不必要的信息泄露、隱私曝光。在以QR碼為媒介進(jìn)行敏感信息傳遞時(shí),需要有一種簡(jiǎn)單、快速、有效的加密手段。
3? AES算法原理
作為DES算法的升級(jí)替代,AES算法(Advanced En-cryption Standard)自2000年正式公布以來(lái),其安全、可靠、簡(jiǎn)單、快速的特性已被多方分析研究檢證。作為當(dāng)前最為常見(jiàn)的對(duì)稱加密算法之一,在全世界范圍內(nèi)有著廣泛的應(yīng)用。AES算法加密的數(shù)據(jù)塊和密鑰長(zhǎng)度相同,分為16字節(jié)、24字節(jié)和32字節(jié)三種。密鑰越長(zhǎng),其加密的輪次越多,安全性也越強(qiáng)。下面以16字節(jié)密鑰為例,對(duì)AES算法原理進(jìn)行簡(jiǎn)單說(shuō)明[4]。
AES算法在加密時(shí)的輸入包括同為16字節(jié)的明文和密鑰,輸出為16字節(jié)的密文。明文和密鑰都可以被看作是一個(gè)4*4的字節(jié)矩陣。算法包括密鑰擴(kuò)展(KeyExpansion)、輪密鑰加(AddRoundKey)、字節(jié)替換(SubBYtes)、行移位(ShiftRows)、列混淆(MixColumns)等步驟。
(1)密鑰擴(kuò)展:通過(guò)一個(gè)混合操作將初始密鑰擴(kuò)展成多個(gè)16字節(jié)的輪密鑰,供后面的輪加密使用;
(2)輪密鑰加:當(dāng)前狀態(tài)與輪密鑰進(jìn)行按位XOR異或運(yùn)算;
(3)字節(jié)替換:利用一個(gè)S盒完成一個(gè)狀態(tài)到下一狀態(tài)中字節(jié)的一一映射;
(4)行移位:將狀態(tài)中的每行分別向左偏移0,1,2,3個(gè)字節(jié);
(5)列混淆:將狀態(tài)中的每列獨(dú)立操作,與一個(gè)固定的多項(xiàng)式進(jìn)行模乘,使每列中的每個(gè)字節(jié)都被映射為一個(gè)新的值。
加密的過(guò)程如圖2所示。輸入的密鑰經(jīng)過(guò)密鑰擴(kuò)展,與明文做第一次輪密鑰加。之后按照字節(jié)替代、行移位、列混淆、輪密鑰加的順序完成一輪的加密,加密的中間結(jié)果稱為狀態(tài)(State)。中間狀態(tài)和相對(duì)應(yīng)輪的輪密鑰繼續(xù)進(jìn)行重復(fù)的多輪次變換(16字節(jié)密鑰為10輪,其中最終輪不需要列混淆),最終達(dá)到高強(qiáng)度的加密效果,輸出最終的密文。
解密過(guò)程輸入16字節(jié)密文,使用與加密過(guò)程中相同的密鑰,運(yùn)算過(guò)程與加密相反,如圖2所示,其中使用的S盒的字節(jié)替代、線性變換的行移位和列混淆均為原運(yùn)算方式的逆向運(yùn)算。同樣地,對(duì)應(yīng)著加密的最終輪,最先進(jìn)行的解密輪次也不需要進(jìn)行逆向列混淆。經(jīng)過(guò)總共10輪的變換,輸出16字節(jié)明文,達(dá)到解密的目的。
4? 應(yīng)用AES算法對(duì)QR二維碼加密解密
基本思路是在QR二維碼編碼前,應(yīng)用AES算法對(duì)原始數(shù)據(jù)進(jìn)行加密。再對(duì)密文進(jìn)行QR碼編碼,這樣即使該QR二維碼在傳播過(guò)程中被不相干的組織或者個(gè)人獲取,也無(wú)法破譯。需要獲取該二維碼信息時(shí),在讀取QR碼前,輸入與加密時(shí)相同的密鑰,即可獲取到原始的信息。
限于篇幅,本文只展示加密過(guò)程實(shí)現(xiàn)的主要代碼。
4.1? 加密過(guò)程的實(shí)現(xiàn)
(1)手動(dòng)輸入的密鑰安全性低,且長(zhǎng)度不容易控制,這里選擇通過(guò)KeyGenerator類生成128位的隨機(jī)源,再轉(zhuǎn)換成AES算法可用的原始對(duì)稱密鑰的方式來(lái)創(chuàng)建密鑰,并對(duì)該密鑰進(jìn)行保存,以備解密使用。
KeyGenerator keyGenerator;// 生成key
keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);//生成一個(gè)128位的隨機(jī)源
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();//產(chǎn)生原始對(duì)稱密鑰
Key key = new SecretKeySpec(keyBytes, "AES");
(2)以字節(jié)數(shù)組形式獲取待加密的明文數(shù)據(jù),并對(duì)明文數(shù)據(jù)進(jìn)行AES算法加密。
Stingcontext = "測(cè)試內(nèi)容";//待加密明文
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(cipher.ENCRYPT_MODE,key);//指定加密模式,輸入密鑰
byte[] resultAes = cipher.doFinal(context.getBytes());
(3)得到的密文通過(guò)ZXing類庫(kù)提供的編碼模塊進(jìn)行QR二維碼編碼,并將結(jié)果以png格式寫入指定的文件中保存。
Hashtable hintsAes = new Hashtable();//創(chuàng)建QR編碼參數(shù)的哈希表
hintsAes.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrixAes = new MultiFormatWriter ().encode(new String(resultAes), BarcodeFormat.QR_CODE, 300, 300, hintsAes);//輸入密文,執(zhí)行QR碼編碼
File outputFileAes = new File("d:" + File.separator + "QRPictureAes.png");
QRUtil.writeToFile(bitMatrixAes, "png", output FileAes);
4.2? 解密過(guò)程
(1)通過(guò)移動(dòng)設(shè)備攝像、外部圖片導(dǎo)入等方式,將保存的圖片以比特流的形式讀入系統(tǒng);
(2)利用ZXing類庫(kù)提供的解碼模塊,對(duì)讀入的QR二維碼進(jìn)行解碼,得到AES算法加密后的密文;
(3)輸入與加密時(shí)相同的16字節(jié)密鑰,對(duì)密文形式的QR二維碼利用AES算法進(jìn)行解密,得到最終的明文結(jié)果。
根據(jù)圖3和圖4的對(duì)比可以看出,雖然同樣使用的是QR二維碼編碼,但是經(jīng)過(guò)AES加密可形成完全不同的圖形編碼。對(duì)圖4經(jīng)過(guò)AES算法加密后的QR碼進(jìn)行識(shí)別,其結(jié)果如圖5所示,讀取到加密后的密文在不知道密鑰的前提下幾乎無(wú)法破譯。用相應(yīng)的密鑰對(duì)圖4中加密后的QR碼進(jìn)行解密,解密后的識(shí)別結(jié)果如圖6所示,利用正確密鑰對(duì)經(jīng)過(guò)AES算法加密的QR碼解密,則可以快速地還原出原始的數(shù)據(jù)。
5? 結(jié)? 論
本文對(duì)QR二維碼與AES算法的基本原理進(jìn)行了歸納總結(jié),并提出了在QR二維碼編碼前,生成隨機(jī)密鑰對(duì)原始數(shù)據(jù)使用AES算法加密的方法,將QR二維碼生成識(shí)別與AES加密算法兩種技術(shù)合理有效地結(jié)合起來(lái),是對(duì)二維碼存儲(chǔ)、傳播、識(shí)別過(guò)程中存在的信息安全問(wèn)題的一種快速、簡(jiǎn)單的解決方案,并且利用Java語(yǔ)言對(duì)該方案進(jìn)行實(shí)現(xiàn),為進(jìn)一步深入研究實(shí)現(xiàn)更加靈活高效的QR二維碼信息安全提供了思路,具有一定的研究?jī)r(jià)值和較強(qiáng)的實(shí)用性。
參考文獻(xiàn):
[1] 單利安.QR二維碼水印加密及解密算法研究 [J].無(wú)線互聯(lián)科技,2013(10):122-123.
[2] 李逢玲,鄭飛.RSA加密算法在QR二維碼上的應(yīng)用探討 [J].中小企業(yè)管理與科技(上旬刊),2014(11):207-208.
[3] 張定會(huì),單俊濤,江平.QR碼DES加密與解密 [J].數(shù)據(jù)通信,2011(3):40-42.
[4] 陳彥龍,楊立波.AES算法的研究與實(shí)現(xiàn) [J].中國(guó)科教創(chuàng)新導(dǎo)刊,2012(28):34+36.
作者簡(jiǎn)介:李震(1985-),男,漢族,湖南隆回人,專職教師,助教,碩士研究生,研究方向:信息系統(tǒng)開(kāi)發(fā)、軟件工程。