黃一平,孫健華,梁梓辰
(1.廣西師范大學電子與信息工程學院/集成電路學院,廣西桂林 541000;2.廣西師范大學計算機科學與工程學院,廣西桂林 541000)
根據360 安全發布的2020 年上半年手機安全報告顯示,360 安全共截獲惡意程序104.8 萬個,新增的惡意程序主要是資源消耗、隱私竊取等,360 手機衛士在2020 上半年為全國的手機用戶攔截惡意程序攻擊達19.8 億次,手機信息安全存在著巨大的隱患,對加密工作形成了巨大的挑戰[1]。手機屬于白盒環境,而傳統的AES(Advanced Encryption Standard)算法和國密SM4 算法[2-3]不能滿足白盒環境。對于手機應用程序,各種逆向技術與各種破解技術層出不窮,黑客可能會在手機應用程序當中加入后門,導致手機設備信息泄露,造成重大的損失。
自從2002 年Chow 提出白盒密碼以來,白盒密碼就受到了廣泛的關注。在國產密碼的發展中,2010年,肖雅瑩等提出了白盒SM4 國產密碼算法。張慧[4]對白盒算法進行了分析,羅一諾[5]對白盒方案進行了改進,孫濤等[6]利用NoisyRounds 實現了白盒AES 算法,姚思等[7-8]使用置亂編碼等方式對查找表進一步操作,提出了一種新型白盒。吳震等[9]使用白盒SM4 加密視頻,取得了一定的成果。張躍宇[10-11]對白盒SM4算法進行了改進。汪宗斌等[12]將白盒算法應用到計算終端上。陶慎亮等[13]對白盒AES 算法進行了優化。白盒技術不斷發展,但是大多數文獻都是對白盒本身的查找表進行分析,白盒應用較少,無法真正體現白盒的優越性。水印技術的發展也很迅速,Celestine[14]提出了利用代碼統計的方法來防止代碼被篡改。方立嬌[15]利用同態加密設計了水印算法,并應用于圖片加密中。龍曉泉[16]將水印技術運用在數據庫當中。
白盒SM4 算法空間復雜度高、執行效率慢,如果應用到手機應用軟件當中,會極大地影響手機應用的運行效率。同樣,軟件水印信息暴露在白盒環境中,會遭到攻擊者的攻擊與破壞,水印若是遭到篡改,將無法達到檢測的目的。白盒SM4 算法的改進措施如下:
1)針對應用軟件被動態調試的問題,提出了一種白盒SM4 算法與水印技術相結合的方法,可以保證在對稱加密的執行過程中,密鑰可以隱藏,可以有效地阻止手機軟件動態調試。
2)針對白盒SM4 算法執行效率低的問題,對白盒SM4 算法進行了優化,在滿足手機應用白盒環境的前提下,空間復雜度降低到原來的1/2 左右,時間效率能提升四倍左右,既可以保證占用空間小,又能提高運行效率。通過計算得出,所提出的優化算法的復雜度較為合理,可以防止暴力破解,并能抵御BGE 攻擊,表明白盒SM4 優化算法有著很好的安全性。
Chow 依據AES(Advanced Encryption Standard)第一次提出了關于白盒密碼的概念,并且設定了白盒攻擊的環境,其主要的條件如下:
1)運行在同一個主機中,并且可以運行加密軟件,也有著特殊權限的攻擊軟件,對密碼算法的攻擊具有完全的控制權。
2)程序的動態執行是可以被監視的。
3)密碼算法實現的細節以及執行的過程對于攻擊者來說,是可見的,也是可以修改的。
SM4 算法主要是為了應對側信道攻擊所提出的方案,但是并不能抵御白盒環境下的攻擊。肖雅瑩按照Chow 等人提出的白盒AES 的思想設計了白盒SM4 算法。肖雅瑩設計白盒SM4 算法主要思想為:將SM4 算法當中的每一輪加密分割成小塊,然后對每一個小塊進行置亂編碼,置亂編碼之后的結果使用查找表和仿射變換來表示,也就是將密鑰的信息隱藏在查找表當中,防止攻擊者獲取到密鑰信息。簡單來說就是將每輪加密過程當中的信息進行混淆,與SM4 算法相同,加密輪數仍然為32 輪。
肖萊白盒SM4 算法的主要步驟為:
1)計算X=Xi+1⊕Xi+2⊕Xi+3,其主要過程如圖1所示。

圖1 肖萊白盒SM4加密步驟1
2)計算T(X⊕rki),把密鑰隱藏在S 盒中,其主要過程如圖2 所示。

圖2 肖萊白盒SM4加密步驟2
3)計算Xi+4,其主要過程如圖3 所示。

圖3 肖萊白盒SM4加密步驟3
其中,式(1)中兩個變量的計算如式(2)和式(3)所示:
其中,Ai+j(x)是GF(2)上的32×32 矩陣,GF(2)是最簡單的有限域,只有0、1 以及異或運算和與運算;Eij為GF(2)上8 bit 到8 bit 的可逆仿射變換,并且Pi+j和Ei都是隨機選擇并且保密的。
圖2 中的計算式如計算式(4)所示:
式(4)中X與rki的計算式如式(5)-(6)所示:
圖3 中的主要計算式如式(7)-(8)所示:
經過圖1 到圖3 的步驟,將密鑰隱藏在查找表中,即使攻擊者能訪問內存,也得不到密鑰的相關信息。
水印技術是在代碼中進行標記,開發者可以加入一些信息,主要作用就是防止代碼被篡改,或者保護自己的核心代碼不被逆向工作者直接盜用。因此文獻[14]提出了一種盲零水印的算法,根據代碼的原有特性以一定的邏輯加入相關的水印信息,當軟件遭受攻擊時,能夠檢索出來,并將代碼進行還原,使得攻擊無效。
這個算法需要一個可以被信任的證書頒發機構(Certificate Authority,CA),以版權的名義來注冊內容,當懷疑受到攻擊之時,從第三方提取相關的水印,當監測到篡改時,根據原始代碼對軟件進行恢復。此算法水印的嵌入是由軟件的開發者來完成,而水印的提取由可信的第三方進行提取。
首先這個方法并不適用于白盒環境,其中的一些統計代碼或者嵌入信息可能受到逆向工作者的攻擊。其次,第三方的CA 證書并不可控,可以通過偽造CA 證書來實現SSL(Secure Sockets Layer)的中間人攻擊等一系列的攻擊方式,所以對于第三方的CA 證書需要改進。
對于手機應用程序,防止逆向主要就是混淆加密密鑰,使其密鑰不可見,可以很大程度上保證設備的安全性,并保證破解時無法計算復雜度,就可以有效地保證所提出的整個算法的安全性。加密時,運算的復雜度以及占用的時間都不能太高,否則將會很大程度上拖慢手機應用程序的運行速度,所以必須要降低空間占用并提升運行速度,以此來保證白盒SM4 算法能夠運用到應用軟件當中。
肖萊白盒算法有五次32 bit×32 bit 仿射變換,32輪的輪密鑰加密。算法的優化設計主要就是簡化循環次數和仿射變換復雜度,經過多次數據驗證,發現循環的次數對于整個程序的執行時間影響并不是很大。所以需要優化仿射變換的次數,在保證安全性的前提下,降低其空間復雜度,并最大程度地優化時間。根據潘文倫對肖萊白盒的分析可知,其仿射矩陣和仿射常數的拆分對方案并沒有明顯加強,反而增加了運算的負擔,但是仍需要保證一定的空間復雜度,保證從計算上不會被破解。潘文倫指出,在設計中應避免泄露復合變換的仿射常數。依據潘文倫的分析,對仿射變換的空間復雜度進行了優化,提高運行的效率,適配應用程序的運行。
如圖1-3 所示,第一步將密鑰隱藏于SBox 盒中;第二步依據16 bit×16 bit 的仿射變換,得到置亂編碼,然后將其作為下一個變換的輸入,每一個變換都需要對輸入進行處理加入置亂編碼,以此得到上一個變換輸出的置亂編碼,進行計算之后,得到本次的置亂編碼;第三步,在經過兩次16 bit×16 bit 的仿射變換,輸出Xi+4。經過32 輪加密,最后輸出(X35,X34,X33,X32)作為密文輸出。其SBox 盒的復雜度保持不變,并使其加密的輪數依然保持在32 輪。通過大量的計算以及實驗驗證可知,這種方式對白盒SM4 的時間效率的提升最為有效,在保證安全性的基礎上,提高應用程序的運行效率。
對于水印的算法優化,利用代碼本身的數量以及特點進行統計,把這些信息當作水印信息進行處理。啟動工程時就對這些信息進行統計,在此之前要將這些代碼的相關信息存儲到字符數組當中,然后結合白盒SM4 算法進行后續的操作。其水印數據的產生步驟如圖4 所示。

圖4 水印數據的產生步驟
將白盒SM4 加密算法與水印技術進行優化,以更好地適用于手機應用工程文件,保證整個手機應用的運行與加密過程流暢并能安全地運行。
首先編寫對應的代碼統計算法與基于肖萊白盒的SM4 加密算法,這部分在編寫完成之后,能夠根據這個思想,變換不同的語法,以嵌入到不同的工程當中。對白盒SM4 算法進行了優化,其嵌入替換的方式完全相同。
將上述思想融合到具體的手機應用工程文件當中,根據手機應用工程的運行方式添加代碼同步運行,其主要過程如圖5 所示。

圖5 嵌入到APP工程當中具體過程
利用相關的統計代碼提取工程中的相關信息作為水印,為了防止水印信息被篡改,將其水印信息直接輸入到白盒SM4 算法中進行加密。為了防止攻擊者通過內存分析等方式直接獲取到統計信息,將這些統計信息直接輸入白盒SM4 加密的明文數組當中。如果每個數據分為128 bit 分別輸入,可以將這128 bit 信息加入偽造信息進行混淆,保證輸入不可見并且可靠。將水印的對比信息存儲下來,為了防止存儲信息被破解推導,將存儲信息也進行白盒加密。產生密文之后,可以對密文信息進行選擇性比較,以此來進行置亂。存儲信息可以存儲在代碼環境中經過白盒加密,也可以通過服務器發送相應的密文進行加密。然后把這兩個加密之后的密文進行對比,如果出現問題,那么就直接改變程序的入口點,使工程停止運行;如果比對結果相同,那么工程就正常運行。
對密文進行比較之后,如果改變了此時程序的入口點,工程項目可能缺少相應的內存數據,導致整個軟件崩潰,而且程序的入口地址可以由程序的開發者自行設定,完全可以使程序先運行一段時間,然后產生棧溢出、數據為空等一系列操作。為了保證白盒代碼不被修改,也可以將白盒代碼本身作為一個水印,將其統計信息輸入到自身加密的信息當中。
白盒SM4 算法生成輪密鑰的方式可以不斷地進行改變,保證其算法的獨特性,不會因為攻擊者得到相同的算法,就能得到相同的密文。白盒算法也可以根據白盒SM4 算法的發展不斷地進行更新換代,保證其安全性與穩定性。
現在很多手機應用軟件,都會發布各種版本,不斷升級,可以隨時更新白盒加密的代碼,也可以統計不同字符的相關信息,簡單來說就是舊版本統計整數類型(int)有多少個,新版本去統計雙精度浮點型(double)的數量,并可以加入很多無效信息,這個可以根據逆向人員修改代碼的主要位置進行統計,輸入的信息可以不斷地變化。而且利用白盒SM4 加密后的水印數據進行判斷時,可以將字符使用base64等加密算法進行加密,這樣可以保證字符不會直接出現在代碼中,保證其安全性,即使逆向工作者找到并破解了base64 的加密字符,也不能判斷這些字符是否使用了白盒算法進行加密,更無法判斷哪些是密文。
另外,判斷加密數據與存儲數據不同時,改變程序入口地址的位置,這些位置在不同的版本中可以選擇不同的位置。當檢測到加密數據與存儲數據不同,可以采用備份或者是網絡調用的方法,恢復相應的代碼,使攻擊者的攻擊失效;還可以根據后期的項目對安全性的需求、備份所占用的空間、網絡更新所需要的成本等按需設計。
基本設備為PC 機,其搭載的實驗環境為Windows10 操作系統、12 GB內存、i5-6200U CPU-2.30 GHz、Visual Studio 2019,Android 版本為5.0。
白盒SM4 算法中有三個步驟,每一步所占用的空間為:
第一步,根據圖3 流程所示,有三個16 bit 到16 bit的仿射變換,計算式如式(9)所示:
第二步,根據圖4 流程所示,有四個8 bit 的輸入和16 bit的輸出,計算式如式(10)所示:
第三步,根據圖5 流程所示,有兩個16 bit 到16 bit的仿射變換,計算式如式(11)所示:
由于白盒SM4 中一共有32 輪加密,總占用空間的計算式如式(12)所示:
所改進的水印技術的統計與比較對空間復雜度影響甚微。其算法主要是分析白盒SM4 的空間復雜度,這直接關系到算法統計信息和存儲信息的安全性。當前最主要的幾種白盒算法的空間復雜度如表1 所示。

表1 白盒空間復雜度比較
提出的白盒+水印方案的復雜度相較于肖萊白盒SM4 降低了一倍,相較其他的算法,可以看出優化后的白盒SM4+水印方案在手機應用軟件占用更少的資源。隨著計算機技術的發展,量子計算機的出現將會對傳統的密碼算法造成很大的挑戰,而密碼算法也在不斷演變,未來可以考慮將新的密碼算法與水印技術相結合,從而替換目前的算法,繼續保證應用的安全性,也可以根據不同的場景來更換不同的算法,有較高的適用性。
三種算法加密不同大小數據平均所占用的時間,其對比如圖6 所示。在白盒SM4 算法與水印技術結合之后,發現其與僅為SM4 算法消耗的時間大致相同,水印技術占用的資源和時間很少,主要取決于加密算法的資源與時間。隨著密碼學的發展,可以替換白盒SM4 算法,繼續保護應用安全,再次驗證了優化之后的水印技術有著良好的可移植性。

圖6 三種算法消耗時間及結果對比
通過對肖萊白盒SM4 算法、肖萊白盒SM4 算法+水印技術以及所提出白盒SM4 算法+水印技術的時間復雜度的對比,可以得出水印技術的植入對整個算法并沒有太大的影響,表明白盒SM4 算法+水印技術有很好的可移植性,并且優化過后的白盒SM4+水印技術在時間效率上可以提升四倍左右,在保證安全的基礎之上,保證整個算法降低內存占用,提高算法的效率,這樣可以很好地將算法應用到手機應用軟件中。
依據圖1-3 的基本流程,經過優化改造之后,每一輪的白盒多樣性如下。
第一步:
第二步:
第三步:
依據式(13)-(15)的計算,每一輪都包含上述三步的多樣性,所提出的白盒SM4 算法基于肖萊白盒SM4,一共有32 輪加密。從多樣性上來看,優化后的白盒SM4+水印技術是安全的。
BGE 攻擊是根據查找表將輸入置亂編碼與輸出置亂編碼來恢復仿射變換,是針對白盒AES 的攻擊,根據仿射變換輸出置亂編碼,因為每一輪的置亂編碼與下一輪是互逆的,也就是Outr=(Inr+1)-1,除了第一輪,其他的置亂編碼都可以計算,這樣就可以得到隱藏的密鑰。在白盒SM4 算法中,Outr≠(Inr+1)-1,這之間相差一個常數,這個常數對于攻擊者來說是不可見的,也不能從查找表和預處理仿射變換中得到,因此白盒SM4 算法可以抵抗BGE 攻擊。
將白盒代碼與統計代碼加入到Android 的項目工程文件當中一起進行編譯,然后找出相應的資源文件進行代碼統計,并統計自身的代碼,防止被修改。最后對其密文進行判斷,如果不相等,就改變程序的入口點,使程序失效。Android 工程使用Androidkiller進行逆向分析。
Androidkiller 是一款可以對手機的APK 文件進行反編譯的工具,可以對反編譯之后的smali 文件按照逆向工作者的想法進行修改,然后可以對修改后的文件重新進行打包。將上述編寫好的APK 利用Androidkiller 逆向分析出相關代碼,應用程序的逆向代碼,為smali 語言。其中包含goto 的跳轉,數據庫的傳輸、關閉,還有if-eqz,即為if-else,逆向工程師可以對這些代碼進行修改,比如a變量大于0,繼續執行;如果a變量小于或等于0,提示錯誤信息,不在向下執行,逆向工程師可以直接修改a變量小于或等于0 即可成功執行,導致占用服務器或其他的資源,對整個項目運行的安全性造成了極大的挑戰。在應用程序代碼中加入所提出的算法,逆向修改完成之后可重新打包簽名,在測試環境下進行安裝,發現程序已經停止運行,無任何修改時,手機軟件可以正常運行,說明白盒SM4+水印技術有著很好的適用性。
白盒加密技術對今天各種安全問題有著重要的意義,特別是對于手機這種白盒環境當中的應用軟件,針對無法聯網認證的手機軟件,需要保證應用程序不被篡改。對白盒SM4 算法進行優化,在滿足手機應用白盒環境的基礎上,相較于肖萊白盒SM4 算法空間復雜度降低為原來的1/2,時間效率提升四倍左右,其復雜度滿足保護手機軟件的要求,且可以抵抗BGE 攻擊。白盒SM4 優化算法結合水印技術應用于手機應用軟件,既可以保證運行效率,也有利于保護手機的安全以及手機應用開發者的權益。由于仿射常數的特殊性,對常數的保護,是下一步白盒算法研究的重點。