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