安吉旺,徐凱宏
(東北林業(yè)大學(xué) 機(jī)電工程學(xué)院,哈爾濱 150040)
二維碼(Two dimensional Barcode)是在一維碼的基礎(chǔ)上,在垂直和水平兩個(gè)方向上進(jìn)行的編碼和解碼。QR碼(Quick Response Code)作為矩陣式二維條碼的典型代表,是在一個(gè)矩形空間中通過不同黑、白像素的矩陣分布進(jìn)行編碼。與其他二維碼相比,QR碼除了具有信息容量大、可靠性強(qiáng),可表示漢字及圖像等多種文字信息等優(yōu)點(diǎn)外,還可全方位識(shí)讀且識(shí)讀速度快[1]。因此,QR碼在各行各業(yè)中得到普遍應(yīng)用。
一些領(lǐng)域,QR碼所包含信息不方便被無關(guān)組織、機(jī)構(gòu)和個(gè)人隨意識(shí)讀,這就要求其在傳輸和存儲(chǔ)前進(jìn)行相應(yīng)的加密處理。在密碼學(xué)中,信息加密有很多種方法:序列密碼、分組密碼、公鑰密碼、哈希函數(shù)等[2],但在二維碼編碼技術(shù)中的應(yīng)用卻很少,如用Rinjdael算法分別對(duì)信息原文、密鑰加密編碼得到二維碼A、B,A、B非功能區(qū)異或編碼得到二維碼C[3];QR碼二值圖像DES加密將原有規(guī)律排列的黑白相間區(qū)域變成雜亂無章的黑白區(qū)域,破壞了QR碼平面結(jié)構(gòu)使無法識(shí)讀信息[4];結(jié)合編碼規(guī)則,先用PBE(Password Based Encryption)方法對(duì)數(shù)據(jù)信息加密再把密文編碼[5]。
本文結(jié)合RSA加密算法和編碼規(guī)則,通過改進(jìn)加密過程在VC上實(shí)現(xiàn)對(duì)信息的雙重加密。
QR碼是由編碼區(qū)域和功能圖形組成一個(gè)正方形陣列。QR版本7符號(hào)結(jié)構(gòu)圖如圖1所示。
圖1 QR碼符號(hào)的結(jié)構(gòu)
QR編碼共分七個(gè)步驟:①數(shù)據(jù)分析:分析所輸入的數(shù)據(jù)流,確定要進(jìn)行編碼的字符的類型。②數(shù)據(jù)編碼:針對(duì)不同數(shù)據(jù)模式將數(shù)據(jù)轉(zhuǎn)化成二進(jìn)制位流,經(jīng)碼字轉(zhuǎn)化最終形成碼字位流。③糾錯(cuò)編碼:根據(jù)選定的符號(hào)標(biāo)識(shí)和糾錯(cuò)等級(jí),將一組給定的數(shù)據(jù)碼字分成數(shù)據(jù)塊并計(jì)算相應(yīng)數(shù)據(jù)塊的糾錯(cuò)碼字。④構(gòu)造最終信息:依次將每一塊的數(shù)據(jù)碼字和糾錯(cuò)碼字裝配成最終序列碼字。最終編碼信息排放如圖2所示。⑤在矩陣中布置模塊:將上圖功能圖區(qū)的各個(gè)模塊一起加入矩陣。⑥掩模:將數(shù)據(jù)及糾錯(cuò)碼區(qū)域內(nèi)滿足條件的模塊定義為深色。⑦格式和版本信息:根據(jù)編碼格式和版本型號(hào)生成QR碼符號(hào)[1]。
圖2 編碼信息排放
QR編碼算法公開且編、譯碼軟件應(yīng)用普遍,未加密的QR碼很容易被識(shí)別。將加密引入到二維碼技術(shù)中,對(duì)于食品安全、票務(wù)管理、貴重物品防偽等方面都有很大的幫助,這也促進(jìn)了二維碼技術(shù)的普及。
RSA密碼體制是由Rivest,Shamir,Adleman于1978年提出的基于數(shù)論理論的公鑰密碼體制,是目前應(yīng)用最廣泛的公鑰密碼體制。加密體制如下:
密鑰生成:用戶任意選取兩個(gè)大素?cái)?shù)(大于500比特)p、q,計(jì)算公式:
n=pqφ(n)=(p-1)(q-1)。
(1)
隨機(jī)選取一個(gè)整數(shù)e:1≤e<φ(n)且e與φ(n)互質(zhì)。通常先選定e,再找出并確定p,q。求解私鑰d:1 for(i=0;i { j=i*e%k; if(j==1) { printf(“%d”i); printf(“
”); } } 其中,n為運(yùn)算模數(shù),e為加密指數(shù),d為解密指數(shù)。在編碼過程中 為非公開的私鑰,信息接收端若要獲取加密信息必須申請(qǐng)私鑰。 加密算法:首先將明文分組,每組長度小于log2n。使用公鑰 解密算法:在知道私鑰k的情況下解密密文c得到明文m:m=cdmodn。 此算法是采用輸入密鑰k加密明文m使其轉(zhuǎn)化成可視字符的算法。算法規(guī)則如下: 加密算法:獲取明文m、密鑰k,明文和密鑰是以字符型輸入。將明文m按密鑰k的字符長度分段成,m1,m2,…,mn,若不能整除則加入填充符“ ”。分別自密鑰k和每段數(shù)據(jù)符mi的首字節(jié)開始提取字節(jié)數(shù)值k1、k2。通過Ci=((k1+k2+512)mod 95)+32(實(shí)驗(yàn)證明漢字字符字節(jié)提取值為負(fù)值)運(yùn)算將明文字符mi轉(zhuǎn)化成ASCⅡ碼表中32~126之間的可視字符c1,c2,…cn。加密過程中(k1+k2+512)/95的值加32同樣轉(zhuǎn)化成ASCⅡ碼表中32-126之間的可視字符q1,q2,…qn,最后得到密文 c=c1,q1,c2,q2,…cn,qn。 解密算法:解密是加密的逆過程,獲取密文c、輸入正確的密鑰k,明文和密鑰是以字符型輸入。先提取密文c中的q1,q2,…qn,將密文剩余信息密鑰k的字符長度分段成c1,c2,…cn(此時(shí)密文c必被整除)。分別自密鑰k和每段數(shù)據(jù)符ci的首字節(jié)開始提取字節(jié)數(shù)值k1、k2。通過mi=k2+95*Q[n]-512-k1(Q[n]中存放加密過程中qi-32的值;i=1,2,…,n)運(yùn)算最后得到明文m=mi,m2,…mn[2]。 圖3 雙重加密流程 為了不破壞QR碼的符號(hào)結(jié)構(gòu)、降低糾錯(cuò)能力及識(shí)讀效率,本文將加密算法作用于QR碼編解碼步驟中“數(shù)據(jù)編碼”步驟前,對(duì)原始數(shù)據(jù)進(jìn)行加密,之后再將密文進(jìn)行“數(shù)據(jù)編碼”直至生成QR符號(hào)。解碼則是編碼的逆過程。QR碼信息的雙重密算法流程為: (1)獲取要加密的明文信息(漢字、圖像、數(shù)字等),并將信息進(jìn)行字符轉(zhuǎn)換,輸入加密口令。 (2)將明文信息字符采用加密口令Key進(jìn)行密文C1; (3)對(duì)密令進(jìn)行RSA算法加密生成C2; (4)設(shè)置密碼標(biāo)志位,將密碼C2填充到C1當(dāng)中形成最終密文C。 (5)對(duì)密文C進(jìn)行數(shù)據(jù)分析和數(shù)據(jù)編碼,形成數(shù)據(jù)位流。 (6)對(duì)數(shù)據(jù)位流進(jìn)行糾錯(cuò)、掩膜等后續(xù)處理直至生成加密QR碼。 QR碼雙重加密解密的實(shí)現(xiàn)是采用C++語言編寫,在已有開源項(xiàng)目和基礎(chǔ)函數(shù)庫的基礎(chǔ)上進(jìn)行的二次開發(fā)。本文在開源項(xiàng)目QR碼的編碼過程中編寫函數(shù)進(jìn)行加密操作。 (1)提取明文信息。明文的形式有很多種,其中,最主要的是文本信息和圖像。加密所需的明文必須采用的字符串的格式,這就要求對(duì)所獲取的明文進(jìn)行格式轉(zhuǎn)換。對(duì)于文本內(nèi)容來說其本身就是字符串形式得,加密前只需獲取文本信息即可。對(duì)于圖像信息來說,加密編碼前需要對(duì)其進(jìn)行圖形調(diào)整以達(dá)到相應(yīng)的規(guī)格標(biāo)準(zhǔn)。 ①文本信息提?。?/p> CString strFilter= “TXT Files(*.txt)|*.txt|All Files(*.*)|*.*||”; CString strCon=“(TXT file)*.txt”; … m_strTxtFileName=fDlg.GetPathName(); ②圖像信息提?。?/p> 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);//調(diào)整圖像 (2)雙重加密。 ①口令key加密:將上面提取的文本信息TxtFile- Name、圖像信息ImgFileName,作為加密明文Source,在輸入口令Key的前提下進(jìn)行加密。 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加密:對(duì)口令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; //獲取密文 }//加密算法最關(guān)鍵是引用Exp()函數(shù),是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)編碼函數(shù) QR編碼只需在獲取加密密文后調(diào)用Qr_code編碼動(dòng)態(tài)鏈接庫EnCodeQr.dll void BarCodeDlg::EnCoding() {… SetQrConFile(m_strConFileName);//設(shè)置QR配置文件 if(imgLen<1) … barname=EnQrText(m_strInfo);//將信息生成QR碼不含編碼信息結(jié)構(gòu) else … barname=MakeQrCode(TxtFileName,ImgFileName,“”);//將文本、圖形和其他信息合成生成QR碼,含編碼結(jié)構(gòu)信息。} 本文采用漢字模式下“東北林業(yè)大學(xué)”為加密原文,編碼QR圖像如圖4所示,其中圖4(a)未加密,能夠采用普通識(shí)別軟件讀取,而圖4(b)、(c)、圖4(d)分別采用RSA、密令Key、RSA改進(jìn)算法加密QR碼,必須采用專用識(shí)別軟件才能正確識(shí)讀。 圖4 不同加密方式下生成的二維碼 從QR碼加解密測(cè)試數(shù)據(jù)(見表1)可以看出,加解密軟件可正確識(shí)讀加密和未加密QR碼,而普通的識(shí)讀軟件對(duì)加密QR碼的正確識(shí)別率為0%。本實(shí)驗(yàn)中若對(duì)“東北林業(yè)大學(xué)”進(jìn)行單一RSA算法加密且公鑰e=101,其中求余運(yùn)算1 224次、加法運(yùn)算1 212次。采用本文的改進(jìn)算法加密:求余運(yùn)算417次、加法運(yùn)算457次。通過對(duì)運(yùn)算次數(shù)和加、解密時(shí)間的分析,新加密方法效率更高,安全性更強(qiáng)。另外新的加密方法:加密口令簡單、靈活,且由用戶掌握。對(duì)比加密前后的QR碼符,其結(jié)構(gòu)并未改變,不影響QR碼的適度效率。 表1 QR碼加解密測(cè)試數(shù)據(jù) RSA算法是基于分解大整數(shù)的困難性的加密,在管理密鑰方面算法優(yōu)越,加密時(shí)公鑰更新容易,對(duì)外只需保密私鑰。但RSA算法計(jì)算復(fù)雜,其模正整數(shù)次冪運(yùn)算需消耗大量時(shí)間,當(dāng)進(jìn)行大信息量加密時(shí)將嚴(yán)重影響加解密的執(zhí)行效率。本文研究了QR碼編解碼規(guī)則和RSA改進(jìn)加密算法,針對(duì)QR碼信息加密的缺陷,提出采用輸入口令加密原文信息、RSA算法加密口令的算法。通過實(shí)驗(yàn)證明,本方法在未知私鑰的情況下采用普通識(shí)別軟件對(duì)QR碼的正確識(shí)別率為0%,既保證了信息的安全性又提高了加密的靈活性和提高了效率,具有很強(qiáng)的實(shí)用性,可得到廣泛應(yīng)用。 【參 考 文 獻(xiàn)】 [1] 中國物品編碼中心,二維碼技術(shù)與應(yīng)用[M].北京:中國計(jì)量出版社,2007. [2] 鄭 東,李祥學(xué),黃 征.密碼學(xué)——密碼算法與協(xié)議[M].北京:電子工業(yè)出版社,2009. [3] 任勇金.基于Rijndeal和異或運(yùn)算的QR二維碼雙重加密研究[J].華章,2012(29):338. [4] 劉彥偉,王根英,劉 云.QR碼信息加密的研究與實(shí)現(xiàn)[J].推廣與應(yīng)用,2012,21(11):37-41. [5] 李 東.基于加密和解密的二維條形碼的實(shí)現(xiàn)[J].科學(xué)傳播,2010,(7):114-115.3 密令Key算法
4 雙重加密編碼編程實(shí)現(xiàn)
4.1 加密流程
4.2 QR碼加密實(shí)現(xiàn)
5 實(shí)驗(yàn)及分析
6 結(jié)束語