孫 濤, 唐國俊, 吳昕鍇, 毛振寧, 龔 征
華南師范大學計算機學院, 廣州510631
在移動互聯(lián)網(wǎng)與物聯(lián)網(wǎng)終端及其軟硬件技術交替演進當中, 可信計算、身份認證、密碼算法等網(wǎng)絡與信息安全關鍵要素已得到充分重視. 絕大多數(shù)產(chǎn)品在理論上遵照密碼學廣泛采用的Kerckhoffs 原則(即一個密碼系統(tǒng)的安全性僅依賴于密鑰的安全性). 因此工業(yè)界也陸續(xù)制定了TPM、Trustzone、SGX、TEE、SE 等一系列技術用于保護密鑰存儲與運算中的完整性與機密性. 在保護密鑰安全的基礎上, 通過各種標準密碼算法或安全協(xié)議對數(shù)據(jù)、身份和隱私信息進行安全加固. 在實際中, 由于移動互聯(lián)網(wǎng)、物聯(lián)網(wǎng)硬件資源往往受到限制, 在軟件上又需要考慮設備兼容性等問題, 采取基于硬件安全(TEE、SE) 保護密鑰的應用解決方案在總體上還僅占很小比例, 絕大多數(shù)應用仍然通過傳統(tǒng)軟件加固的方式(代碼混淆、程序加殼、內存防dump) 來保護應用安全方案中的密鑰. 但相關軟件加固技術往往依賴于廠家自身的設計與分析, 缺乏理論安全性驗證. 在CCS 2018 會議上, 李卷儒等人通過分析密碼算法與密鑰在二進制代碼存儲與運算中的特征, 設計并實現(xiàn)了一種通用的二進制代碼密鑰恢復工具(K-HUNT)[1]. 針對OpenSSL、mbedTLS 等著名開源密碼算法庫及一些私有密碼算法相關軟件的實驗結果表明K-HUNT 均能對二進制代碼中的密鑰進行恢復攻擊. 上述攻擊案例表明傳統(tǒng)軟件加固方式作為密鑰保護技術還遠遠不夠, 攻擊者往往能通過靜態(tài)代碼逆向分析、動態(tài)程序跟蹤等方式直接獲取密鑰. 在物聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)等資源受限應用場景下, 由于分組密碼算法(block cipher) 在性能與效率上的優(yōu)勢, 因此在數(shù)據(jù)加解密、消息認證碼與數(shù)字版權管理方案的構造中往往起著重要作用. 在此背景下, 越來越多的廠商在應用中引入了白盒分組密碼算法(white-box block cipher) 來構建軟件環(huán)境下的密鑰安全保護機制, 由此也進一步提高了學術界與工業(yè)界對白盒分組密碼算法的研究與關注度.
白盒密碼學(white-box cryptography) 由Chow 等人[2]在SAC 2002 年會上首次提出, 其核心思想是通過白盒密碼實現(xiàn)技術, 使得密碼算法的軟件實現(xiàn)與運行環(huán)境在對攻擊者完全開放的前提下, 密碼算法所使用的用戶密鑰仍然不能被攻擊者所獲取. 在提出白盒密碼學概念的同時, Chow 等人也針對國際分組密碼算法標準AES 和DES 給出了相應的白盒實現(xiàn)方案[2,3]. 由于白盒分組密碼算法僅依賴于軟件實現(xiàn),具有良好的兼容性和可維護性, 目前已得到了密碼學界和工業(yè)界的廣泛研究與關注. 在防火墻、無人機、APP 等應用中, 白盒分組密碼算法已作為軟件完整性保護、身份認證、密鑰管理與分發(fā)等功能的關鍵信息安全保護技術加以實際應用.
在Chow 等人提出基于查找表的AES 標準分組加密算法的白盒實現(xiàn)后[2], 從矩陣、仿射變換分析入手進行白盒方案破解的工作也伴隨而來. Billet 等人于2004 年提出了基于矩陣求逆方法的白盒密鑰恢復攻擊技術(簡稱BGE 攻擊)[4], 該技術能以232左右的計算復雜度對Chow 等人所提出的AES 白盒實現(xiàn)及其類似構造的白盒分組密碼算法進行密鑰恢復. 針對Chow 等人提出的DES 白盒實現(xiàn), Wyseur 等人也提出了類似破解方法[5]. 在BGE 攻擊方法提出后, 陸續(xù)也有新的白盒AES 實現(xiàn)方案提出, 在此基礎上, 針對Chow 類型的白盒AES 實現(xiàn)的分析方法也不斷改進. Bringer 等人在2006 年提出了一種白盒AES 實現(xiàn)方案[6], 但在2010 年De Mulder 等人給出了相應的攻擊方法[7]. 2009 年肖雅瑩和來學嘉提出了一種改進內部編碼方式的AES 白盒實現(xiàn)方案[8], 該實現(xiàn)在2012 年被De Mulder 等人以232的計算復雜度破解[9]. 在2010 年, Karroumi 基于dual cipher 的思想提出了一種新的白盒AES 實現(xiàn)方案[10], 但2013 年Lepoint 和Rivain 提出的新分析方法, 將攻擊Chow 等人和Karroumi 提出的白盒AES 方案及其類似變種的計算復雜度均降低至222[11]. 2016 年Baek 等人提出內部狀態(tài)(internal state) 的大小決定了白盒實現(xiàn)的安全強度, 并基于此理念, 通過編碼連接兩個AES 實例的方式提高內部狀態(tài)的大小, 給出了一個新的白盒AES 實現(xiàn)方案[12]. 在Eurocrypt 2018 上, Dinur 通過改進的仿射變換等價變換方法, 將m 比特S 盒的仿射查找表變換的最優(yōu)攻擊復雜度提高到O(m32m)[13]. 隨后在CHES 2018 上, Derbez等人[14]指出Dinur 算法[13]的不足之處, 給出了針對SPN 結構+ 仿射變換的白盒分組密碼算法的高效通用分析方法. 針對Baek 等人提出的白盒AES 實現(xiàn)方案[11], Derbez 等人在該高效通用分析方法的基礎上給出了計算復雜度為231的破解方案[14]. 在上述分析方法的影響下, CHES 2016/2017 連續(xù)兩年舉辦的AES 白盒實現(xiàn)競賽均無方案能抵抗密鑰恢復攻擊[15].
在理論上, 白盒安全模型在算法運行狀態(tài)下對攻擊者并無秘密可言, 但在實際中, 存在一類研究方向, 即對白盒算法設計與實現(xiàn)提出秘密組件(secret components) 的前提條件, 其中具有代表性的就是Biryukov 等人提出的ASASA 框架[16]. 該類工作往往假設分組加密算法的S 盒或擴散層采用了秘密參數(shù)加以實現(xiàn), 該秘密參數(shù)對攻擊者并不公開. 由于該秘密參數(shù)的存在, 使得白盒模型下的攻擊者進行密鑰恢復攻擊的難度大大增加. Chow 等人所提出的白盒分組密碼實現(xiàn)中, 外部編碼(external encoding) 由于也是對攻擊者保密, 因此也可以看作是算法白盒實現(xiàn)的秘密組件. 針對上述設計方案, Bos 等人提出了基于差分計算分析(differential computation analysis, 以下簡稱DCA) 和差分故障分析(differential fault analysis, 以下簡稱DFA) 的側信道分析方法[17], 能將設計方案中的隱藏S 盒或其他組件加以恢復, 從而最終實現(xiàn)白盒算法的密鑰恢復攻擊. 上述側信道分析方法一經(jīng)提出, 在AES 白盒實現(xiàn)的破解上也取得了很好的實際破解效果. 在分析CHES 2017 AES 白盒實現(xiàn)競賽中各種參賽方案的基礎上, Goubin 等人歸納出linear decoding analysis (LDA) 方法, 該方法能有效解決代碼混淆后的白盒分組密碼的秘密組件分析問題[18]. Lee 等人提出在輪函數(shù)線性變換到非線性變換之間增加隨機掩碼的方式, 能有效提升白盒實現(xiàn)抵抗DCA 攻擊的安全性[19]. 在2019 年Journal of Cryptology 上, Bock 等人在Bos 等人DCA 和DFA 工作的基礎上, 提出了dynamic binary instrumentation (DBI) 安全框架用于白盒模型下密碼算法的側信道分析[20]. 在SAC 2019 上, Amadori 等人通過結合BGE 攻擊技術, 使得DFA 攻擊能對增加了8 比特輸出外部編碼的白盒AES 方案進行攻擊, 該方法的密鑰恢復攻擊復雜度為O(232)[21].
由于在資源受限環(huán)境下, 在分組密碼算法設計上增加側信道保護還需要考慮其實現(xiàn)代價. Zhou 等人的探索性工作表明, 輕量級分組密碼算法也可以采用查找表或仿射變換的形式進行白盒實現(xiàn)[22]. Xu 等人提出增加輪函數(shù)冗余和查找表變換的方式來模糊輪函數(shù)邊界, 進而達到增大AES、SM4 等基于S 盒-線性擴散類型分組密碼白盒實現(xiàn)的分析難度[23]. 如何在實現(xiàn)分組密碼算法白盒安全性的基礎上, 能夠抵御各種側信道分析方式對算法實現(xiàn)秘密參數(shù)或組件的恢復攻擊, 并不是簡單的技術疊加. 同時, 算法增加側信道保護技術后能否與白盒實現(xiàn)有機整合, 盡可能地降低白盒實現(xiàn)的性能與資源開銷, 這也是決定白盒分組密碼算法能否具有實用性的關鍵問題之一.
在LATINCRYPT 2012 年會上, Gierlichs 等人提出了DummyRounds 技術[24]. 該技術通過巧妙利用分組密碼輪函數(shù)存在不動點的特性, 通過增加隨機等效輪的方式來實現(xiàn)密碼算法硬件實現(xiàn)的抗故障攻擊. 在CRYPTO 2016 年會上, Schneider 等人提出將奇偶校驗碼(parity code) 和門限化實現(xiàn)(threshold implementation) 的ParTI 方案, 并針對PRESENT 分組密碼算法實現(xiàn)了抗差分能量攻擊和故障攻擊的一體化保護[25]. 雖然DummyRounds 技術和ParTI 方案均有效地抵抗了故障注入攻擊, 但DummyRounds 技術要求算法密鑰不能預先固定, 這與白盒分組密碼算法的密鑰由白盒密鑰表預計算完成并分配的實用方式不符. 同時DummyRounds 技術和ParTI 方案僅適用于硬件實現(xiàn)下的側信道防護,如果在白盒實現(xiàn)中直接采用上述技術, 攻擊者可以簡單的旁路掉DummyRounds 或ParTI 方法中的保護測試部分, 使得故障注入還是能取得預期效果. 與DummyRounds 技術類似的是, 韓國KAIST 的學者Lee 和Kim 也提出了基于Table Redundancy 的方式來抵抗DFA 分析[26]. Table redundancy 方法主要原理是通過并行MixColumns 步驟, 將計算結果進行對比, 如果白盒實現(xiàn)遭受到DFA 攻擊, 那么并行MixColumns 步驟會導致輸出結果無法用于進一步的DFA 分析.
在上述工作的基礎上, 本文針對一類添加了內/外部掩碼的隨機冗余輪函數(shù)保護的白盒AES[15](由于此類保護方式與DummyRounds 具有相似性, 我們將該方法命名為NoisyRounds), 給出了在各種內、外部編碼與冗余輪函數(shù)條件下的DFA 分析. 從我們基于Deadpool 工具[27]改進后的自動化DFA 分析結果來看, 如果僅僅在AES 輪函數(shù)中增加n 輪DummyRounds, 那么DFA 攻擊者只需線性增大獲取錯誤密文數(shù)量即可成功恢復密鑰. 在添加n 組NoisyRounds 保護后, 密鑰恢復難度為NoisyRounds 組數(shù)n的(n+1)4計算復雜度. 在帶外部編碼的情況下, NoisyRounds 與現(xiàn)有保護方案一樣能抵抗DFA 工具的分析. 雖然外部編碼能夠抵抗DFA 分析, 但算法加解密結果也將帶上相應的編碼, 與標準加解密結果不能一致, 將失去在不同系統(tǒng)間的兼容性. 因此實際白盒AES 應用中,如何在不添加外部編碼的前提下抵抗DFA 攻擊也非常重要. 上述分析結果對于研究灰盒模型下常用的隨機冗余輪技術在白盒模型下的安全性具有參考意義.
分組密碼算法AES-128 共10 輪[28],輪函數(shù)包括SubBytes、ShiftRows、MixColumns 和AddRound-Key 四個組成部分. 首輪之前, 先做一次AddRoundKey, 末輪沒有MixColumns. Chow 等人針對AES-128 設計的白盒密碼方案[2](以下簡稱: Chow-WBAES) 的思路是調整加密順序, 改變算法每一輪的邊界,構成輪函數(shù)加密依次如下順序: ShiftRows, AddRoundKey, SubBytes 和MixColumns 的輪結構, 如再將AddRoundKey 與SubBytes 組合成查表操作, 即建立8 比特輸入到8 比特輸出的查找表, 稱為T-box,從而將密鑰隱藏在查找表中. 需要指出的是, 由于AES 的輪狀態(tài)可用4×4 單元表示, 除ShiftRows 以外, 其余操作均在當列操作, 所以在AES 的白盒實現(xiàn)中可以列單位進行白盒查找表的建立與加密運算. 本文在部分描述中, 將以第1 列為例介紹Chow-WBAES.
對于一個字節(jié)的輸入x , T-box 如下表示:
其中i = 0,··· ,15,r = 1,··· ,9, kr為第r 輪輪密鑰, k0為第一輪之前的AddRoundKey 密鑰. ?kr[i] 表示kr經(jīng)過ShiftRows 變換后的第i 個字節(jié), i=0,1,··· ,15,r =0,1,··· ,10.
因MixColumns 每次作用在一列, 可由32×32 的矩陣MC 乘32 比特的列向量表示, 在白盒實現(xiàn)中加密時的MixColumns 與解密時的MixColumns 逆操作都可通過四個較小規(guī)模的8 比特輸入到32 比特輸出的查找表操作后再通過異或的方式完成. 加密時的查找表稱為Tyi, 解密時的查找表稱為invTyi,i=0,1,2,3. 構造如下表示:
32 比特的列向量(x0,x1,x2,x3) 進行MixColumns 或MixColumns 逆操作可表示為4 次查表和3 次異或:
其中, i=0,··· ,3, r =2,··· ,9. 因此需要額外的查找表操作來抵消MB 的影響以及添加r+1 輪的輸入置換, 所以構造8 比特輸入到32 比特輸出的查找表BijBox. 對于一個字節(jié)的輸入x, 第1 列的BijBox有如下表示:
結合查找表, 原AES-128 算法加密操作便可轉換為查表操作, 對于128 比特的明文plaintext, 其AES-128 加密有如下表示:
考慮到code lifting 攻擊, 需要對白盒解密程序的輸入密文和輸出明文做編碼來改變加密算法的明文與密文的映射關系, 防止攻擊者在不還原密鑰的情況下直接通過白盒解密裝置解密密文, 得到原始的明文,而對加解密程序的輸入輸出添加的編碼稱為外部編碼(external encodings). 用Dk表示AES-128 解密,F 表示外部輸入編碼, G 表示外部輸出編碼, 增加外部編碼的解密程序如下表示:
外部編碼實現(xiàn)目前主要有線性和非線性編碼, Chow 等人建議的是選擇128 比特到128 比特的置換編碼,并且將該置換轉換成16 個8 比特到128 比特的查找表結合異或實現(xiàn), 即在首輪之前, 添加額外的16 個8比特到128 比特的查找表和對應的480 個異或表來實現(xiàn), 同樣的在第10 輪之后, 也需要額外的查找表和異或表來實現(xiàn)G (也可與第10 輪的T-boxes 結合, 構成新的8 比特到128 比特的查找表). 再通過查異或表的形式合并. 如圖1 的Type I 所示. 而在Muir[29]等人提出一種非線性編碼方式, 使用16 個隨機的8 比特的級聯(lián)編碼組成128 比特的非線性編碼, 其構成如下:
這種編碼方式可無需額外的查找表, F?1與第1 輪的T-box 輸入結合, G 與最后一輪T-box 輸出結合.
圖1 Chow-WBAES 的四類查找表Figure 1 Four types of lookup tables of Chow-WBAES
在本小節(jié), 我們首先簡要概述AES 差分故障攻擊方法, 隨后對Chow-WBAES 的差分故障攻擊的基本原理與方法進行說明.
2.2.1 差分故障分析
在1997 年Crypto 會議上,Biham 和Shamir 提出了差分故障分析(differential fault analysis,DFA)這一概念, 并將其用于攻擊DES 算法[30]. DFA 攻擊的核心思想是通過對分組密碼算法運行過程的中間值注入錯誤, 從而誘導出錯誤密文并加以收集, 將錯誤密文與正確的密文進行分析, 最終恢復出相應的輪密鑰. 由于分組密碼算法的密鑰擴展函數(shù)大多具有可逆性, 因此在通過DFA 攻擊方式獲取分組密碼算法的輪密鑰后, 可以根據(jù)對應算法的密鑰擴展函數(shù)逆推出相應的主密鑰. 例如在AES-128 中, 攻擊者獲取最后一輪的輪密鑰即可恢復主密鑰, AES-192 和AES-256 則需要最后兩輪的輪密鑰才能恢復主密鑰.
圖2 Dusart 等人對第九輪AES 的差分故障攻擊示意圖Figure 2 Illustration of Dusart et al.’s DFA from 9th round AES
將公式(2)中的3○4○式相加可得:
2.2.2 對Chow 等人的白盒AES 實現(xiàn)的差分錯誤分析實例
本小節(jié)將介紹針對Chow-WBAES 的DFA 攻擊實例. 一般情況下, 攻擊者在對白盒實現(xiàn)實施差分故障攻擊時, 首先運行正常的加密程序得到正確的密文并記錄, 然后在加密程序的二進制流或白盒查找表中注入錯誤, 最終篩選合適的錯誤密文用于計算可能的輪密鑰候選值. 在Bos 等人開創(chuàng)性的白盒分組密碼DFA 攻擊方法[17]后, 陸續(xù)有基于DFA 自動化分析工具[27]破解白盒AES 的實際案例[32]. 此外,Teuwen 等人[33]也提出了使用Deadpool[27]工具成功分析Karroumi[10]和SECCON 2016[34]中的白盒AES 實現(xiàn)方案. 2019 年Bock 等人[20]詳細提出了若干種能在軟件環(huán)境下對密碼算法進行注入錯誤的方法, 有以下5 種:
(1) 通過code lifting 將白盒加密程序轉換成高級語言(例如C/C++), 這樣就可以將注入錯誤的代碼插入到白盒加密的過程當中.
(2) 將白盒程序運行在二進制動態(tài)插樁分析(dynamic binary instrumentation, DBI) 的框架下(例如intel PIN[35]或Valgrind[36]) 并插入誘導錯誤的代碼.
(3) 使用支持腳本的程序調試器(例如gdb) 對白盒程序進行調試, 通過腳本自動化地去對注入錯誤以及收集對應的密文.
(4) 將程序運行在Unicorn Engine[37]或PANDA[38]等模擬器當中, 則可以隨時改變數(shù)據(jù)的值或插入代碼, 從而達到對密碼程序注入錯誤的目的.
(5) 在某些特定的情況下(例如白盒查找表或程序缺乏完整性檢測機制) 向白盒查找表或程序注入錯誤, 使其輸出錯誤的密文并對錯誤密文進行篩選.
當加密或解密程序進行安全加固后, 前4 種方法將難以實現(xiàn), 本文所使用的分析工具Deadpool[27]采用了上述的方法(5) 的策略, 將錯誤注入到白盒程序中. Teuwen 和Hubain 中對Deadpool 的工作原理進行了闡述[33], 首先提出了兩個基本的要求:
(1) 白盒加密程序所產(chǎn)生的密文不應該帶有外部輸出編碼(external encoding), 因為使用外部輸出編碼時攻擊者無法直接地分析出注入錯誤對密文的影響.
(2) 加密程序能多次運行, 確保能獲得多對錯誤密文.接下來對Deadpool 平臺的DFA 攻擊進行描述:
(1) Deadpool 首先導入白盒查找表T 并運行加密程序E 得到正確密文C 并記錄.
(2) Deadpool 嘗試遍歷T(使用優(yōu)化算法降低遍歷空間) 和并產(chǎn)生隨機錯誤注入到T (通過對二進制中的某段地址異或一串隨機值), 得到錯誤密文, 對比錯誤密文與正確密文, 符合要求的錯誤密文將被分類記錄, 按列分為4 類.
(3) 遍歷完成后,運用第2.2.1 節(jié)的方法,針對獲取到的錯誤密文分別破解第10 輪輪密鑰K10,0,K10,7,K10,10,K10,13.
(4) 根據(jù)K10逆推回主密鑰.
Deadpool 系列攻擊工具的開源, 引起了白盒密碼界的廣泛關注, 其對目前多個公開發(fā)表的白盒實現(xiàn)進行了DFA 攻擊, 表1 展示了部分白盒AES 實現(xiàn)在DFA 攻擊下的實際抵抗效果.
表1 部分白盒AES 實現(xiàn)在DFA 攻擊下的實際抵抗效果Table 1 Actual status of partial AES white-box implementations against DFA attack
在本節(jié)中, 我們將提出一種可有效抵抗DFA 攻擊的AES 白盒實現(xiàn)方案NoisyRounds-WBAES. 首先介紹NoisyRounds-WBAES 的原理及其實現(xiàn), 然后通過Deadpool 平臺的DFA 分析工具[27]的攻擊實驗, 我們給出在NoisyRounds 保護下的白盒AES 實現(xiàn)抵抗DFA 攻擊的有效性.
雖然Tao Xu 等人的輪邊界混淆工作[23]被Yeom 等人采用積分攻擊和BGE 攻擊相結合的方式破解[39], 但特定結構的隨機冗余輪函數(shù)(DummyRounds) 是否能抵抗側信道攻擊, 特別是DFA 攻擊仍然有待詳細研究. 因此本文基于Chow-WBAES 方案, 提出了一種針對白盒AES 實現(xiàn)的NoisyRounds 保護方案, 該方案結合了在灰盒模型中證明有效的DummyRounds 技術, 同時根據(jù)DFA 攻擊的特點來設計冗余輪函數(shù)的結構. 以下將該方案簡稱為NoisyRounds-WBAES.
在CHES 2016 上, Bos 等人[17]提出了針對AES 白盒應用DFA 攻擊的方案, 該方案選擇AES白盒實現(xiàn)的最后兩輪進行攻擊, 該方案主要有以下兩個特點: (1) 無需知道注入故障的具體值; (2) 無需跟蹤寄存器和內存信息, 錯誤密文可直接輸出. 該方案將單個字節(jié)的錯誤注入到MixColumns8th與MixColumns9th之間, 經(jīng)過MixColumns9th以及第10 輪運算后, 最終得到與正確密文相比存在4 個錯誤字節(jié)的錯誤密文(該4 個錯誤字節(jié)分布符合ShiftRows 規(guī)律). 我們將MixColumns9th及第10 輪整輪稱為“DFA 分析輪組”. 本文在Chow-WBAES 的基礎上, 通過在實際的第10 輪后添加與DFA 分析輪組的結構一致的輪組來混淆DFA 攻擊, 這樣的輪組稱為“NoisyRounds”, 而相對應的, 需要增加能夠抵消新增的NoisyRounds 的輪結構已保證白盒實現(xiàn)的正確性. 在應用上述Deadpool 平臺的DFA 分析工具攻擊NoisyRounds-WBAES 時, NoisyRounds 與DFA 分析輪組都有可能被注入錯誤并輸出錯誤密文,并且根據(jù)密文無法區(qū)分其來自二者中的哪一個. 又因為NoisyRounds 的查找表T-box 所使用的密鑰是隨機生成的, 與實際密鑰沒有任何關聯(lián), 如此DFA 分析工具提取出的密鑰為實際密鑰與NoisyRounds 的密鑰的集合, 若要區(qū)分, 攻擊者需將集合內密鑰遍歷, 而遍歷空間與添加的NoisyRounds 組數(shù)n 成正相關.
NoisyRounds-WBAES 在Chow-WBAES 方案的基礎上, 改變原第10 輪, 并添加若干組的Noisy-Rounds. 每組NoisyRounds 包含3 輪, 其中第2-3 輪和Chow-WBAES 的DFA 分析輪組在結構上是一致的, 并且NoisyRounds 使用的輪密鑰是隨機的. 為更好的描述NoisyRounds-WBAES 實現(xiàn), 首先假定NoisyRounds 的組數(shù)為n, NoisyRounds-WBAES 的算法描述如算法1 所示. 將NoisyRounds-WBAES分為3 個階段描述.
算法1 NoisyRounds-WBAES Input: P,ki,?ki for i ∈0,··· ,10,rki for i ∈0,··· ,n, 其中P 為明文, n 為NoisyRounds 組數(shù), ki 為主密鑰K 的子密鑰, ?ki 為ki 的ShiftRows 以后的結果, rki 為隨機生成的輪密鑰.Output: C = AES(P,K).1 State: R ←P; r ←1;2 while r ≤9 do 3 R = ShiftRows(R);4 R = AddRoundKey(R,?kr?1);5 R = SubBytes(R);6 ss R = MixColumns(R)7 end 8 R = ShiftRows(R);9 R = AddRoundKey(R,?k9);10 R = SubBytes(R);11 R = AddRoundKey(R,k10);12 r ←1;13 while r ≤n do 14 R = AddRoundKey(R,rkr?1);15 R = invSubBytes(R);16 R = AddRoundKey(R,rkr);17 R = invShiftRows(R);18 R = invMixColumns(R);19 R = MixColumns(R);20 R = ShiftRows(R);21 R = AddRoundKey(R,rkr);22 R = SubBytes(R);23 R = AddRoundKey(R,rkr?1);24 end 25 return R
· 1-10 輪: NoisyRounds-WBAES 的第1-10 輪和Chow-WBAES 的第1-10 輪的運算是一致的, 需要說明的是, NoisyRounds-WBAES 第10 輪在Chow-WBAES 的第10 輪基礎上增加了AddRoundKey 和invSubBytes 步驟, 具體在NoisyRounds 抵消部分在描述.
其中i=0,1,··· ,15, invS 為AES-128 中S 盒的逆操作, rkr為隨機生成的密鑰.
對于一個字節(jié)的輸入x, NoisyRounds-WBAES 中每輪的第1 列的TM-table 構造如下:
其中i=0,1,2,3. θ 為位擴展操作, 將8 位的輸入轉換為32 位的輸出, θi(x) 有如下表示:
同樣的, 需要額外的查找表操作來抵消MB 的影響以及添加r+1 輪的輸入置換, 所以構造8 比特輸入到32 比特輸出的查找表BijBox. 對于一個字節(jié)的輸入x, BijBox 有如下表示:
最終, NoisyRounds-WBAES 在應用了內部線性和非線性編碼以后, 在NoisyRounds 組數(shù)為n 時,所需查找表數(shù)量如表2 所示, 共需存儲開銷168n+508 KB, 與Chow-WBAES 的存儲開銷相比, 每添加一組NoisyRounds, 存儲開銷增加30%, 而將故障注入正確位置的概率降低50%. 圖3 展示了錯誤注入NoisyRounds 的N2和N3時的情況, 注入N2和N3時得到的錯誤密文與注入到實際第8 輪和第9 輪之間的到的錯誤密文與正確的密文相比, 都是存在4 個錯誤字節(jié)且這4 個字節(jié)有同樣的排列規(guī)律, 這對于攻擊者來說是不可區(qū)分的.
表2 NoisyRounds-WBAES 存儲開銷Table 2 Total storage requirement of NoisyRounds-WBAES
在系統(tǒng)版本為Ubuntu16.4, GCC 版本為5.4.0, 內存大小16 G, CPU 型號為Intel(R) Core(TM) i7-7700 CPU@3.60 GHz 的實驗環(huán)境中,運用Deadpool 工具對Chow-WBAES 與NoisyRounds-WBAES,包括兩種算法增加非線性/線性的外部編碼的情況進行DFA 實驗.
圖3 針對NoisyRounds 的錯誤注入示意圖Figure 3 Illustration of DFA attack to NoisyRounds
實驗結果表3 展示了NoisyRounds 組數(shù)為1 的白盒AES 實現(xiàn)與Chow-WBAES 的對比結果, 結合表1, 我們發(fā)現(xiàn)有如下現(xiàn)象:
· NoisyRounds-WBAES 在一次遍歷所需次數(shù)上小于Chow-WBAES, 這是因為Chow-WBAES 的查找表為實現(xiàn)為724 KB,可注入范圍為bijBox8th和xor_table8th的部分空間,大小為160 Bytes,所以獲得錯誤密文的概率為0.22%,而添加1 組NoisyRounds 后,可注入范圍被擴大到320 Bytes,而查找表大小擴充到964 KB, 所以獲得錯誤密文概率增大到0.32%, 從而破壞了Deadpool 分析工具的遍歷優(yōu)化算法. 圖4 展示了在Deadpool 工具下有效錯誤密文、混淆錯誤密文以及無效錯誤密文隨NoisyRounds 組數(shù)的關系, 其中無效錯誤密文是錯誤注入到了MB 置換造成符合規(guī)律的錯誤密文, 混淆錯誤密文是錯誤注入到NoisyRounds 后得到的錯誤密文, 而有效錯誤密文才是包含實際密鑰信息的錯誤密文.
· 外部編碼對DFA 攻擊有抵抗作用. 通過實驗發(fā)現(xiàn), 外部編碼對DFA 的抵抗作用主要為外部輸出編碼的影響, 因為外部輸出編碼可看成加密算法的秘密套件, 外部輸出編碼對于攻擊者是未知的,并且外部輸出編碼不會在加密算法內部抵消, 所以攻擊者無法繞過外部編碼的影響. 現(xiàn)對帶外部編碼的WBAES 進行DFA 注入分析:
(1) 非線性外部輸出編碼: 假設明文Ai通過密鑰K 加密得到經(jīng)G 編碼的密文, 再通過在A0注入一個字節(jié)的錯誤, 得到錯誤密文, 根據(jù)章節(jié)2.2.1 的推算方法可得:
由于G0,G1,G2,G3未知, 無法確定Z 的集合, 所以該攻擊平臺不適用增加外部輸出編碼的白盒實現(xiàn).
(2) 線性外部輸出編碼: 線性外部輸出編碼可以看作是對輸出密文的128 比特到128 比特的置換,密文經(jīng)過置換后一個錯誤的字節(jié)將影響大于等于個字節(jié), 而四個字節(jié)將影響大于等于4 個字節(jié), 被編碼的密文最終不能夠被分析工具當作錯誤密文收集并且無法分析, 所以無法應用此類方法還原密鑰.
盡管NoisyRounds 使得Deadpool 平臺的DFA 工具的遍歷優(yōu)化算法失效從而導致不能提取密鑰, 但攻擊者仍可以對白盒查找表進行全遍歷注入, 進而獲取所有的錯誤密文, 其中所有的無效錯誤密文, 混淆錯誤密文以及有效錯誤密文. 對于無外部編碼的Chow-WBAES, 其查找表大小為508 KB, 逐個字節(jié)注入錯誤僅需2 小時即可完成. 因此我們假設攻擊者已經(jīng)通過全遍歷注入獲取到所有的錯誤密文, 由于加密程序和白盒查找表經(jīng)過混淆以后, DFA 分析輪組對應的查找表在整個白盒表中的位置是未知的, 攻擊者通過分析所有錯誤密文得到的密鑰為所有NoisyRounds 的隨機密鑰以及真實密鑰的集合.
表3 基于Deadpool 工具的DFA 攻擊結果Table 3 Result of DFA attack against multiple algorithms
圖4 錯誤密文對占比情況與NoisyRounds 組數(shù)關系圖Figure 4 Distribution of fault ciphertext pairs
(1) 隨機選擇明文P, 運行白盒AES 加密程序E 得到密文C.
不難發(fā)現(xiàn), 此種攻擊模型下, 攻擊者需要遍歷候選密鑰并執(zhí)行加密程序(n+1)4次, 才能夠提取出真實密鑰, 而白盒查找表的大小隨n 的變化呈正相關. 圖5 展示了提取真實密鑰所需遍歷次數(shù)和白盒查找表大小隨NoisyRounds 組數(shù)n 的變化關系.
雖然Chow 等人的白盒AES 實現(xiàn)方案存在多種破解手段, 但由于其實現(xiàn)代價小, 因此在實際中通過增加代碼混淆等軟件加固手段仍然得到廣泛應用. 本文提出了一種基于NoisyRounds 保護的白盒AES實現(xiàn)方案, 該方案通過改變Chow 等人的白盒AES 算法的第10 輪結構, 并在其后增加能夠混淆DFA 攻擊分析的輪組來抵抗DFA 攻擊. 實驗與安全性分析表明, 該方案能夠以計算復雜度為O(n4) 增大DFA針對白盒AES 攻擊的難度, 而存儲開銷以線性大小增加. 如果在NoisyRounds 保護的基礎上增加外部編碼保護, 在外部編碼未知的前提下,攻擊者將不能通過DFA 分析來進行密鑰恢復攻擊. 本文工作對于提升Chow 類型白盒AES 的抗DFA 分析能力具有參考意義. 未來我們將嘗試肖雅瑩和來學嘉提出的16比特的內部編碼的白盒AES 方案的DFA 分析和進一步研究NoisyRounds 技術對基于仿射變換的白盒SM4 實現(xiàn)的抗DFA 保護方案.
圖5 遍歷子密鑰次數(shù)和存儲開銷與n 的變化關系圖Figure 5 Relation between number of exhaustive search and storage cost