王濱,陳思,陳加棟,王星
(1.浙江大學電氣工程學院,浙江 杭州 310058;2.中國電科集團52 所??低暰W(wǎng)絡(luò)與信息安全實驗室,浙江 杭州 310053)
由于物聯(lián)網(wǎng)感知層的設(shè)備受到軟硬件資源的各種限制,而傳統(tǒng)的密碼技術(shù)需要消耗較多的資源,從而導致傳統(tǒng)的密碼技術(shù)手段很難直接應(yīng)用到感知層設(shè)備。白盒密碼作為一種軟密碼模塊,與傳統(tǒng)的密碼技術(shù)不同,能夠隱藏密鑰信息、極大地提高物聯(lián)網(wǎng)設(shè)備的安全性,同時能夠大幅降低成本,非常適用于對成本敏感的感知層設(shè)備。
白盒密碼顛覆了傳統(tǒng)密碼學對攻擊者能力的諸多限制,且應(yīng)用的成本較低,所以更適合應(yīng)對實際中的安全威脅。目前,白盒密碼已經(jīng)在數(shù)字版權(quán)保護管理、云上數(shù)據(jù)軟件加解密、移動智能終端信息加密保護等方面得到了較廣泛的應(yīng)用,引起了學術(shù)界和產(chǎn)業(yè)界的廣泛關(guān)注。
白盒密碼學的概念由Chow 等[1]提出,同時Chow 等[2]通過查找表的方式實現(xiàn)了數(shù)據(jù)加密標準(DES,data encryption standard)和AES[1]的白盒密碼算法。然而,文獻[3-4]中提出了對Chow 等白盒DES 算法的有效攻擊方法。Billet 等[5]給出了對Chow 等白盒算法的攻擊方法,被稱為BGE 攻擊。在BGE 攻擊被提出之后,Xiao 等[6]利用更大的線性編碼設(shè)計了能抵御BGE 攻擊的AES 白盒密碼算法。然而Mulder 等[7]以230的時間復雜度提取了Xiao-Lai 白盒算法[6]的密鑰。為了抵御Mulder 等的攻擊,文獻[8]在Xiao-Lai 白盒算法的基礎(chǔ)上,通過增加非線性編碼的方式設(shè)計了新的AES 白盒算法。此外,Karroumi[9]通過引入二元密文的方式實現(xiàn)了AES 白盒密碼算法,但是隨后由Mulder[10]攻破。Biryukov 等[11]提出了基于ASASA(affine-substitution-affine-substitution-affine)結(jié)構(gòu)的多變量密碼體系,并設(shè)計了基于ASASA 結(jié)構(gòu)的白盒密碼方案,通過插入擾亂項來抵抗攻擊。文獻[12]以分組密碼算法為底層模塊,設(shè)計了基于底層分組密碼算法安全性[13]的白盒密碼。文獻[14]設(shè)計了類AES 的白盒算法。文獻[15]設(shè)計了一種基于SM4 的白盒算法。此外,近年來還有其他密碼算法的白盒實現(xiàn)被研究和設(shè)計[16-18]。但是相比于其他白盒實現(xiàn)思路,基于查找表的白盒方案計算相對簡單、占用空間較小、計算效率更高。
由于白盒密碼是軟件實現(xiàn)的,因此可以很好地滿足對成本和安全都有較高要求的場景,但是當前白盒密碼技術(shù)存在以下的問題。
1)靈活性較差。為了保證加解密的安全性,需要定期更換密鑰,而現(xiàn)有的白盒算法的表是與密鑰綁定的,即靜態(tài)白盒算法,每次更換密鑰需要重新生成和更換表,甚至更換白盒算法庫。
2)實用性不好。如前所述,已有的白盒算法要么存在安全設(shè)計缺陷,容易被敵手攻擊;要么為了提高安全性,增加計算復雜度,需要占用較大的存儲和計算資源,這對當前白盒密碼的應(yīng)用場景來說不適用。
基于當前的研究現(xiàn)狀和需求,本文提出一種基于查找表的動態(tài)AES 白盒算法——DWB-AES,該算法具有以下特點。
1)具有較高的靈活性。每次更換密鑰時,不必更新表和白盒算法庫,只需要更新很小的白盒密鑰信息即可。
2)具有較高的實用性。DWB-AES 加解密過程基于查找表實現(xiàn),具有較高的運算效率和較低的存儲空間需求,尤其適合計算和存儲資源受限的物聯(lián)網(wǎng)設(shè)備。
3)具有較高的安全性。DWB-AES 對密鑰和表同時混淆,引入16 B 的混淆變換,使其能夠抵御現(xiàn)有針對白盒密碼的BGE 和Mulder 等常用攻擊方法,并且擁有較高的白盒多樣性和白盒含混度。
在白盒攻擊環(huán)境下,攻擊者可以觀察到密碼算法執(zhí)行的整個過程,為了保護密鑰,可以將加解密過程以表的形式實現(xiàn),這種思路是由Chow 等提出的。通過查找表,由輸入數(shù)據(jù)直接獲取輸出數(shù)據(jù),從而隱藏了密鑰信息。下面,將分別介紹Chow 等白盒實現(xiàn)和Xiao-Lai 白盒算法。
在Chow 等白盒實現(xiàn)里[1],通過改變輪與輪之間的邊界,將加密鑰和S盒變換組合在一起,對應(yīng)一個8 bit 雙射,稱為T盒變換。以AES-128 為例,第r輪、第i行、第j列的T盒為
其中,sr(i,j)表示行變換之后的下標。
列混淆操作每次作用在狀態(tài)矩陣的一列,對應(yīng)32×32的列混淆矩陣和32×1的列向量相乘。為了減小表大小,將列混淆矩陣MC 分割成4 個部分,即MC=(M C0,MC1,MC2,MC3),將列混淆操作MC 轉(zhuǎn)換為4 次32×8矩陣和8×1列向量相乘,并對4 個列向量相加。
為了隱藏密鑰,需要引入混淆編碼。為此,在T盒變換之前引入雙射變換,在列混淆操作之后乘32×32矩陣MB,并使用和分割矩陣MC 一樣的方法分割矩陣MB。
將T盒變換和列混淆操作結(jié)合,生成TypeII 表;TypeII=MB ? MC?T? mb,其中,mb 表示引入的雙射變換,MB 表示引入的線性變換:乘矩陣MB。為了抵消引入的線性變換和mb 雙射變換,引入TypeIII 表,對應(yīng)實現(xiàn)mb 的逆變換和MB 的逆變換。
此外,為了實現(xiàn)矩陣分割過程中的異或操作,構(gòu)造異或輔助表TypeIV,實現(xiàn)了4 bit 和4 bit 的異或操作。
和Chow 等白盒算法類似,Xiao-Lai 的AES白盒實現(xiàn)算法將加密鑰操作和S盒變換結(jié)合在一起生成T盒,這里不再贅述。與Chow 等白盒算法不同,Xiao-Lai 的AES 白盒實現(xiàn)算法的列混淆操作將 MC 分割成 2 個部分,即MC=(M C0,MC1),列混淆操作變?yōu)? 次32×16矩陣和16×1列向量相乘再相加。
構(gòu)造表TMC 為
其中,T2i+1和T2i表示相鄰的2 個T盒變換,R表示32×32矩陣線性變換,L表示16×16矩陣線性變換。將查表得到的2 個列向量直接相加,得到列混淆的結(jié)果。
行變換操作可看作乘128×128矩陣的操作,通過乘隨機矩陣來實現(xiàn)混淆,最終得到矩陣M=LSRR?1,其中,L為16×16的矩陣,SR 為行變換矩陣,R為32×32的矩陣,M矩陣既實現(xiàn)了行變換操作,又抵消了TMC 表中引入的線性變換。為了處理外部編碼,第一輪的M矩陣引入了輸入變換,最后一輪的M矩陣引入了輸出變換。
所謂動態(tài)白盒算法,就是在密鑰更換時,不需要更換查找表,可以動態(tài)地更換密鑰。其核心思想是,對密鑰引入混淆變換得到白盒密鑰,每次加密時將白盒密鑰和明文一起作為輸入?yún)?shù),進行查找表操作,最終得到輸出結(jié)果。每次更換密鑰后,只需更換白盒密鑰。
動態(tài)白盒使用流程分為初始化和加(解)密2個過程,如圖1 所示。
圖1 動態(tài)白盒使用流程
初始化過程涉及表的生成和白盒密鑰的生成,加(解)密通過查找混淆表實現(xiàn)。
動態(tài)白盒算法的實現(xiàn)流程為,對輪密鑰和數(shù)據(jù)進行行變換操作,然后乘16×16的非退化矩陣(稱該操作為L變換),從而實現(xiàn)線性混淆。對混淆后的結(jié)果進行異或操作、S盒變換、列混淆操作,最后乘32×32的非退化矩陣(稱該操作為R操作)。
涉及的表為行變換表(對應(yīng)行變換和L變換)、加密鑰表(對應(yīng)加密鑰操作ARK)、列混淆表(對應(yīng)S盒變換、列混淆操作MC 和R變換)。引入的L變換和R變換在相鄰的表之間抵消。
以AES-128 為例進行說明,通過改變輪與輪之間的邊界,并且將行變換操作提前。修改后的輪邊界如圖2 所示。下面,將描述密鑰變換和各表的構(gòu)造過程。
圖2 修改后的輪邊界
1)密鑰變換
首先對AES 密鑰進行密鑰擴展操作,得到輪密鑰。密鑰變換的過程可描述如下,以第r(1≤r≤10)輪為例。首先將輪密鑰進行變換操作。然后將密鑰矩陣的每一列分成兩部分,每2 B 為一組,得到GF(2)16上的列向量,對其進行線性變換:隨機生成16×16的非退化矩陣Li(i≤0 ≤7),計算
圖3 密鑰變換
由于AES 進行最后一次加密鑰操作后不進行行變換,因此,不對最后一次的輪密鑰進行行變換操作。對密鑰矩陣進行線性變換的過程可以寫成
其中,diag 表示對角陣。下面以加密的過程為例,描述查找表的生成方法。按照順序被查找的表依次為輸入變換表、行變換表、異或輔助表、加密鑰表、列混淆表和輸出變換表。為了更清晰地描述動態(tài)白盒實現(xiàn)的過程,將行變換表放到列混淆表后面進行說明,輸入輸出變換表放到最后進行說明。
2)加密鑰表
加密鑰表對應(yīng)加密鑰操作。對于動態(tài)白盒實現(xiàn),密鑰是可變的,由于密鑰和明文一樣是作為參數(shù)輸入的,若將其嵌入其他表里,則會導致表過于龐大,為此,單獨構(gòu)造16 bit 輸入、8 bit 輸出的加密鑰表。其中,16 bit 的輸入包含8 bit 白盒密鑰和8 bit 明文。這里的白盒密鑰是由密鑰變換過程生成的。
表構(gòu)造過程為,對8 bit 白盒密鑰和8 bit 明文先解碼,再進行異或操作得到8 bit 的數(shù)據(jù);然后對8 bit 數(shù)據(jù)進行輸出編碼:先進行線性變換,再進行非線性編碼得到輸出數(shù)據(jù)。加密鑰表如圖4 所示。
圖4 加密鑰表
3)列混淆表sTMC
與文獻[6]中的nTMC 表構(gòu)造思路相同,為了減少表的大小,將列混淆操作分成2 步,先是將列混淆矩陣MC 分割后和狀態(tài)矩陣的列相乘,最后將分割相乘的結(jié)果再相加,即
其中,將MC 進行矩陣分塊,分成2 個32×16的矩陣,即MC=(M C0,MC1),對狀態(tài)矩陣分塊,得到Tir。
列混淆表sTMC 實現(xiàn)了乘分割后的MC 矩陣:每個sTMC 表乘MC 的一部分,每輪一共有8 個sTMC 表。由于加密鑰表的輸出數(shù)據(jù)含有線性變換,因此將S盒置換嵌入列混淆表里而不是加密鑰表,sTMC 表列混淆表的輸入為16 bit,輸出為32 bit。輸入的狀態(tài)矩陣每2 B 為一組,分成8 組,分別查找8 個sTMC 表,得到8 個32 bit 的向量,后面兩兩一組進行異或,最后得到128 bit 數(shù)據(jù)。
圖5 列混淆表第1~9 輪
圖6 列混淆表第10 輪
4)行變換表
行變換操作可以看作對一個128 bit 的列向量乘128×128矩陣的變換,行變換操作可使用查找表的方式來實現(xiàn)。其涉及的線性變換如式(7)所示。
若不進行矩陣分割,行變換表大小為 2128×128 bit,這在實際中不可行。因此需要進行分割,GF(2)128上的任一列向量X可分割成32 塊,其中每塊為GF(2)4上的列向量。即xj(0≤j≤31)為GF(2)4上的列向量,則式(8)成立。
其中,M=(M0,M1,…,M31)為128×128的矩陣,Mj(0≤j≤31)為128×4的矩陣。
根據(jù)上述分割思路,可將一個 2128×128 bit 的表分割成32 個 24×128 bit 的表。下面進行具體說明。
下面是行變換表的構(gòu)造過程,行變換表的輸入為8 bit,輸出為128 bit。
輸入的8 bit 數(shù)據(jù),其中4 bit 來自乘MC0的結(jié)果,另外4 bit 來自乘MC1的結(jié)果。以狀態(tài)矩陣的第一列為例,其中4 bit 是查找表之后的結(jié)果,另外4 bit 是查找之后的結(jié)果。在行變換表里,首先對輸入數(shù)據(jù)做非線性變換,進行解碼操作,將來源不同的4 bit 數(shù)據(jù)異或,得到4 bit 列向量;然后按照上述計算式,先乘32×4的矩陣,抵消列混淆表里的線性編碼,再乘128×32的矩陣,進行行變換;最后乘128×128的矩陣,進行線性變換,得到128 bit 的列向量,其中每4 bit 一組,進行非線性編碼,得到輸出結(jié)果。表構(gòu)造的過程如圖7 和圖8 所示,在查找第1 輪TSR 之前,先進行輸入線性編碼(乘大小為128×128隨機矩陣IN),因此第一輪表的線性逆變換乘的是矩陣IN?1。
圖7 行變換表第1 輪
圖8 行變換表第2~10 輪
5)異或輔助表TXOR
行變換的矩陣乘操作被分割成32 個列向量分別乘分割后的矩陣后再相加。本文用異或輔助表實現(xiàn)異或操作,一共有32 個乘法操作,對應(yīng)32 個行變換表,每個表輸出128 bit 列向量,因此行變換輔助表實現(xiàn)32 個128 bit 列向量的加法操作,對應(yīng)31次異或操作。為了減少表大小,將31 次128 bit 異或操作分成31×32次4 bit 異或操作。異或輔助表如圖9 所示。
圖9 異或輔助表
6)輸入輸出編碼表
輸入輸出編碼均是外部編碼,輸入編碼是對輸入明文進行乘128×128非退化矩陣IN,輸出編碼是對輸出前的密文乘128×128非退化矩陣OUT,這里有
因此輸入輸出編碼表實現(xiàn)了128×128的矩陣乘法,為了減少表大小,對矩陣進行分塊,最終使用16 個規(guī)模為8×128的表來實現(xiàn)。表構(gòu)造如圖10所示。
圖10 輸入輸出編碼表
整個加密過程為,首先查找輸入編碼表和輔助異或表實現(xiàn)輸入編碼,再重復10 輪如下的表查找:查找行變換表和輔助異或表實現(xiàn)行變換,查找加密鑰表實現(xiàn)加密鑰,查找列混淆表實現(xiàn)列混淆和S 盒變換。10 輪之后,查找加密鑰表實現(xiàn)最后一輪加密鑰,最后進行輸出編碼變換得到真正的密文。
第3 節(jié)詳細介紹了動態(tài)白盒實現(xiàn)方案,把AES實現(xiàn)的各步驟都使用查找表來實現(xiàn),每個表的輸入和輸出都引入了線性變換和非線性變換來實現(xiàn)混淆,為了保證算法的正確性,在相鄰表之間引入的變換都是互逆的,即保證了在進行AES 的各步驟之前的數(shù)據(jù)都是正確的。為了實現(xiàn)動態(tài)白盒算法,預先對輪密鑰進行線性和非線性變換,其中非線性變換在加密鑰表的輸入里被抵消,而線性變換則和輸入數(shù)據(jù)的線性變換相同,并在列混淆表中被抵消。各表的構(gòu)造示意和描述均在第3 節(jié)給出說明。
下面,將分析動態(tài)白盒算法的效率。
TSR 第1 輪表的大小為 28×128 bit,表個數(shù)為16 個,對應(yīng)TXOR 表個數(shù)為480 個;第2~10 輪,每輪需要32 個表,表大小為 24×128 bit,對應(yīng)TXOR表個數(shù)為992 個。sTMC 表第1~9 輪表大小為216×32 bit,每輪需要8 個表;第10 輪表大小為216×16 bit,需要8 個表。TK 表大小為 216×8 bit,每輪需要16 個表。輸入輸出編碼表大小為 28×128 bit,表個數(shù)為32 個,對應(yīng)TXOR 表個數(shù)為960 個。各表所占空間總大小如下。
表1 3 種基于查找表的白盒方案的效率對比
輸入輸出編碼:32×28×128 bit=128 KB
因此,整個加密過程中所有表的大小為136+1296+19 456+11264+128=32 280 KB。
3 種基于查找表的白盒方案的效率對比如表1 所示。在3 種白盒實現(xiàn)里,只有Xiao-Lai 的白盒實現(xiàn)涉及了耗時多的矩陣乘法,其余均為簡單的查找表操作??紤]到空間大小,DWB-AES 所占用的空間是最大的,但仍在可接受范圍內(nèi),并且由于DWB-AES 是動態(tài)白盒,每次更換密鑰需要更換查找表的大小為0。
此外,3 種基于查找表的白盒實現(xiàn)里,只有DWB-AES 既能抵御BGE 攻擊又能抵御Mulder 等的攻擊,這將在后面的安全性分析中進行說明。
下面,使用常用的分析方法對DWB-AES 進行安全性分析型。
查找表技術(shù)通過將密鑰隱藏在表中,對表進行混淆,最終保證表空開后也無法對外泄露信息[1],并且保證任何一個表都不會泄露額外信息,也就是所謂的本地安全性。DWB-AES 生成每個表的過程中,都引入了隨機的線性變換和非線性編碼,每一個查找表都獨立引入了隨機混淆信息,因此所有的查找表都是本地安全的。
Chow 等提出了評估白盒安全性的2 個指標,即白盒多樣性和白盒含混度。白盒多樣性用來評估可選擇的混淆表的數(shù)量;白盒含混度用來評估給定表可選擇的混淆編碼的數(shù)量。白盒多樣性越大,含混度越高,則密鑰混淆的越充分,越不容易被提取密鑰。
GF(2)上的n×n階可非退化矩陣的個數(shù)為,m×n列滿秩矩陣的個數(shù)為例如GF(2)上的4×4非退化矩陣個數(shù)為20 160,由此計算本文白盒實現(xiàn)中表的白盒多樣性。
表2 給出了3 種白盒方案的白盒含混度和白盒多樣性。TK 的白盒含混度為 28!×28≈21692,TXOR 的白盒含混度為 24!×24≈248,其余表的白盒含混度計算起來比較復雜,本文僅給出粗略的下界,TSR 為(24!)2×2126≈ 2214,sTMC 為 (28!)2×2254≈23622,TOUT 為 (24!)2×2016032≈ 2536。
表2 3 種白盒方案的白盒含混度和白盒多樣性
從表2 可以看出,DWB-AES 擁有較高的白盒含混度和白盒多樣性,因此具有較高的安全性。
Billet 等提出了對Chow 等的白盒AES 算法的攻擊方法,被稱為BGE 攻擊。在Chow 的白盒設(shè)計里,表滿足了比較高的白盒多樣性和白盒含混度,從單個表里提取密鑰信息十分困難,然而由于表與表之間的混淆會相互抵消,將表組合在一起分析能更容易地提取密鑰信息。在BGE 攻擊中,將每輪的各變換當作一個整體,看作一個變換,如圖11 所示。從圖11 可以看出,每輪的輸入編碼和前一輪的輸出編碼是互逆的,即
圖11 Chow 等白盒算法流程
其次,計算出仿射變換,該步驟主要基于任意的(yi,yj)存在線性關(guān)系,即yi(x0,00,00,00)=
下面,將說明DWB-AES 可以抵御BGE 攻擊。與Chow 等白盒算法不同,DWB-AES 的算法實現(xiàn)里,每一輪的置換編碼是16 bit,(yi,yj)不一定存在線性關(guān)系。顯然,將TK、sTMC 和TSR 組合在一起分析,是最容易攻擊的。令輸入數(shù)據(jù)為(x0,x1,…,x15),令狀態(tài)矩陣的排列方式為按列排列。將第一輪TK 表數(shù)據(jù)輸入的第i個字節(jié)定義為xi,將第二輪行變換輸出(查找TSR 和XOR 表的輸出)的第i個字節(jié)定義為yi。令
其中,t=0或 1,v是u經(jīng)過加密鑰、S盒變換、列混淆、行變換之后的結(jié)果。以前2 B 為例,第1 B的v0和v1的計算式為
Mulder 等[7]對Xiao-Lai 白盒實現(xiàn)進行了攻擊,該攻擊方法是基于Biryukow 等[19]的LE 算法。LE算法給出了尋找線性變換對(A,B),使S2=B?S1?A的算法,其中S1和S2均為nbit 雙射,若存在這樣的線性變換對,則S1和S2是線性等效的,此時LE 算法輸出符合要求的線性變換對集合;否則,輸出相應(yīng)信息表示S1和S2不是線性等效的。在Xiao-Lai 白盒實現(xiàn)里,由于TMC 表只引入了線性變換
其中,(S,S)為AES 的S盒變換。因此若找到TMC和(S,S)之間的線性變換(A,B),則可將表中引入的線性變換去掉,進而提取密鑰。
Mulder 等通過觀察Xiao-Lai 白盒實現(xiàn)結(jié)構(gòu),對LE 算法進行改造,以便能在 232的復雜度內(nèi)提取密鑰。首先,Mulder 等將密鑰相關(guān)的表轉(zhuǎn)換為密鑰無關(guān)的表。其次,找到線性矩陣。最后,提取AES 密鑰。其中,找到線性矩陣的步驟是核心步驟,通過將第1 輪的TMC 表和第2 輪的列混淆操作結(jié)合,并將列混淆操作相關(guān)輸出設(shè)置為0,攻擊者可以構(gòu)造出線性等價解的集合。
下面將說明這種攻擊方法不適用于DWB-AES。由于表的輸入和輸出均增加了非線性編碼,因此使用基于LE算法及Mulder等的改造算法來尋找線性變換對(A,B)的方法不能直接被應(yīng)用。即使將非線性編碼的部分去掉,由于TSR 表的輸入分別來源于列混淆矩陣MC 和TMCi+1,線性等價的解集合的構(gòu)造將更加復雜。
該集合的大小為 224,而不是原來的 28,這將攻擊復雜度提升至 264,對于使用白盒密碼的應(yīng)用程序來說,可認為是安全的復雜度。
本文使用常用的方法對DWB-AES 進行了安全行分析,并對Chow 白盒方案、Xiao-Lai 白盒方案和DWB-AES 進行了對比,結(jié)果如表3 所示。
表3 3 種白盒方案對比
針對物聯(lián)網(wǎng)設(shè)備軟硬件資源有限,密碼模塊既要滿足安全性,又要具有較大靈活性的需求,本文提出了一種不需要更換查找表就能更換密鑰的動態(tài)白盒實現(xiàn)方法DWB-AES,在保證正確性的前提下,具有較高的安全性,可以有效地抵御BGE 攻擊和Mulder 等針對白盒算法的已知常用攻擊,由于該方法在密鑰更新時不需要更換查找表就能更新密鑰,因此應(yīng)用模式更加靈活,可以更好地滿足物聯(lián)網(wǎng)設(shè)備在安全應(yīng)用中的需求。