鄭 東,常曉陽,楊中皇
(1.西安郵電大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院,陜西 西安 710121;2.西安郵電大學(xué) 通信與信息工程學(xué)院,陜西 西安 710121)
Android手機(jī)操作系統(tǒng)因其操作快捷、應(yīng)用眾多等優(yōu)點(diǎn),目前市場占有率已達(dá)到72.21%[1]。根據(jù)Android系統(tǒng)的開源性特點(diǎn),通過修改Android開源項(xiàng)目(Android Open Source Project,AOSP),可實(shí)現(xiàn)個(gè)性化定制。但是,也正是由于Android開源性的這一特點(diǎn),使得Android終端上存儲的用戶隱私數(shù)據(jù)面臨著巨大的安全風(fēng)險(xiǎn)。
隨著使用移動設(shè)備用戶的增加,數(shù)據(jù)安全作為信息安全的重要組成部分,已成為關(guān)系到國家安全的重要因素[2]。市場上的移動智能設(shè)備中所采用的核心密碼算法均來自美國的高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES)、RSA加密算法和安全散列算法(Secure Hash Algorithm,SHA)等,這些算法不符合中國的商用密碼規(guī)范,且隨著硬件處理速度和解密手段的不斷提高,安全性也面臨嚴(yán)重挑戰(zhàn)[3]。同時(shí),移動智能設(shè)備用戶的資料預(yù)設(shè)儲存在國外,存在數(shù)據(jù)安全和隱私泄露風(fēng)險(xiǎn),難以保護(hù)中國消費(fèi)者的隱私[4]。國家密碼管理局也公布了國產(chǎn)密碼算法,應(yīng)用較為廣泛的有SM2橢圓曲線公鑰密碼算法、SM3密碼雜湊算法和SM4分組密碼算法等3種國家商用密碼算法[5]。
目前,國密算法基于Android系統(tǒng)的研究成果眾多,主要有:對移動設(shè)備的遠(yuǎn)程管理系統(tǒng),通過管理移動設(shè)備功能與權(quán)限,防止惡意者竊取重要數(shù)據(jù),提高移動設(shè)備的安全性[6];對Android文件的完整性檢測,利用SM3密碼雜湊算法計(jì)算文件的哈希值,并比較同一個(gè)文件不同時(shí)刻的哈希值,以此判斷文件的完整性[7];對Android惡意軟件的檢測,使用SM3密碼雜湊算法對Android應(yīng)用程序包(Android Application Package,APK)進(jìn)行完整性計(jì)算,得到其Hash值,并與服務(wù)器中正確的Hash值進(jìn)行比較,若兩個(gè)Hash值不一致,則說明此APK程序已被篡改,可以卸載[8]。但是,上述國密算法大多是通過Java和C語言在Android內(nèi)核實(shí)現(xiàn),執(zhí)行效率有待于提高。
為了有效地保護(hù)Android移動終端設(shè)備上用戶隱私數(shù)據(jù)安全,通過使用執(zhí)行效率更高的匯編語言,完成SM4分組密碼算法在Android系統(tǒng)的匯編語言嵌入設(shè)計(jì),以期提高Android系統(tǒng)的加密效能。
Android系統(tǒng)采用分層的架構(gòu)[9],由下到上依次是Linux內(nèi)核層、系統(tǒng)運(yùn)行庫層、應(yīng)用程序框架層和應(yīng)用程序?qū)?。最底層的Linux內(nèi)核層是存在于硬件與軟件之間的抽象層,為Android設(shè)備的各種硬件提供底層驅(qū)動。系統(tǒng)運(yùn)行庫層也稱作“C庫層”,此層為系統(tǒng)提供正常運(yùn)轉(zhuǎn)的各個(gè)基礎(chǔ)庫都是用C/C++編寫,是連接Linux內(nèi)核層和應(yīng)用程序框架層的重要橋梁。應(yīng)用程序框架層被稱為“Java庫層”,也是因?yàn)榇藢又懈鱾€(gè)組件均由Java語言編寫而成。這一層主要是為應(yīng)用程序?qū)犹峁└鱾€(gè)應(yīng)用接口供研究使用。最上層的應(yīng)用程序?qū)觿t是Android系統(tǒng)的用戶應(yīng)用層,主要包括系統(tǒng)提供的桌面、撥打電話、通訊錄、瀏覽器和日歷等基本應(yīng)用程序,還有用戶自行安裝的第三方應(yīng)用程序。Android系統(tǒng)架構(gòu)如圖1所示。
圖1 Android系統(tǒng)架構(gòu)
Android系統(tǒng)的加密機(jī)制基于Java加密體系結(jié)構(gòu)(Java Cryptography Architecture,JCA),其可將安全功能集成到Android應(yīng)用程序中。JCA提供了一個(gè)可擴(kuò)展的加密服務(wù)程序框架和一組應(yīng)用程序接口[10](Application Programming Interface,API),支持?jǐn)?shù)字簽名、消息摘要和加密等主要密碼算法。JCA的設(shè)計(jì)具有算法獨(dú)立性和可擴(kuò)展性及實(shí)施獨(dú)立性和互操作性兩個(gè)特點(diǎn)。其中,算法獨(dú)立性和實(shí)施獨(dú)立性可以互補(bǔ)使用,即JCA提供算法對應(yīng)的API接口,可以指定具體的實(shí)現(xiàn)。通過定義密碼“引擎”的類型為密碼服務(wù)提供接口,主要接口有MessageDigest、Signature、KeyFactory、KeyPairGenerator和Cipher類,分別為Android系統(tǒng)提供消息摘要、數(shù)字簽名與驗(yàn)證、密鑰存儲與管理,以及數(shù)據(jù)的加解解密等服務(wù)[11]。
F(X0,X1,X2,X3,Rj)=X0⊕T(X1⊕X2⊕X3⊕Rj)
(1)
其中,T(·)=L[τ(·)],T為非線性函數(shù)τ以及線性函數(shù)L組合函數(shù),非線性函數(shù)τ是由4個(gè)并行的S盒構(gòu)成[15]。
由式(1)可得加密變換的表達(dá)式為
Xj+4=F(Xj,Xj+1,Xj+2,Xj+3,Rj)=Xj⊕T(Xj+1⊕Xj+2⊕Xj+3⊕Rj)(Y0,Y1,Y2,Y3)=P(X32,X33,X34,X35)=(X35,X34,X33,X32)
其中,P為反序變換。
(b0,b1,b2,b3)=τ(A)=[S(a0),S(a1),S(a2),S(a3)]
O=L(B)=B⊕(B<<<2)⊕(B<<<10)⊕ (B<<<18)⊕(B<<<24)
密鑰擴(kuò)展算法是對128比特的根密鑰進(jìn)行一系列變換從而產(chǎn)生輪密鑰的過程。用于密鑰擴(kuò)展算法的系統(tǒng)參數(shù)D=(D0,D1,D2,D3),其取值采用16進(jìn)制,可表示為
D0=(A3B1BAC6)D1=(56AA3350)D2=(677D9197)D3=(B27022DC)
固定參數(shù)C=(C0,C1,……,C31),設(shè)Cj,i為Cj的第i字節(jié),即
設(shè)加密密鑰M=(M0,M1,M2,M3),長度為128比特,每一輪的輪密鑰由加密密鑰生成。將系統(tǒng)參數(shù)D與加密密鑰M異或,得到
(K0,K1,K2,K3)= (D0⊕M0,D1⊕M1,D2⊕M2,D3⊕M3)
則輪密鑰
Rj=Kj+4=Kj⊕T′(Kj+1⊕Kj+2⊕Kj+3⊕Cj)
T′與輪函數(shù)中的T基本相同,只需將線性函數(shù)L置換成L′,即
L′(B)=B⊕(B<<<13)⊕(B<<<23)
將SM4國密算法添加至Android 9.0源代碼中,為Android用戶提供隱私加密服務(wù),從而實(shí)現(xiàn)系統(tǒng)安全以及保護(hù)用戶隱私。首先,對SM4算法進(jìn)行匯編語言設(shè)計(jì)與實(shí)現(xiàn)。其次,從清華鏡像網(wǎng)站上下載Android 9.0源碼,并獲取Android設(shè)備的root權(quán)限。最后,通過編譯源碼生成合法動態(tài)庫,將其刷入Android手機(jī),使得SM4國密算法的匯編語言在Android系統(tǒng)得以實(shí)現(xiàn)。
在匯編程序設(shè)計(jì)中,代碼量較大,SM4算法進(jìn)行匯編語言的實(shí)現(xiàn)時(shí),需秉持以下4條原則。
1)減少代碼量,將不必要的語句刪除或使用一條指令將兩條及以上的語句進(jìn)行合并。
2)減少程序中的跳轉(zhuǎn)指令,將32次for循環(huán)中子程序的跳轉(zhuǎn)指令省去,直接將子程序加入for循環(huán)中,這樣就可以減少32次跳轉(zhuǎn)。
3)將代碼中相同部分的指令段進(jìn)行合并使用,減少不必要的重復(fù)。
4)在算法實(shí)現(xiàn)中,減少循環(huán)移位函數(shù)的使用,將其使用循環(huán)移位指令直接實(shí)現(xiàn)相關(guān)移位操作。
通過以上原則,將代碼進(jìn)行最大程度地優(yōu)化,代碼所占States周期越少,說明其優(yōu)化程度越高,算法加密效率就更加高效。
將SM4算法中的加解密運(yùn)算和密鑰擴(kuò)展算法進(jìn)行模塊化實(shí)現(xiàn),再將各個(gè)模塊進(jìn)行整合,從而實(shí)現(xiàn)SM4算法的匯編語言程序。以生成輪密鑰的函數(shù)為例,M[*]∧D[*]、for循環(huán)和S盒等部分匯編代碼的實(shí)現(xiàn)過程如下。
1)M[*]∧D[*]。依次取出固定地址sp+0x90、sp+0x94、sp+0x98和sp+0x9c處的M[0]~M[3]和固定參數(shù)D[0]~D[3]的值,將M[*]中的值與D[*]中的值分別進(jìn)行異或處理操作,再將異或后的值K[*]存儲到sp處的地址。
2)for循環(huán)。分別取出存儲在sp地址處的值K[*],將其與固定參數(shù)C[*]的值進(jìn)行異或運(yùn)算,之后跳轉(zhuǎn)進(jìn)入sm4CalciRK子函數(shù)進(jìn)行后續(xù)運(yùn)算,通過一系列運(yùn)算操作后得到K[j+4]的值,繼續(xù)參與循環(huán)運(yùn)算。
3)S盒。將S盒中的數(shù)據(jù)以十六進(jìn)制形式存儲在固定地址,在進(jìn)行運(yùn)算時(shí),直接在固定地址處進(jìn)行調(diào)用。
借助第三方鏡像網(wǎng)站下載獲得Android 9.0源碼,再對源碼進(jìn)行編譯。完整的Android源碼大小相對較大,為避免編譯過程中出現(xiàn)中途失敗的情況,硬件設(shè)備需具有較大的內(nèi)存空間和運(yùn)行速度,以確保編譯成功。編譯時(shí)還存在配置環(huán)境、插件匹配等問題,在解決各種問題后,最終成功將源碼編譯,生成系統(tǒng)鏡像文件,將其刷入Android設(shè)備,對底層系統(tǒng)文件進(jìn)行加密保護(hù)。系統(tǒng)實(shí)現(xiàn)如圖2所示。
圖2 系統(tǒng)實(shí)現(xiàn)
為了確保SM4國密算法的準(zhǔn)確性,設(shè)計(jì)一款應(yīng)用程序驗(yàn)證SM4算法源碼的正確性。首先,在應(yīng)用程序中驗(yàn)證Java和C語言代碼,再將成功編譯的SM4密碼算法的匯編語言代碼加入原生程序開發(fā)包(Native Development Kit,NDK)中,驗(yàn)證算法的匯編代碼的正確性。SM4加密/解密成功的驗(yàn)證結(jié)果分別如圖3和圖4所示。
圖3 SM4加密算法驗(yàn)證結(jié)果
圖4 SM4解密算法驗(yàn)證結(jié)果
在NDK中結(jié)合JNI (Java Native Interface) 技術(shù)編譯出包含SM4國密算法的動態(tài)庫“l(fā)ibJNI_SM4.so”,在Ubuntu系統(tǒng)上使用Android調(diào)試橋(Android Debug Bridge,ADB)工具在命令行輸入“#adb push libJNI_SM4.so /system/lib64”命令,將.so動態(tài)庫放入Android設(shè)備系統(tǒng)文件中的/system/lib64目錄下,使.so動態(tài)庫嵌入到Android內(nèi)核,為底層系統(tǒng)提供更加高效的加密服務(wù),最終實(shí)現(xiàn)保護(hù)用戶個(gè)人隱私的目的。將設(shè)計(jì)的應(yīng)用程序刷到系統(tǒng)鏡像中,通過在源碼中加入相關(guān)源文件,再次重新編譯,輸出文件夾中會生成包含應(yīng)用程序的新system.img鏡像文件,沒有高級權(quán)限的一般用戶不能卸載此應(yīng)用,只有擁有Root權(quán)限的用戶才能對系統(tǒng)文件進(jìn)行安裝和更改等操作。
在Linux操作系統(tǒng)上對Android 9.0源碼進(jìn)行修改和編譯。客戶端則使用Android Studio設(shè)計(jì)用于檢測SM4算法的匯編代碼正確性的應(yīng)用程序。SM4算法的加密效能主要是在Pixel 2設(shè)備上測試,Pixel 2設(shè)備為高通驍龍835處理器、4 G內(nèi)存和128 G的內(nèi)置存儲??蛻舳说拈_發(fā)環(huán)境如表1所示。
表1 客戶端開發(fā)環(huán)境
Android設(shè)備的中央處理器頻率會隨著設(shè)備的功率消耗不斷發(fā)生變化,會對測試結(jié)果產(chǎn)生一定消極影響。因此,為了減少外部因素對速率測試的影響,確保測試結(jié)果的準(zhǔn)確性,在測試加密速率之前,確保Android設(shè)備的應(yīng)用程序如移動數(shù)據(jù)、藍(lán)牙和WiFi等設(shè)置處于關(guān)閉狀態(tài)。
在pixel 2手機(jī)中循環(huán)加密1 000次后取平均值,其匯編加密速率為34.48 MB/s,即系統(tǒng)每秒加密34.48 MB文件數(shù)據(jù)。在相同環(huán)境下,分別使用Java、C語言和匯編語言實(shí)現(xiàn)SM4算法對文件加密速率的對比結(jié)果如圖5所示。
圖5 3種語言的加密速率對比結(jié)果
由圖5可以看出,Java、C語言和匯編語言實(shí)現(xiàn)的SM4算法對文件進(jìn)行加密的平均速率分別為4.57 MB/s、22.33 MB/s和35.60 MB/s。匯編語言的加密速率均比Java和C語言高,匯編語言比C語言的加密速度至少提高1.5倍左右。因此,SM4算法對系統(tǒng)文件的加密使用匯編語言實(shí)現(xiàn)更為有效,能夠最大程度提高對底層系統(tǒng)的加密效率,保障用戶的隱私安全。
在SM4密碼算法基于Android內(nèi)核的匯編語言實(shí)現(xiàn)中,首先對SM4密碼算法的匯編語言進(jìn)行設(shè)計(jì),其次將匯編語言實(shí)現(xiàn)的SM4密碼算法動態(tài)庫嵌入Android 9.0源碼,達(dá)到SM4密碼算法在Android內(nèi)核的高效實(shí)現(xiàn),不僅使Android系統(tǒng)具備保護(hù)數(shù)據(jù)安全的能力,還提高了Android系統(tǒng)的加密效能。測試結(jié)果表明,SM4國密算法不僅可以有效保護(hù)移動設(shè)備隱私數(shù)據(jù)的安全,其對文件加密的匯編語言實(shí)現(xiàn)速率還優(yōu)于Java和C語言。