安吉旺,徐凱宏
(東北林業大學 機電工程學院,哈爾濱 150040)
二維碼(Two dimensional Barcode)是在一維碼的基礎上,在垂直和水平兩個方向上進行的編碼和解碼。QR碼(Quick Response Code)作為矩陣式二維條碼的典型代表,是在一個矩形空間中通過不同黑、白像素的矩陣分布進行編碼。與其他二維碼相比,QR碼除了具有信息容量大、可靠性強,可表示漢字及圖像等多種文字信息等優點外,還可全方位識讀且識讀速度快[1]。因此,QR碼在各行各業中得到普遍應用。
一些領域,QR碼所包含信息不方便被無關組織、機構和個人隨意識讀,這就要求其在傳輸和存儲前進行相應的加密處理。在密碼學中,信息加密有很多種方法:序列密碼、分組密碼、公鑰密碼、哈希函數等[2],但在二維碼編碼技術中的應用卻很少,如用Rinjdael算法分別對信息原文、密鑰加密編碼得到二維碼A、B,A、B非功能區異或編碼得到二維碼C[3];QR碼二值圖像DES加密將原有規律排列的黑白相間區域變成雜亂無章的黑白區域,破壞了QR碼平面結構使無法識讀信息[4];結合編碼規則,先用PBE(Password Based Encryption)方法對數據信息加密再把密文編碼[5]。
本文結合RSA加密算法和編碼規則,通過改進加密過程在VC上實現對信息的雙重加密。
QR碼是由編碼區域和功能圖形組成一個正方形陣列。QR版本7符號結構圖如圖1所示。

圖1 QR碼符號的結構
QR編碼共分七個步驟:①數據分析:分析所輸入的數據流,確定要進行編碼的字符的類型。②數據編碼:針對不同數據模式將數據轉化成二進制位流,經碼字轉化最終形成碼字位流。③糾錯編碼:根據選定的符號標識和糾錯等級,將一組給定的數據碼字分成數據塊并計算相應數據塊的糾錯碼字。④構造最終信息:依次將每一塊的數據碼字和糾錯碼字裝配成最終序列碼字。最終編碼信息排放如圖2所示。⑤在矩陣中布置模塊:將上圖功能圖區的各個模塊一起加入矩陣。⑥掩模:將數據及糾錯碼區域內滿足條件的模塊定義為深色。⑦格式和版本信息:根據編碼格式和版本型號生成QR碼符號[1]。

圖2 編碼信息排放
QR編碼算法公開且編、譯碼軟件應用普遍,未加密的QR碼很容易被識別。將加密引入到二維碼技術中,對于食品安全、票務管理、貴重物品防偽等方面都有很大的幫助,這也促進了二維碼技術的普及。
RSA密碼體制是由Rivest,Shamir,Adleman于1978年提出的基于數論理論的公鑰密碼體制,是目前應用最廣泛的公鑰密碼體制。加密體制如下:
密鑰生成:用戶任意選取兩個大素數(大于500比特)p、q,計算公式:
n=pqφ(n)=(p-1)(q-1)。
(1)
隨機選取一個整數e:1≤e<φ(n)且e與φ(n)互質。通常先選定e,再找出并確定p,q。求解私鑰d:1 for(i=0;i { j=i*e%k; if(j==1) { printf(“%d”i); printf(“
”); } } 其中,n為運算模數,e為加密指數,d為解密指數。在編碼過程中 為非公開的私鑰,信息接收端若要獲取加密信息必須申請私鑰。 加密算法:首先將明文分組,每組長度小于log2n。使用公鑰 解密算法:在知道私鑰k的情況下解密密文c得到明文m:m=cdmodn。 此算法是采用輸入密鑰k加密明文m使其轉化成可視字符的算法。算法規則如下: 加密算法:獲取明文m、密鑰k,明文和密鑰是以字符型輸入。將明文m按密鑰k的字符長度分段成,m1,m2,…,mn,若不能整除則加入填充符“ ”。分別自密鑰k和每段數據符mi的首字節開始提取字節數值k1、k2。通過Ci=((k1+k2+512)mod 95)+32(實驗證明漢字字符字節提取值為負值)運算將明文字符mi轉化成ASCⅡ碼表中32~126之間的可視字符c1,c2,…cn。加密過程中(k1+k2+512)/95的值加32同樣轉化成ASCⅡ碼表中32-126之間的可視字符q1,q2,…qn,最后得到密文 c=c1,q1,c2,q2,…cn,qn。 解密算法:解密是加密的逆過程,獲取密文c、輸入正確的密鑰k,明文和密鑰是以字符型輸入。先提取密文c中的q1,q2,…qn,將密文剩余信息密鑰k的字符長度分段成c1,c2,…cn(此時密文c必被整除)。分別自密鑰k和每段數據符ci的首字節開始提取字節數值k1、k2。通過mi=k2+95*Q[n]-512-k1(Q[n]中存放加密過程中qi-32的值;i=1,2,…,n)運算最后得到明文m=mi,m2,…mn[2]。 圖3 雙重加密流程 為了不破壞QR碼的符號結構、降低糾錯能力及識讀效率,本文將加密算法作用于QR碼編解碼步驟中“數據編碼”步驟前,對原始數據進行加密,之后再將密文進行“數據編碼”直至生成QR符號。解碼則是編碼的逆過程。QR碼信息的雙重密算法流程為: (1)獲取要加密的明文信息(漢字、圖像、數字等),并將信息進行字符轉換,輸入加密口令。 (2)將明文信息字符采用加密口令Key進行密文C1; (3)對密令進行RSA算法加密生成C2; (4)設置密碼標志位,將密碼C2填充到C1當中形成最終密文C。 (5)對密文C進行數據分析和數據編碼,形成數據位流。 (6)對數據位流進行糾錯、掩膜等后續處理直至生成加密QR碼。 QR碼雙重加密解密的實現是采用C++語言編寫,在已有開源項目和基礎函數庫的基礎上進行的二次開發。本文在開源項目QR碼的編碼過程中編寫函數進行加密操作。 (1)提取明文信息。明文的形式有很多種,其中,最主要的是文本信息和圖像。加密所需的明文必須采用的字符串的格式,這就要求對所獲取的明文進行格式轉換。對于文本內容來說其本身就是字符串形式得,加密前只需獲取文本信息即可。對于圖像信息來說,加密編碼前需要對其進行圖形調整以達到相應的規格標準。 ①文本信息提取: CString strFilter= “TXT Files(*.txt)|*.txt|All Files(*.*)|*.*||”; CString strCon=“(TXT file)*.txt”; … m_strTxtFileName=fDlg.GetPathName(); ②圖像信息提取: strFilter=“Bitmap Files(*.bmp)|*.bmp|All Files(*.*)|*.*||”; strCon=“(Bitmap file)*.bmp”; … m_strBmpFileName=fDlg.GetPathName(); … sprintf(ss,“%s”,m_strBmpFileName.GetBuffer(256)); SizeDIB(ImgFileName,100,100);//調整圖像 (2)雙重加密。 ①口令key加密:將上面提取的文本信息TxtFile- Name、圖像信息ImgFileName,作為加密明文Source,在輸入口令Key的前提下進行加密。 CString CEncryptDlg∷Encrypt_Key(CString Source,CString Key) { … k1=pKey[j-1]; k2=pSource[j-1]; intk=k1+k2+512; div_Result=div(k,ENCRYPT_KEY); k=div_Result.rem; m=div_Result.quot; pMid[j-1]=k; strTarget[n]=k; DstrTarget[n]=m; n++; … i=0;x=0; for(j=0;j<2*n;j++) { if(j%2==0) sstrTarget[j]=strTarget[i++]+32; else sstrTarget[j]=DstrTarget[x++]+32; } … } ②RSA加密:對口令Key加密,將Key作為RSA加密算法的輸入m_Source wsprintf(pSource,“%s”,m_Source); iLen=m_Source.GetLength(); for(i=0;i { div_t div_Result; dw1=Exp(pSource[i],e,r); div_Result=div(dw1,r); pTarget[i]=div_Result.rem; //獲取密文 }//加密算法最關鍵是引用Exp()函數,是RAS加密的核心算法。 DWORD Exp(intk,inte,intr) {DWORD dwResult; div_tdiv_Result; dwResult=k; div_Result=div(dwResult,r); dwResult=div_Result.rem; for(inti=1;i {dwResult*=k; div_Result=div(dwResult,r);dwResult=div_Result.rem;} return(dwResult); (3)編碼函數 QR編碼只需在獲取加密密文后調用Qr_code編碼動態鏈接庫EnCodeQr.dll void BarCodeDlg::EnCoding() {… SetQrConFile(m_strConFileName);//設置QR配置文件 if(imgLen<1) … barname=EnQrText(m_strInfo);//將信息生成QR碼不含編碼信息結構 else … barname=MakeQrCode(TxtFileName,ImgFileName,“”);//將文本、圖形和其他信息合成生成QR碼,含編碼結構信息。} 本文采用漢字模式下“東北林業大學”為加密原文,編碼QR圖像如圖4所示,其中圖4(a)未加密,能夠采用普通識別軟件讀取,而圖4(b)、(c)、圖4(d)分別采用RSA、密令Key、RSA改進算法加密QR碼,必須采用專用識別軟件才能正確識讀。 圖4 不同加密方式下生成的二維碼 從QR碼加解密測試數據(見表1)可以看出,加解密軟件可正確識讀加密和未加密QR碼,而普通的識讀軟件對加密QR碼的正確識別率為0%。本實驗中若對“東北林業大學”進行單一RSA算法加密且公鑰e=101,其中求余運算1 224次、加法運算1 212次。采用本文的改進算法加密:求余運算417次、加法運算457次。通過對運算次數和加、解密時間的分析,新加密方法效率更高,安全性更強。另外新的加密方法:加密口令簡單、靈活,且由用戶掌握。對比加密前后的QR碼符,其結構并未改變,不影響QR碼的適度效率。 表1 QR碼加解密測試數據 RSA算法是基于分解大整數的困難性的加密,在管理密鑰方面算法優越,加密時公鑰更新容易,對外只需保密私鑰。但RSA算法計算復雜,其模正整數次冪運算需消耗大量時間,當進行大信息量加密時將嚴重影響加解密的執行效率。本文研究了QR碼編解碼規則和RSA改進加密算法,針對QR碼信息加密的缺陷,提出采用輸入口令加密原文信息、RSA算法加密口令的算法。通過實驗證明,本方法在未知私鑰的情況下采用普通識別軟件對QR碼的正確識別率為0%,既保證了信息的安全性又提高了加密的靈活性和提高了效率,具有很強的實用性,可得到廣泛應用。 【參 考 文 獻】 [1] 中國物品編碼中心,二維碼技術與應用[M].北京:中國計量出版社,2007. [2] 鄭 東,李祥學,黃 征.密碼學——密碼算法與協議[M].北京:電子工業出版社,2009. [3] 任勇金.基于Rijndeal和異或運算的QR二維碼雙重加密研究[J].華章,2012(29):338. [4] 劉彥偉,王根英,劉 云.QR碼信息加密的研究與實現[J].推廣與應用,2012,21(11):37-41. [5] 李 東.基于加密和解密的二維條形碼的實現[J].科學傳播,2010,(7):114-115.3 密令Key算法
4 雙重加密編碼編程實現
4.1 加密流程

4.2 QR碼加密實現
5 實驗及分析


6 結束語