在加密算法中使用機(jī)密數(shù)據(jù)時(shí)保護(hù)機(jī)密數(shù)據(jù)的方法
【專利摘要】本公開(kāi)涉及一種生成算法的受保護(hù)實(shí)現(xiàn)的方法,所述方法包括:將實(shí)現(xiàn)所述算法的原始源代碼擴(kuò)展成單個(gè)真實(shí)操作集;將使用真實(shí)數(shù)據(jù)的每個(gè)真實(shí)操作與每個(gè)真實(shí)操作所使用的真實(shí)數(shù)據(jù)相組合,以獲得以這樣的方式表示的組合:該方式以不同于原始形式的形式使用實(shí)際真實(shí)數(shù)據(jù)片段;產(chǎn)生應(yīng)用于引誘數(shù)據(jù)的表示所述算法的備選實(shí)現(xiàn)的重復(fù)和變異引誘操作集;將所述引誘操作集與包括所述組合的所述真實(shí)操作集相組合,以便獲得其中所述引誘操作與所述真實(shí)操作和由所述真實(shí)操作處理的所述真實(shí)數(shù)據(jù)交互的實(shí)現(xiàn),以使得難以分析所述實(shí)現(xiàn)中的真實(shí)數(shù)據(jù)流;以及將所述實(shí)現(xiàn)變換成能夠被執(zhí)行的結(jié)果代碼。
【專利說(shuō)明】在加密算法中使用機(jī)密數(shù)據(jù)時(shí)保護(hù)機(jī)密數(shù)據(jù)的方法
【背景技術(shù)】
[0001]近年來(lái),加密在計(jì)算機(jī)軟件中的作用已變得越發(fā)重要。在過(guò)去,加密的使用限于特 定類型的應(yīng)用,但最近對(duì)隱私性以及安全性的關(guān)注已迫使應(yīng)用開(kāi)發(fā)人員響應(yīng)以顯著增加加 密在各種應(yīng)用中的使用。
[0002] 遺憾的是,加密使用的這種增加(以及其他安全性領(lǐng)域的增加)在實(shí)踐中并未顯著 提高隱私性或安全性。其中一個(gè)原因是標(biāo)準(zhǔn)加密算法基于現(xiàn)實(shí)世界中并非始終存在的前 提。
[0003] 作為所有標(biāo)準(zhǔn)加密基礎(chǔ)的基本前提是用于執(zhí)行加密操作的機(jī)密(例如密鑰)保密。 如果機(jī)密暴露,則使用這些機(jī)密保護(hù)的任何信息也暴露。在加密文獻(xiàn)中,參與信息交換的實(shí) 體被建模為不透明端點(diǎn),使得如果實(shí)體使用機(jī)密,則假設(shè)該機(jī)密對(duì)該實(shí)體保持私有,除非該 實(shí)體傳輸允許另一個(gè)實(shí)體導(dǎo)出機(jī)密的信息。
[0004] 但是,在現(xiàn)實(shí)世界中,這些實(shí)體通常是在設(shè)備上運(yùn)行的應(yīng)用,這些設(shè)備可能受到惡 意軟件攻擊或者甚至由惡意個(gè)人直接訪問(wèn)。如果攻擊者直接訪問(wèn)在設(shè)備上運(yùn)行的軟件,則 對(duì)于他們而言竊取這些應(yīng)用中由加密操作使用的任何機(jī)密通常輕而易舉。當(dāng)發(fā)生這種情況 時(shí),上述前提不再成立并且受影響的應(yīng)用將不再?gòu)募用艿氖褂弥蝎@得任何好處。
[0005] 該問(wèn)題近年來(lái)已導(dǎo)致稱為白盒加密的新領(lǐng)域,白盒加密旨在通過(guò)以防止直接從應(yīng) 用提取這些機(jī)密的形式重新實(shí)現(xiàn)加密操作來(lái)解決該問(wèn)題。在最低限度上,加密操作的白盒 版本應(yīng)該甚至在非常短的一段時(shí)間內(nèi)防止在存儲(chǔ)器中暴露機(jī)密數(shù)據(jù)。但是,在實(shí)踐中,還需 要抵抗旨在通過(guò)檢查實(shí)現(xiàn)的內(nèi)部細(xì)節(jié)而導(dǎo)出機(jī)密數(shù)據(jù)的攻擊。
[0006] 早期產(chǎn)生白盒實(shí)現(xiàn)的嘗試是高度算法特定的,即,專家必須使用專業(yè)算法知識(shí)謹(jǐn) 慎地設(shè)計(jì)用于每個(gè)算法的方法。這些白盒實(shí)現(xiàn)在防止在存儲(chǔ)器中暴露機(jī)密數(shù)據(jù)方面非常有 效,但在防止通過(guò)檢查實(shí)現(xiàn)的內(nèi)部細(xì)節(jié)而導(dǎo)出實(shí)現(xiàn)方面收效甚微。其中主要原因是大多數(shù) 加密算法依賴于整體操作的復(fù)雜性-當(dāng)從更細(xì)粒度級(jí)別觀看時(shí),這種復(fù)雜性不再存在,并且 通常可以通過(guò)相對(duì)小的整體算法部分來(lái)觀察數(shù)據(jù)流而導(dǎo)出機(jī)密。
[0007] 例如,高級(jí)加密標(biāo)準(zhǔn)(AES)算法多次執(zhí)行相同的步驟序列(每次稱為一輪),并且其 強(qiáng)度依賴于使用1〇、12或14輪(取決于密鑰大小)。如果攻擊者能夠觀察個(gè)體輪的輸入和輸 出,則他們將能夠恢復(fù)密鑰,并且遠(yuǎn)比在他們將所有輪作為單個(gè)不透明單元進(jìn)行觀察的情 況容易。
[0008] 最新解決方案已嘗試通過(guò)以下操作解決該問(wèn)題:通過(guò)人工或自動(dòng)化過(guò)程,使用其 中極其難以遵循和理解程序和數(shù)據(jù)流的重度混淆的形式來(lái)實(shí)現(xiàn)算法的白盒版本。這些解決 方案中的一些解決方案已在實(shí)踐中被證明至少在防止密鑰竊取方面非常有效。
[0009]但是,它們并未明顯減輕的一個(gè)問(wèn)題是支持新算法需要的工作量。這仍是一個(gè)需 要大量專業(yè)知識(shí)的相對(duì)手動(dòng)過(guò)程。在常見(jiàn)使用中的有限數(shù)量算法的情況下,這可能看似不 是嚴(yán)重問(wèn)題,并且實(shí)際上,對(duì)于僅需要靜態(tài)密鑰的用例而言并不是問(wèn)題,但對(duì)于需要?jiǎng)討B(tài)密 鑰的用例而言確實(shí)造成問(wèn)題。
[0010]靜態(tài)密鑰是當(dāng)生成白盒實(shí)現(xiàn)時(shí)知道的密鑰,并且是白盒解決方案的基本元素-產(chǎn) 生白盒的過(guò)程基本上涉及以難以導(dǎo)出密鑰值的形式,將靜態(tài)密鑰嵌入到加密算法的某一版 本中。動(dòng)態(tài)密鑰是僅在運(yùn)行時(shí)才知道的密鑰,這意味著動(dòng)態(tài)密鑰被傳遞到白盒而不是已經(jīng) 被嵌入白盒中,這違反了白盒的固有靜態(tài)性質(zhì)。
[0011] 為了適應(yīng)動(dòng)態(tài)密鑰,一個(gè)簡(jiǎn)單解決方案是使用另一個(gè)密鑰(并且可能使用不同算 法)對(duì)密鑰加密,其中該另一個(gè)密鑰變成嵌入白盒中的靜態(tài)密鑰。然后使用白盒對(duì)真實(shí)密鑰 解密,該真實(shí)密鑰然后與標(biāo)準(zhǔn)算法一起使用以便執(zhí)行最初預(yù)期的操作。
[0012] 該簡(jiǎn)單解決方案的問(wèn)題是當(dāng)對(duì)真實(shí)密鑰被解密時(shí)將在存儲(chǔ)器中暴露真實(shí)密鑰,這 部分地違背了起初使用白盒的目的。現(xiàn)有解決方案已嘗試通過(guò)以下操作減輕該問(wèn)題:組合 操作序列并且通過(guò)通用混淆機(jī)制使結(jié)果混淆,以便更難隔離暴露真實(shí)密鑰的點(diǎn)。這表示當(dāng) 應(yīng)用于動(dòng)態(tài)密鑰時(shí),對(duì)此類解決方案的效用的顯著妥協(xié)。
[0013] 現(xiàn)有解決方案的另一個(gè)主要問(wèn)題是它們并未解決針對(duì)白盒實(shí)現(xiàn)的特定類別攻擊, 這些攻擊通常稱為提升攻擊(lifting attack),然而更準(zhǔn)確的名稱將是上下文外(out-of-context) 攻擊 。上下文外攻擊是這樣的攻擊:其 中攻擊者使用 白盒實(shí)現(xiàn)以便代表他們執(zhí)行 加密操作,而不必曾經(jīng)知道密鑰的值。在實(shí)踐中,如果沒(méi)有針對(duì)該類攻擊的特定防御,則白 盒實(shí)現(xiàn)可能不比標(biāo)準(zhǔn)實(shí)現(xiàn)提供更多的安全性。
[0014] 為了在現(xiàn)實(shí)世界中提供足夠的加密操作保護(hù),因此需要具有這樣的白盒實(shí)現(xiàn):它 們?cè)跊](méi)有明顯削弱保護(hù)的情況下支持動(dòng)態(tài)密鑰,并且防止提升攻擊。
【發(fā)明內(nèi)容】
[0015] 本公開(kāi)描述一種直接從標(biāo)準(zhǔn)(非白盒)實(shí)現(xiàn)的源代碼自動(dòng)生成任意加密算法的白 盒實(shí)現(xiàn)的方法。
[0016] 由該方法生成的白盒實(shí)現(xiàn)被設(shè)計(jì)為防止機(jī)密數(shù)據(jù)(例如密鑰)被暴露或者由對(duì)包 含所述實(shí)現(xiàn)的程序具有完全訪問(wèn)和控制權(quán)的攻擊者以其它方式導(dǎo)出。
[0017] 本公開(kāi)還描述一種生成白盒實(shí)現(xiàn)的方法,其中所述機(jī)密數(shù)據(jù)是動(dòng)態(tài)的,即僅在運(yùn) 行時(shí)已知。這實(shí)現(xiàn)為所述第一種方法轉(zhuǎn)換任意算法的能力的邏輯擴(kuò)展,由此以支持使用動(dòng) 態(tài)機(jī)密而不在所述白盒外部暴露它們的形式,將兩個(gè)加密算法組合成單個(gè)白盒實(shí)現(xiàn)。
[0018] 最后,本公開(kāi)描述一種防止在上下文外使用白盒實(shí)現(xiàn),即防止白盒實(shí)現(xiàn)直接由攻 擊者調(diào)用以便用于惡意目的而不是由應(yīng)用調(diào)用以便用于其預(yù)期目的的方法。
[0019] 盡管本公開(kāi)的方法的主要目的是生成加密算法的白盒實(shí)現(xiàn),但所述方法本身并不 限于針對(duì)加密算法操作,盡管它們針對(duì)其它算法的效用將依賴于這些算法與加密算法共享 多少個(gè)屬性。具體地說(shuō),針對(duì)運(yùn)行時(shí)輸入數(shù)據(jù)具有高度確定性的算法通常將產(chǎn)生最有效的 結(jié)果。
[0020] 各實(shí)施例涉及一種生成以存儲(chǔ)在存儲(chǔ)器中的代碼形式表達(dá)的算法的受保護(hù)實(shí)現(xiàn) 的計(jì)算機(jī)實(shí)現(xiàn)的方法,所述方法包括:將實(shí)現(xiàn)所述算法的原始源代碼擴(kuò)展成單個(gè)真實(shí)操作 集;將使用真實(shí)數(shù)據(jù)的每個(gè)真實(shí)操作與每個(gè)真實(shí)操作所使用的真實(shí)數(shù)據(jù)相組合,以獲得以 這樣的方式表示的組合:該方式以不同于原始形式的形式使用實(shí)際真實(shí)數(shù)據(jù)片段;產(chǎn)生應(yīng) 用于引誘數(shù)據(jù)的表示所述算法的備選實(shí)現(xiàn)的重復(fù)和變異引誘操作集;將所述引誘操作集與 包括所述組合的所述真實(shí)操作集相組合,以便獲得其中所述引誘操作與所述真實(shí)操作和由 所述真實(shí)操作處理的所述真實(shí)數(shù)據(jù)交互的實(shí)現(xiàn),以使得難以分析所述實(shí)現(xiàn)中的真實(shí)數(shù)據(jù) 流;以及將所述實(shí)現(xiàn)變換成被存儲(chǔ)在所述存儲(chǔ)器中并且能夠被執(zhí)行的結(jié)果代碼。
[0021 ]根據(jù)一個(gè)實(shí)施例,所述算法是加密算法并且所述真實(shí)數(shù)據(jù)包括機(jī)密數(shù)據(jù)。
[0022]根據(jù)一個(gè)實(shí)施例,擴(kuò)展所述算法包括:由仿真器執(zhí)行所述原始源代碼,并且記錄正 在被執(zhí)行的操作、發(fā)生的控制流改變以及發(fā)生的對(duì)存儲(chǔ)器的改變;通過(guò)由所述仿真器使用 不同運(yùn)行時(shí)輸入多次執(zhí)行所述原始源代碼并且將這些執(zhí)行的結(jié)果組合成所述真實(shí)操作集 來(lái)恢復(fù)在執(zhí)行期間未被執(zhí)行的代碼;以及由所述仿真器通過(guò)將在所述執(zhí)行期間未被執(zhí)行的 缺失代碼注入所述真實(shí)操作集中來(lái)協(xié)調(diào)所述缺失代碼。
[0023]根據(jù)一個(gè)實(shí)施例,擴(kuò)展所述算法包括產(chǎn)生對(duì)所述真實(shí)操作集中的操作與在所述真 實(shí)操作間流動(dòng)的數(shù)據(jù)值之間的數(shù)據(jù)依賴性建模的數(shù)據(jù)依賴性圖。
[0024]根據(jù)一個(gè)實(shí)施例,擴(kuò)展所述算法包括消除所述真實(shí)操作集中產(chǎn)生靜態(tài)已知值的操 作,所述產(chǎn)生靜態(tài)已知值的操作包括針對(duì)所述真實(shí)數(shù)據(jù)的操作,以使得所述真實(shí)數(shù)據(jù)的每 個(gè)部分僅以最終導(dǎo)出形式存在并盡可能深入地被傳播到結(jié)果真實(shí)操作集中。
[0025] 根據(jù)一個(gè)實(shí)施例,擴(kuò)展所述算法包括減小所述真實(shí)操作集的大小,方式為:消除通 過(guò)所述仿真器的執(zhí)行生成的所述真實(shí)操作集的一部分內(nèi)聯(lián)函數(shù)代碼和展開(kāi)循環(huán),使用來(lái)自 所述原始源代碼的函數(shù)調(diào)用和循環(huán)替換這些內(nèi)聯(lián)函數(shù)代碼和展開(kāi)循環(huán),使用為函數(shù)和基本 塊分配得分的決策模型,所述得分表示與通過(guò)這種消除發(fā)生的真實(shí)數(shù)據(jù)傳播損失的成本相 對(duì)的通過(guò)消除內(nèi)聯(lián)和/或展開(kāi)獲得的收益水平。
[0026] 根據(jù)一個(gè)實(shí)施例,擴(kuò)展所述算法包括:將涉及導(dǎo)出的真實(shí)數(shù)據(jù)的所述源代碼的原 始操作拆分成多個(gè)新操作,以使得每個(gè)新操作使用一段所述導(dǎo)出的真實(shí)數(shù)據(jù);將各段所述 導(dǎo)出的真實(shí)數(shù)據(jù)變換成產(chǎn)生各段所述導(dǎo)出的真實(shí)數(shù)據(jù)塊的唯一操作子集,其中這些操作子 集使用在運(yùn)行時(shí)生成的序列敏感數(shù)據(jù)值;以及將所述操作子集插入到所述真實(shí)操作集中。
[0027] 根據(jù)一個(gè)實(shí)施例,產(chǎn)生重復(fù)和變異引誘操作集包括多次重復(fù)擴(kuò)展步驟以便產(chǎn)生多 個(gè)引誘操作集,其中為每個(gè)引誘操作集供應(yīng)隨機(jī)生成的數(shù)據(jù)而不是所述真實(shí)數(shù)據(jù),以便產(chǎn) 生表示所述算法的備選虛假實(shí)現(xiàn)的多個(gè)引誘操作集。
[0028] 根據(jù)一個(gè)實(shí)施例,將所述引誘操作集與所述真實(shí)操作集相組合包括:使來(lái)自每個(gè) 集合的操作與來(lái)自所有其它操作集的操作相交錯(cuò)以獲得組合集,使得當(dāng)所述組合集被執(zhí)行 時(shí),同時(shí)有效地執(zhí)行所有操作集;以及通過(guò)逐漸選擇多組操作并且通過(guò)將每個(gè)輸出轉(zhuǎn)發(fā)到 正確接收操作的新生成的路由操作路由所述多組操作的輸出,將來(lái)自所述組合集中不同集 合的操作的數(shù)據(jù)流彼此合并,由此使用唯一生成的不透明表達(dá)式來(lái)構(gòu)造路由操作,所述唯 一生成的不透明表達(dá)式使用在運(yùn)行時(shí)生成的序列敏感數(shù)據(jù)值。
[0029] 根據(jù)一個(gè)實(shí)施例,根據(jù)小型統(tǒng)一指令集表達(dá)所述實(shí)現(xiàn)的操作,變換所述實(shí)現(xiàn)包括: 使用公知的混淆變換將所述實(shí)現(xiàn)的操作序列變換成語(yǔ)義等同的備選形式;組合變換后的操 作序列的操作以便定義包括新指令的新的大得多的非統(tǒng)一指令集,每個(gè)新指令被定義為與 所述操作序列對(duì)應(yīng)的個(gè)體函數(shù),組合所述個(gè)體函數(shù)以產(chǎn)生所述新指令;以及使用新指令集 變換所述實(shí)現(xiàn),以便獲得包括操作的變換后實(shí)現(xiàn),每個(gè)操作對(duì)應(yīng)于所述新指令集的指令。
[0030] 根據(jù)一個(gè)實(shí)施例,變換所述實(shí)現(xiàn)包括生成執(zhí)行控制代碼,所述執(zhí)行控制代碼導(dǎo)致 以正確序列并使用正確數(shù)據(jù)執(zhí)行所述操作以便執(zhí)行所述算法,其中由解碼器功能集控制執(zhí) 行,每個(gè)所述解碼器功能被與一個(gè)操作關(guān)聯(lián),對(duì)于該操作,每個(gè)解碼器功能知道執(zhí)行該操作 需要的數(shù)據(jù)的位置、對(duì)應(yīng)指令功能的位置,以及如何對(duì)針對(duì)每個(gè)解碼器功能唯一編碼的該 數(shù)據(jù)解碼。
[0031 ]根據(jù)一個(gè)實(shí)施例,所述解碼器功能使用在運(yùn)行時(shí)生成的序列敏感數(shù)據(jù)值。
[0032] 根據(jù)一個(gè)實(shí)施例,變換所述實(shí)現(xiàn)包括根據(jù)復(fù)雜程度啟用混淆,當(dāng)將所述復(fù)雜程度 設(shè)置為最大值時(shí),啟用在變換步驟可用的所有混淆。
[0033] 根據(jù)一個(gè)實(shí)施例,所述方法包括生成所述算法的新白盒實(shí)現(xiàn),其中僅在運(yùn)行時(shí)才 知曉機(jī)密數(shù)據(jù),所述生成包括將所述實(shí)現(xiàn)與使用靜態(tài)密鑰的解密算法組合成使用動(dòng)態(tài)機(jī)密 數(shù)據(jù)的所述新白盒實(shí)現(xiàn),所述動(dòng)態(tài)機(jī)密數(shù)據(jù)被使用所述靜態(tài)密鑰預(yù)加密,所述解密算法解 密傳輸?shù)剿鰧?shí)現(xiàn)的所述動(dòng)態(tài)機(jī)密數(shù)據(jù)。
[0034] 根據(jù)一個(gè)實(shí)施例,所述方法包括生成新白盒實(shí)現(xiàn),所述新白盒實(shí)現(xiàn)針對(duì)已加密數(shù) 據(jù)執(zhí)行數(shù)據(jù)處理操作而不泄露所述已加密數(shù)據(jù)的內(nèi)容,所述生成包括將解密算法、所述實(shí) 現(xiàn)以及加密算法組合成所述新白盒實(shí)現(xiàn),其中所述解密和加密算法是彼此的逆算法并且使 用相同靜態(tài)密鑰,由此所述解密算法對(duì)要處理的數(shù)據(jù)解密,所述實(shí)現(xiàn)針對(duì)所述已解密數(shù)據(jù) 操作并且所述加密算法重新加密所述數(shù)據(jù)。
[0035] 根據(jù)一個(gè)實(shí)施例,所述方法包括防止在除包含所述實(shí)現(xiàn)的程序所指定的上下文之 外的上下文中使用所述實(shí)現(xiàn),所述防止包括:通過(guò)將隨機(jī)生成的數(shù)據(jù)或真實(shí)數(shù)據(jù)與現(xiàn)有合 并數(shù)據(jù)相混合,將合并產(chǎn)生器注入到所述程序中,其中當(dāng)所述實(shí)現(xiàn)執(zhí)行時(shí)所述合并產(chǎn)生器 生成合并數(shù)據(jù);以及將合并目標(biāo)注入到所述實(shí)現(xiàn)中,其中所述合并目標(biāo)讀取合并數(shù)據(jù)并將 這些數(shù)據(jù)與由所述實(shí)現(xiàn)內(nèi)部的操作使用的靜態(tài)數(shù)據(jù)相組合,并且其中修改由所述操作使用 的所述靜態(tài)數(shù)據(jù)以使得它們不正確并且僅當(dāng)將它們與所述合并數(shù)據(jù)組合時(shí)才產(chǎn)生所述正 確數(shù)據(jù),從而使得所述操作依賴于通過(guò)所述程序的執(zhí)行被正確地生成的所述合并數(shù)據(jù),其 中每段合并數(shù)據(jù)具有不同位置,該位置僅對(duì)需要修改該段合并數(shù)據(jù)的所述合并產(chǎn)生器已知 并且僅對(duì)所述實(shí)現(xiàn)中的所述合并目標(biāo)已知。
[0036]根據(jù)一個(gè)實(shí)施例,所述方法包括混淆每個(gè)中間數(shù)據(jù)元素,并且將每個(gè)中間數(shù)據(jù)元 素與對(duì)于該數(shù)據(jù)元素唯一并指定如何混淆該數(shù)據(jù)元素的混淆上下文相關(guān)聯(lián)。
[0037] 根據(jù)一個(gè)實(shí)施例,所述方法包括在所述實(shí)現(xiàn)中注入額外隨機(jī)化的存儲(chǔ)器訪問(wèn)操作 以便掩藏由所述真實(shí)操作展示的存儲(chǔ)器訪問(wèn)模式。
[0038] 根據(jù)一個(gè)實(shí)施例,所述方法包括隨機(jī)化由所述真實(shí)操作在存儲(chǔ)器中訪問(wèn)的所述真 實(shí)數(shù)據(jù)的數(shù)據(jù)片段的位置。
[0039] 各實(shí)施例還可以涉及一種存儲(chǔ)應(yīng)用的非瞬時(shí)性計(jì)算機(jī)可讀介質(zhì),所述應(yīng)用適于在 設(shè)備上運(yùn)行并且通過(guò)上面定義的方法生成。
[0040] 各實(shí)施例還可以涉及一種用于保護(hù)以代碼形式表達(dá)的算法的設(shè)備,所述設(shè)備被配 置為實(shí)現(xiàn)上面定義的方法以便生成所述算法的受保護(hù)實(shí)現(xiàn)。
【附圖說(shuō)明】
[0041] 圖1示出適合于實(shí)現(xiàn)本發(fā)明的一個(gè)示例性實(shí)施例的環(huán)境,
[0042] 圖2是根據(jù)一個(gè)實(shí)施例的生成白盒實(shí)現(xiàn)的方法的流程圖,
[0043] 圖3和4是根據(jù)各實(shí)施例的生成白盒實(shí)現(xiàn)的方法的各階段的流程圖,
[0044]圖5是示出根據(jù)一個(gè)實(shí)施例的部分評(píng)估步驟的調(diào)用圖的一個(gè)簡(jiǎn)化實(shí)例,
[0045]圖6是示出根據(jù)一個(gè)實(shí)施例的操作交錯(cuò)步驟的一個(gè)簡(jiǎn)化實(shí)例,
[0046] 圖7A和7B示出根據(jù)一個(gè)實(shí)施例的在數(shù)據(jù)流合并步驟之前和之后的單獨(dú)操作集的 一個(gè)簡(jiǎn)化實(shí)例。
【具體實(shí)施方式】
[0047] 將相對(duì)于示例性實(shí)施例描述本發(fā)明。所屬技術(shù)領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,本發(fā)明 可以在許多不同應(yīng)用和實(shí)施例中實(shí)現(xiàn),并且其應(yīng)用不具體限于在此示出的特定實(shí)施例。
[0048] 本發(fā)明的一個(gè)示例性實(shí)施例涉及一種生成白盒實(shí)現(xiàn)的方法,其用于直接從標(biāo)準(zhǔn) (非白盒)實(shí)現(xiàn)的源代碼自動(dòng)生成任意加密算法的白盒實(shí)現(xiàn)。
[0049] 另一個(gè)示例性實(shí)施例涉及一種生成白盒實(shí)現(xiàn)的方法,其中機(jī)密數(shù)據(jù)是動(dòng)態(tài)的,即 僅在運(yùn)行時(shí)已知。
[0050] 另一個(gè)示例性實(shí)施例涉及一種防止在上下文外使用白盒實(shí)現(xiàn),即防止白盒實(shí)現(xiàn)直 接由攻擊者調(diào)用以便用于惡意目的而不是由應(yīng)用調(diào)用以便用于其預(yù)期目的的方法。下面將 依次描述這些方法的每一種。
[0051] 圖1示出適合于實(shí)現(xiàn)本發(fā)明的一個(gè)示例性實(shí)施例的環(huán)境。電子設(shè)備CMP包括:存儲(chǔ) 器MEM,在其上存儲(chǔ)根據(jù)本發(fā)明的一個(gè)實(shí)施例的軟件;處理器(CPU)PRC,其用于執(zhí)行存儲(chǔ)在 存儲(chǔ)器MEM中的軟件;以及其它程序,它們用于控制系統(tǒng)硬件。通常,個(gè)人用戶與電子設(shè)備 CMP的交互通過(guò)諸如用戶接口之類的輸入/輸出(I/O)設(shè)備發(fā)生。I/O設(shè)備可以包括顯示設(shè)備 DSP(例如顯示器)和諸如鼠標(biāo)MS和鍵盤KEYB之類的一個(gè)或多個(gè)輸入設(shè)備和/或諸如觸摸屏 之類的其它合適的常規(guī)I/O外圍設(shè)備,以及網(wǎng)絡(luò)接口。
[0052] 存儲(chǔ)器MEM保存應(yīng)用WBGN,其能夠直接從算法的實(shí)現(xiàn)的標(biāo)準(zhǔn)源代碼PGSC自動(dòng)生成 算法的白盒實(shí)現(xiàn)。
[0053]電子設(shè)備可以是計(jì)算機(jī)或任何其它計(jì)算設(shè)備,例如智能電話、數(shù)字平板計(jì)算機(jī)或 已連接對(duì)象。
[0054]在一個(gè)示例性實(shí)施例中,電子設(shè)備CMP還與諸如因特網(wǎng)之類的網(wǎng)絡(luò)對(duì)接。所屬技術(shù) 領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,程序源代碼PGSC可以在本地存儲(chǔ)在電子設(shè)備CMP上,或者通過(guò)網(wǎng) 絡(luò)存儲(chǔ)在與電子設(shè)備對(duì)接的遠(yuǎn)程位置處。同樣,白盒生成應(yīng)用WBGN可以存儲(chǔ)在網(wǎng)絡(luò)服務(wù)器 或遠(yuǎn)程對(duì)等服務(wù)器上。
[0055] 1.生成白盒實(shí)現(xiàn)
[0056] 根據(jù)一個(gè)實(shí)施例的生成白盒實(shí)現(xiàn)的方法包括兩個(gè)主要過(guò)程P1、P2,每個(gè)過(guò)程分為 多個(gè)階段,如圖2中所示。過(guò)程P1、P2是實(shí)現(xiàn)核心生成P1和執(zhí)行機(jī)器生成P2。實(shí)現(xiàn)核心生成過(guò) 程P1生成低級(jí)操作集,這些操作實(shí)現(xiàn)輸入算法(其可以是加密算法)的初始白盒版本。該操 作集比輸入算法復(fù)雜得多,并且可以采用多種技術(shù)以便抵抗密鑰提取攻擊。
[0057] 執(zhí)行機(jī)器生成過(guò)程P2將上面產(chǎn)生的操作集(這些操作尚未采用可容易執(zhí)行形式) 變換成可執(zhí)行形式,可執(zhí)行形式可以提供防止密鑰提取攻擊的額外保護(hù)。該過(guò)程的輸出是 獨(dú)立源代碼,其可以被編譯成現(xiàn)有項(xiàng)目并且直接執(zhí)行。這通常是C源代碼但可以使用其它實(shí) 現(xiàn)語(yǔ)言,例如Java。
[0058] 所述方法的過(guò)程P1、P2接收輸入算法作為中間表示(IR),其通過(guò)解析算法源代碼 產(chǎn)生。加密算法最常以C實(shí)現(xiàn),但所述方法適用于編譯式和解釋式編程語(yǔ)言。由所述方法產(chǎn) 生的代碼可以適于由任何計(jì)算設(shè)備(例如計(jì)算機(jī)、智能電話或數(shù)字平板計(jì)算機(jī))或任何已連 接對(duì)象執(zhí)行。當(dāng)旨在執(zhí)行要保護(hù)的算法的設(shè)備圍繞開(kāi)放平臺(tái)設(shè)計(jì)和/或連接到公共網(wǎng)絡(luò)時(shí), 所述方法更加有用。
[0059] 下面更詳細(xì)地描述過(guò)程P1、P2。實(shí)現(xiàn)核心生成過(guò)程P1負(fù)責(zé)生成低級(jí)操作集,這些操 作實(shí)現(xiàn)輸入算法的初始白盒版本。根據(jù)一個(gè)實(shí)施例,過(guò)程P1包括兩個(gè)階段S11、S12-機(jī)密激 增和合并以及引誘生成:第一階段S11-機(jī)密激增和合并一將算法擴(kuò)展成大的低級(jí)操作集, 并且將每個(gè)操作與它使用的任何機(jī)密數(shù)據(jù)相組合。以不使用原始形式的實(shí)際機(jī)密數(shù)據(jù)片段 的方式來(lái)表示操作和機(jī)密數(shù)據(jù)的組合。
[0060] 第二階段S12-引誘生成一產(chǎn)生大的重復(fù)和變異引誘操作集,這些引誘操作將并 存并且與由過(guò)程P1提供的真實(shí)操作同時(shí)執(zhí)行。這些引誘與真實(shí)操作和要以這樣的方式處理 的數(shù)據(jù)交互:該方式使得通過(guò)實(shí)現(xiàn)建立可靠數(shù)據(jù)流極其困難。
[0061] 根據(jù)一個(gè)實(shí)施例,如圖3中表示,階段S11包括以下四個(gè)步驟:
[0062]-算法擴(kuò)展(步驟S31),
[0063]-部分評(píng)估(步驟S32),
[0064]-機(jī)密激增(步驟S33),以及 [0065]-機(jī)密合并(步驟S34)。
[0066]在算法擴(kuò)展步驟S31中,將算法擴(kuò)展成完整的操作集,如果給出可用的靜態(tài)輸入數(shù) 據(jù)(例如機(jī)密數(shù)據(jù)),則這些操作用于實(shí)現(xiàn)算法。這些操作表示最內(nèi)聯(lián)、展開(kāi)形式的算法。該 步驟還產(chǎn)生數(shù)據(jù)依賴性圖,其對(duì)操作與在它們之間流動(dòng)的數(shù)據(jù)值之間的所有可知數(shù)據(jù)依賴 性建模。
[0067]在部分評(píng)估步驟32中,對(duì)操作進(jìn)行部分評(píng)估,這消除產(chǎn)生靜態(tài)已知值的操作。該步 驟的主要目的是消除針對(duì)機(jī)密數(shù)據(jù)的中間操作,使得機(jī)密數(shù)據(jù)僅以最終導(dǎo)出形式存在并且 在它開(kāi)始與非靜態(tài)數(shù)據(jù)(例如要加密/解密的數(shù)據(jù)塊)的點(diǎn)存在。
[0068] 在機(jī)密激增步驟33中,將涉及導(dǎo)出機(jī)密數(shù)據(jù)的任何剩余操作拆分成多個(gè)操作,使 得與原始操作相比,每個(gè)新操作使用更小的導(dǎo)出機(jī)密數(shù)據(jù)部分。重復(fù)應(yīng)用該過(guò)程直到?jīng)]有 操作使用多于某一數(shù)量的導(dǎo)出機(jī)密數(shù)據(jù)位(這可以低至單個(gè)位)。
[0069] 在機(jī)密合并步驟34中,將所有導(dǎo)出機(jī)密數(shù)據(jù)段變換成唯一操作集,這些操作產(chǎn)生 數(shù)據(jù)而不是存儲(chǔ)數(shù)據(jù)。這些唯一操作集是序列敏感的(如下所述),這意味著它們產(chǎn)生的數(shù) 據(jù)依賴于由實(shí)現(xiàn)直到該點(diǎn)之前執(zhí)行的幾乎所有先前操作。然后將這些數(shù)據(jù)產(chǎn)生操作與使用 數(shù)據(jù)的操作相組合,使得幾乎不能區(qū)分?jǐn)?shù)據(jù)的產(chǎn)生和數(shù)據(jù)的使用。
[0070] 在算法擴(kuò)展步驟S31中,將算法擴(kuò)展成完整的操作集,如果給出可用的靜態(tài)輸入數(shù) 據(jù)(例如靜態(tài)密鑰數(shù)據(jù)),則這些操作用于實(shí)現(xiàn)算法。這些操作表示最內(nèi)聯(lián)、展開(kāi)形式的算 法。作為一個(gè)簡(jiǎn)單實(shí)例,將擴(kuò)展過(guò)程應(yīng)用于以下偽代碼:
[0072] 該偽代碼包括簡(jiǎn)單循環(huán)并且針對(duì)該循環(huán)輸入"a"和"I"。該偽代碼的擴(kuò)展最初產(chǎn)生 以下操作:
[0073] 1 a = 0
[0074] 2 i = 0
[0075] 3 a = a+10
[0076] 4 i = i+l
[0077] 5 a = a+10
[0078] 6 i = i+l
[0079] 7 a = a+10
[0080] 8 i = i+l
[0081] 9 a = a+10
[0082] 10 i = i+l
[0083] 11 a = a+10
[0084] 12 i = i+l
[0085] 在該擴(kuò)展偽代碼中,已展開(kāi)循環(huán)并且已消除條件("if")語(yǔ)句。
[0086] 包括函數(shù)調(diào)用和更多程序流控制的更復(fù)雜實(shí)例還將示出消除作為內(nèi)聯(lián)和未達(dá) (unreached)代碼的函數(shù),但是當(dāng)完成過(guò)程的其余部分時(shí),該簡(jiǎn)單實(shí)例將有助于清晰可見(jiàn)。 該擴(kuò)展步驟還產(chǎn)生數(shù)據(jù)依賴性圖,其對(duì)操作與在它們之間流動(dòng)的數(shù)據(jù)值之間的所有可知數(shù) 據(jù)依賴性建模。用于上面簡(jiǎn)單實(shí)例的該圖的表示如下:
[0087] 1 a = 0
[0088] 2 i = 0
[0089] 3 a = a{0:#1:c}+10
[0090] 4 i = i{0:#2:c}+l
[0091] 5 a = a{10:#3:c}+10
[0092] 6 i = i{l :#4:c}+l
[0093] 7 a = a{20:#5:c}+10
[0094] 8 i = i{2:#6:c}+l
[0095] 9 a = a{30:#7:c}+10
[0096] 10 i = i{3:#8:c}+l
[0097] 11 a = a{40: #9: c}+10
[0098] 12 i = i{4:#10:c}+l
[0099] 在上面的表示中,具有對(duì)另一個(gè)操作的依賴性的每個(gè)值被使用大括號(hào)中的依賴性 信息修飾,具有以下格式:
[0100] {value:#source:state}
[0101] 其中"value"是該值的運(yùn)行時(shí)內(nèi)容(在該時(shí)間點(diǎn)),"source"是產(chǎn)生該值的操作,并 且"state"指示是單獨(dú)從常量輸入(由"c"指示)還是從至少一個(gè)變量輸入(由V'指示)導(dǎo)出 值。例如,在第7行,修飾的存儲(chǔ)器位置"a"具有由第5行的操作產(chǎn)生的運(yùn)行時(shí)值20,并且單獨(dú) 從常量輸入數(shù)據(jù)導(dǎo)出值。值得注意的是,在此示出的實(shí)例僅是過(guò)程的表示,并且可能未直接 對(duì)應(yīng)于用于實(shí)現(xiàn)過(guò)程的物理表示。例如,在本發(fā)明的當(dāng)前實(shí)施例中,操作在低于在此示出的 偽代碼的級(jí)別存在,并且沒(méi)有諸如"for"循環(huán)之類的結(jié)構(gòu)。當(dāng)前實(shí)施例還將本身限于沒(méi)有多 個(gè)輸出的操作,這簡(jiǎn)化了依賴模型。但是所述過(guò)程適用于廣泛的物理表示。
[0102] 通過(guò)生成仿真器實(shí)現(xiàn)算法擴(kuò)展步驟S31,該仿真器執(zhí)行算法并且記錄在執(zhí)行期間 發(fā)生的操作,包括:
[0103] -記錄每個(gè)被執(zhí)行的操作,以及每個(gè)操作的參數(shù)的實(shí)際值和這些實(shí)際值的常量/變 量狀態(tài);
[0104] -記錄所有控制流改變,包括函數(shù)調(diào)用、函數(shù)出口、條件分支和無(wú)條件分支,但這些 控制流改變被標(biāo)記為不同于正常操作,因?yàn)樗鼈兊挠绊懸呀?jīng)存在于已記錄的正常操作中; 例如,如果調(diào)用函數(shù),則記錄將包含以下序列:1)調(diào)用操作;2)被調(diào)函數(shù)中的操作;3)函數(shù)出 口;以及4)調(diào)用方函數(shù)中的剩余操作;以及
[0105] -在圖中記錄由操作寫(xiě)入的所有存儲(chǔ)器位置的狀態(tài),該圖存儲(chǔ)要寫(xiě)入該位置的(每 個(gè))最后操作和作為該操作的結(jié)果的該位置的常量/變量狀態(tài)。如果操作的輸入值全部是常 量,則寫(xiě)入的存儲(chǔ)器位置將被記錄為常量;否則它將被記錄為變量。
[0106] 在下面表1中示出用于針對(duì)實(shí)例代碼更新存儲(chǔ)器狀態(tài)圖的方式:
[0107] 表1
[0109]表1中的每個(gè)表行表示正在被執(zhí)行的每個(gè)操作和已執(zhí)行該操作之后每個(gè)存儲(chǔ)器位 置的狀態(tài)。每個(gè)存儲(chǔ)器位置"a"和"i"由3個(gè)列表示,這3個(gè)列示出該位置的值、要寫(xiě)入該位置 的最后操作以及位置的常量/變量(c/V)狀態(tài)。位置"a"和"i"從操作1到12交替變化。當(dāng)再次 查看操作7(在第7行)時(shí),可以看到在執(zhí)行操作之前(從第6行讀取),"a"的位置具有值20并 且最后由操作5寫(xiě)入,這對(duì)應(yīng)于記錄在上面的數(shù)據(jù)依賴性圖中的依賴性信息。在執(zhí)行操作7 之后(在第7行之后),如可以看到的,位置"a"已改變并且現(xiàn)在具有值30,其最后操作現(xiàn)在被 設(shè)置為7。
[0110]使用該簡(jiǎn)單實(shí)例代碼,可能顯得使用存儲(chǔ)器狀態(tài)映射是過(guò)分之舉;狀態(tài)數(shù)據(jù)可簡(jiǎn) 單地與每個(gè)變量(a和i)關(guān)聯(lián)并且獲得相同結(jié)果。但是,真實(shí)程序具有復(fù)雜得多的存儲(chǔ)器訪 問(wèn)模式,包括陣列、結(jié)構(gòu)、已分配內(nèi)存和指針別名使用;存儲(chǔ)器狀態(tài)映射允許使用單個(gè)機(jī)制 支持所有存儲(chǔ)器訪問(wèn)模式。
[0111]當(dāng)仿真器執(zhí)行算法時(shí),某些代碼可能未被實(shí)際執(zhí)行。在某些情況下,這是希望的; 算法可以包含將從未執(zhí)行的不可達(dá)代碼或條件代碼,并且這自然由仿真過(guò)程丟棄。但是,取 決于算法,可以具有以下情況:其中代碼在仿真期間不執(zhí)行但可以處于不同條件下。當(dāng)發(fā)生 這種情況時(shí),僅基于已知靜態(tài)數(shù)據(jù),確定是否由于決策而未執(zhí)行代碼。如果是這種情況,則 簡(jiǎn)單地將代碼分類為未使用代碼;如果不是這種情況,則將代碼分類為輸入相關(guān)代碼。如果 給出將導(dǎo)致進(jìn)行備選決策的輸入集,則可以通過(guò)將缺失原始代碼與允許執(zhí)行代碼的決策邏 輯(而不是在仿真期間實(shí)際執(zhí)行的操作)一起注入到擴(kuò)展操作集中來(lái)處理輸入相關(guān)代碼。這 允許結(jié)果實(shí)現(xiàn)在面對(duì)未見(jiàn)過(guò)的輸入時(shí)工作,但重新注入的代碼將不會(huì)具有完整的依賴性信 息,這限制在后續(xù)步驟中推導(dǎo)依賴性信息的能力。
[0112] 在許多情況下,輸入相關(guān)代碼將不存在或者僅表示小部分代碼,并且因此將不會(huì) 構(gòu)成重大問(wèn)題。在其中更普遍的情況下,上面的解決方案遠(yuǎn)不夠理想,因?yàn)樗鼘⑾拗瞥浞謭?zhí) 行后續(xù)處理步驟的能力,這又可能限制由白盒過(guò)程作為整體提供的保護(hù)。為了緩解這種情 況,允許使用不同運(yùn)行時(shí)輸入多次執(zhí)行仿真,并且使用某種運(yùn)行時(shí)決策邏輯將這些仿真的 結(jié)果組合成單個(gè)擴(kuò)展操作集。如果選擇輸入以使得仿真器能夠看到所有可能執(zhí)行路徑,則 能夠構(gòu)造完整的擴(kuò)展操作集。如果檢測(cè)到每個(gè)輸入相關(guān)代碼路徑的至少一個(gè)執(zhí)行而不是代 碼路徑的所有實(shí)例,則仍能夠構(gòu)造沒(méi)有運(yùn)行時(shí)值信息的依賴性圖。
[0113] 在部分評(píng)估步驟S32中,對(duì)操作進(jìn)行部分評(píng)估,其消除產(chǎn)生靜態(tài)已知值的操作。該 步驟的主要目的是消除針對(duì)機(jī)密數(shù)據(jù)的中間操作,以使得機(jī)密數(shù)據(jù)僅以最終導(dǎo)出形式存在 并且在它開(kāi)始與非靜態(tài)數(shù)據(jù)(例如要加密/解密的數(shù)據(jù)塊)的點(diǎn)存在。因?yàn)樵摬襟E針對(duì)算法 的內(nèi)聯(lián)和展開(kāi)模型操作,并且因?yàn)闄C(jī)密數(shù)據(jù)被視為靜態(tài)輸入數(shù)據(jù),所以這導(dǎo)致消除大部分 操作。為了例示這種情況,可以將該步驟應(yīng)用于簡(jiǎn)單實(shí)例程序時(shí)的結(jié)果減少到以下行:
[0114] 1 a = 50
[0115] 2 i = 5〇
[0116] 出現(xiàn)該結(jié)果,因?yàn)獒槍?duì)存儲(chǔ)器位置"a"和"i"的所有操作產(chǎn)生靜態(tài)已知值。這兩個(gè) 位置使用常量值初始化,并且然后相繼通過(guò)將它們的當(dāng)前值與另一個(gè)常量值組合而被修 改,這意味著它們的輸出始終靜態(tài)已知。實(shí)際上,甚至這兩行代碼將不會(huì)實(shí)際存在。如果通 過(guò)使用變量"a"和"i"的其它代碼擴(kuò)展程序,則這些操作將直接使用值50和5作為常量,并且 變量" a"和"i"將不存在。如果隨后代碼不使用變量"a"和"i",則它們將完全不存在。完整的 部分評(píng)估過(guò)程相對(duì)復(fù)雜,但可以使用簡(jiǎn)單實(shí)例程序示出基本過(guò)程。從使用來(lái)自數(shù)據(jù)依賴性 圖的依賴性信息的擴(kuò)展形式開(kāi)始,可以從操作1開(kāi)始并且消除它,因?yàn)樗黠@產(chǎn)生靜態(tài)已知 數(shù)據(jù),與操作2-樣。操作3也產(chǎn)生靜態(tài)已知數(shù)據(jù),因?yàn)樗鼘⒁蕾囆孕畔⒅甘臼浅A康闹?a" 與文字值(10)組合,因此也能夠消除該操作。對(duì)于剩余操作同樣如此,這意味著能夠消除所 有剩余操作。這遺留下具有值50的變量"a"和具有值5的變量"i",但不需要產(chǎn)生這些值的任 何操作;邏輯上,存在上面示出的兩個(gè)分配,但它們將從不作為實(shí)際分配存在。
[0117] 當(dāng)考慮變量(非靜態(tài)已知)值和操作的完全內(nèi)聯(lián)和展開(kāi)性質(zhì)時(shí),過(guò)程變得更復(fù)雜。 在許多情況下,使用完全內(nèi)聯(lián)和展開(kāi)操作生成白盒實(shí)現(xiàn)不切實(shí)際;結(jié)果實(shí)現(xiàn)將太大而沒(méi)有 實(shí)際用途。為了產(chǎn)生實(shí)際實(shí)現(xiàn),需要消除某些內(nèi)聯(lián)和/或展開(kāi)。消除這些事物的問(wèn)題是它們 對(duì)操作中的靜態(tài)已知數(shù)據(jù)量做出很大貢獻(xiàn)??梢酝ㄟ^(guò)查看簡(jiǎn)單實(shí)例程序能夠得知原因。如 果展開(kāi)代碼要再次進(jìn)入循環(huán),則"a"和"i"都將變成變量(盡管單獨(dú)從常量輸入導(dǎo)出),并且 將依次"污染"使用它們的任何后續(xù)代碼,從而使它們的輸出可變。當(dāng)消除內(nèi)聯(lián)時(shí),發(fā)生類似 效果。這種情況的問(wèn)題是主要目標(biāo)是將機(jī)密數(shù)據(jù)以其最終導(dǎo)出形式盡可能遠(yuǎn)地傳播到實(shí)現(xiàn) 中,并且當(dāng)機(jī)密數(shù)據(jù)遇到任何變量數(shù)據(jù)時(shí)該傳播終止。
[0118] 部分評(píng)估步驟S32的一個(gè)目標(biāo)因此是盡可能多地消除內(nèi)聯(lián)和展開(kāi),同時(shí)最小化該 操作對(duì)通過(guò)實(shí)現(xiàn)傳播導(dǎo)出機(jī)密數(shù)據(jù)的影響。為此,建立決策模型,其中為函數(shù)和基本塊分配 得分,該得分表示與機(jī)密數(shù)據(jù)傳播的損失成本相對(duì)的通過(guò)消除內(nèi)聯(lián)/展開(kāi)獲得的收益水平。 得分的收益分量與消除將提供的代碼減少量成比例。通過(guò)對(duì)受消除影響的所有機(jī)密數(shù)據(jù)段 的傳播損失求和,計(jì)算成本分量。通過(guò)測(cè)量機(jī)密數(shù)據(jù)段在到達(dá)其最終導(dǎo)出形式之前參與的 其它操作的數(shù)量,計(jì)算個(gè)體傳播損失。成本分量的自然結(jié)果是靠近調(diào)用圖頂部的代碼將往 往比在調(diào)用圖的葉處的代碼具有更高的成本。為此,決策過(guò)程自下而上操作,并且當(dāng)已實(shí)現(xiàn) 足夠的代碼減少時(shí)終止。在圖5中示出這種情況的一個(gè)簡(jiǎn)化實(shí)例。
[0119] 圖5頂部的列編號(hào)指圖的各部分,調(diào)用圖在下面示出,每個(gè)框表示函數(shù)塊(函數(shù)名 稱在框內(nèi)部示出);更寬的框表示其中具有更多操作的函數(shù)塊。執(zhí)行的開(kāi)始在左上角;調(diào)用 由向下箭頭示出,并且函數(shù)出口由向上箭頭示出。在父函數(shù)中的循環(huán)內(nèi)執(zhí)行所有調(diào)用,并且 在向下箭頭上指示調(diào)用計(jì)數(shù)。
[0120] 在調(diào)用圖下面,示出兩行信息"H"和"CTS",其中每列與在它正上方的調(diào)用圖元素 關(guān)聯(lián)。"H"行示出對(duì)應(yīng)列中的每個(gè)元素的執(zhí)行總次數(shù)。調(diào)用圖底部的函數(shù)"e"和"f"被執(zhí)行很 多次,這是由于數(shù)個(gè)級(jí)別的循環(huán)調(diào)用所致。"CTS"行示出對(duì)應(yīng)列中的多少個(gè)操作產(chǎn)生常量導(dǎo) 出機(jī)密數(shù)據(jù)。
[0121]因?yàn)檫@是簡(jiǎn)化實(shí)例,所以消除內(nèi)聯(lián)/展開(kāi)的成本將被建模為與受影響區(qū)域中產(chǎn)生 常量導(dǎo)出機(jī)密數(shù)據(jù)的操作數(shù)量成比例。如前所述,通過(guò)測(cè)量機(jī)密數(shù)據(jù)的傳播損失來(lái)計(jì)算真 實(shí)成本。相比之下,該實(shí)例假設(shè)傳播損失始終是1;這是用于示例性目的的合理近似。
[0122] 在下面表Π 中示出從圖5的實(shí)例獲得的得分計(jì)算:
[0123] 表Π
[0126] 列"收益"中的結(jié)果被計(jì)算為"大小*H",并且列"自身成本"中的結(jié)果被計(jì)算為 "CTS*H"。通過(guò)將函數(shù)的子函數(shù)(它調(diào)用的函數(shù))的"自身成本"數(shù)值相加,計(jì)算列"子成本"中 的結(jié)果。列"成本"中的結(jié)果簡(jiǎn)單地被計(jì)算為"自身成本+子成本"。用于包括子成本的原因是 如果消除代碼區(qū)域上的內(nèi)聯(lián)/展開(kāi),則這將影響依賴于它的幾乎每一事物。在函數(shù)的情況 下,這意味著它調(diào)用的函數(shù)。最后,列"得分"中的結(jié)果被計(jì)算為"收益/(成本+1)"。如可從表 Π 看到的,函數(shù)"b"將是第一候選者,因?yàn)榫哂凶罡叩梅?。盡管它具有相當(dāng)小的收益,但它具 有零成本,從而使它成為很好的選擇。下一個(gè)候選者將是函數(shù)" e",其具有相當(dāng)高的成本,但 也具有非常大的收益。在此之后可以使用函數(shù)"f";函數(shù)"f"的收益和成本非常大,但收益仍 然勝出。函數(shù)"a"、"c"和"d"將是特別差的候選者;在調(diào)用圖頂部意味著它們具有非常大的 成本,并且它們都沒(méi)有多少的收益。
[0127] 值得注意的是,在實(shí)踐中,得分計(jì)算實(shí)際上隨著做出每個(gè)選擇而變化。具體地說(shuō), 與選擇關(guān)聯(lián)的成本將僅發(fā)生一次,并且因此也包括該成本的任何其它選擇將使它們的成本 相應(yīng)地減少。
[0128] 在步驟S33中,將涉及導(dǎo)出機(jī)密數(shù)據(jù)的任何剩余操作拆分成多個(gè)操作,以使得與原 始操作相比,每個(gè)新操作使用更小的導(dǎo)出機(jī)密數(shù)據(jù)部分??梢砸栽S多不同方式拆分每種類 型的操作。例如,考慮32位乘法操作"s*t",其中"s"是機(jī)密數(shù)據(jù)并且"t"是另一段(可能是變 量)數(shù)據(jù)。可以將該操作拆分成一系列移位和加法操作,其中每個(gè)移位操作表示來(lái)自"s"的 單個(gè)位。備選地,可以將乘法操作拆分成乘法和加法序列,其中每個(gè)乘法僅使用"s"的少量 位。對(duì)于更簡(jiǎn)單的實(shí)例,考慮以下X0R(異或)操作:
[0129] 1 s = 0xl234abcd
[0130] 2 t = 0xl0203040
[0131] 3 u = s XOR t
[0132] 與先前實(shí)例一樣,"s"是機(jī)密數(shù)據(jù)并且"t"是另一段(可能是變量)數(shù)據(jù)。為了清晰 起見(jiàn),變量"s"和"t"被示為為它們分配值;在實(shí)踐中,"s"的值將直接在X0R操作中用作文字 值,并且"t"將已經(jīng)存在并具有某個(gè)變量值??梢詫⒃摬僮鞑鸱殖砂▋蓚€(gè)X0R操作和一個(gè) 0R操作的序列,如下所示:
[0133] 1 si =0x12340000
[0134] 2 tl =0x10200000
[0135] 3 s2 = 0x0000abcd
[0136] 4 t2 = 0x00003040
[0137] 5 ul = slX0R tl
[0138] 6 u2 = s2X0R t2
[0139] 7 u = ulOR u2
[0140] 在這種情況下,通過(guò)以下操作實(shí)現(xiàn)拆分:針對(duì)"s"和"t"的頂部16位執(zhí)行XOR并且針 對(duì)底部16位執(zhí)行X0R,然后將結(jié)果與0R操作組合。將分量拆分成甚至更小的段是該方案的簡(jiǎn) 單擴(kuò)展;例如,可以使用4個(gè)X0R和3個(gè)0R將它們拆分成四個(gè)8位段。
[0141] 在此示出的實(shí)例僅涉及針對(duì)單個(gè)操作拆分機(jī)密數(shù)據(jù)。但是,在實(shí)踐中,它使用操作 序列完成,方法是將涉及機(jī)密數(shù)據(jù)的操作與依賴于第一操作的結(jié)果(并且因此依賴于機(jī)密 數(shù)據(jù))的后續(xù)操作組合。
[0142] 下面示出該情況的一個(gè)實(shí)例:
[0143] 1 s = 0xl234abcd
[0144] 2 u = s XOR t
[0145] 3 v = a+b
[0146] 4 w = u*v
[0147] 在該實(shí)例中,機(jī)密數(shù)據(jù)"s"與"t"進(jìn)行XOR以便產(chǎn)生"u",隨后在第4行使用"u"以便 產(chǎn)生V'。第3行(其不以任何方式依賴于"s")的存在用于指示"s"的相關(guān)操作可能不連續(xù); 實(shí)際上,它們可以通過(guò)許多不相干操作被分離。為了針對(duì)多個(gè)操作拆分機(jī)密數(shù)據(jù),可以重寫(xiě) 該實(shí)例,如下所示:
[0148] 1 s = 0xl234abcd
[0149] 2 v = a+b
[0150] 3 w=(s XOR t)*v
[0151] 其中第3行是這樣的表達(dá)式:將原始代碼中的"u"替換為產(chǎn)生其值的操作("s XOR t,,)。
[0152] 不是針對(duì)"s XOR t"產(chǎn)生拆分操作,而是針對(duì)表達(dá)式"(s XOR t)*v"產(chǎn)生拆分操 作,這表示針對(duì)"s"的包含兩個(gè)相關(guān)操作的序列。這可以從導(dǎo)出機(jī)密數(shù)據(jù)擴(kuò)展成任意深度的 相關(guān)操作。在整個(gè)操作集中重復(fù)應(yīng)用該激增過(guò)程直到?jīng)]有操作使用多于某一數(shù)量的導(dǎo)出機(jī) 密數(shù)據(jù)位。將每個(gè)導(dǎo)出數(shù)據(jù)段拆分成的位數(shù)還將依賴于導(dǎo)出數(shù)據(jù)如何與原始機(jī)密數(shù)據(jù)相 關(guān);如果它們密切相關(guān),則它們將往往拆分成更少量的位。
[0153] 在機(jī)密合并步驟S34中,將所有導(dǎo)出機(jī)密數(shù)據(jù)段(許多數(shù)據(jù)段可能小到單個(gè)位)變 換成唯一操作集,這些操作產(chǎn)生數(shù)據(jù)而不是存儲(chǔ)數(shù)據(jù)。這些唯一操作集是序列敏感的(如下 解釋),這意味著它們產(chǎn)生的數(shù)據(jù)依賴于由實(shí)現(xiàn)直到該點(diǎn)之前執(zhí)行的幾乎所有先前操作。然 后將這些數(shù)據(jù)產(chǎn)生操作與使用該數(shù)據(jù)的操作組合,以使得幾乎不能區(qū)分?jǐn)?shù)據(jù)的產(chǎn)生和數(shù)據(jù) 的使用。
[0154] 根據(jù)一個(gè)實(shí)施例,如圖4中所示,引誘生成階段S12包括以下步驟:
[0155] -重復(fù)和變異步驟S41;
[0156] -操作交錯(cuò)步驟S42;以及
[0157] -數(shù)據(jù)流合并步驟S43。
[0158] 在重復(fù)和變異步驟S41中,使用隨機(jī)數(shù)據(jù)替換機(jī)密數(shù)據(jù)而多次重復(fù)機(jī)密激增和合 并階段,以便產(chǎn)生表示選定算法的備選引誘實(shí)現(xiàn)的操作集。
[0159] 在操作交錯(cuò)步驟S42中,將所有生成的操作(真實(shí)和引誘)組合成單個(gè)大操作集,其 中使來(lái)自每個(gè)集合的操作與來(lái)自所有其它集合的操作交錯(cuò),以使得當(dāng)執(zhí)行組合集時(shí),有效 地執(zhí)行所有操作集。
[0160]在交錯(cuò)之后執(zhí)行數(shù)據(jù)流合并步驟S43。在執(zhí)行該步驟之前,組合操作集仍然包括不 相關(guān)操作集一它們簡(jiǎn)單地位于彼此之間。在該最后步驟中,將這些不相關(guān)操作彼此合并,使 得難以確定通過(guò)整個(gè)組合操作集的數(shù)據(jù)流。
[0161] 在重復(fù)和變異步驟S41中,使用隨機(jī)機(jī)密數(shù)據(jù)多次重復(fù)機(jī)密激增和合并階段,以便 產(chǎn)生表示選定算法的備選引誘實(shí)現(xiàn)的操作集。因?yàn)樯蛇^(guò)程依賴于機(jī)密數(shù)據(jù)的值,所以每 個(gè)生成的操作集將是唯一的。我們將此稱為變異,因?yàn)槭菇Y(jié)果有效地變異,但實(shí)際過(guò)程是使 用不同的開(kāi)始種子生成它們。默認(rèn)情況下,簡(jiǎn)單地使用隨機(jī)生成的數(shù)據(jù)取代真實(shí)機(jī)密數(shù)據(jù)。 當(dāng)不能將機(jī)密數(shù)據(jù)與隨機(jī)數(shù)據(jù)區(qū)分開(kāi)時(shí),這非常好,但如果任何機(jī)密數(shù)據(jù)沒(méi)有該屬性,則需 要使用與機(jī)密數(shù)據(jù)性質(zhì)更好地匹配的引誘數(shù)據(jù)。這通過(guò)允許算法提供算法特定過(guò)濾器加以 解決,這些過(guò)濾器調(diào)整隨機(jī)生成的數(shù)據(jù)以使它適合作為引誘機(jī)密數(shù)據(jù)。
[0162] 在操作交錯(cuò)步驟S42中,將所有生成的操作(真實(shí)和引誘)組合成單個(gè)大操作集,如 圖6中所示。圖6示出引誘操作集011、012、013、014和真實(shí)操作集1?1,它們交錯(cuò)以便獲得單個(gè) 大型組合操作集CI。在操作集CI中,使來(lái)自每個(gè)操作集DI1到DI4和RI的操作與來(lái)自所有其 它集合的操作交錯(cuò)(根據(jù)集合上面和下面的箭頭),以使得當(dāng)執(zhí)行組合集CI時(shí),有效地執(zhí)行 所有操作集DI 1到DI4和RI。交錯(cuò)被具體設(shè)計(jì)為部分重疊,以使得來(lái)自碰巧彼此靠近的不同 集合的操作之間沒(méi)有直接對(duì)應(yīng)性。具體地說(shuō),真實(shí)操作集RI始終遠(yuǎn)離組合集CI的最開(kāi)始和 最末尾。
[0163] 在步驟S42進(jìn)行交錯(cuò)之后,組合操作集仍然包括不相關(guān)操作集,它們簡(jiǎn)單地位于彼 此之間。在最后步驟S43-數(shù)據(jù)流合并中,將這些不相關(guān)操作彼此合并,以使得難以確定流 經(jīng)整個(gè)組合操作集的數(shù)據(jù)。這通過(guò)以下操作實(shí)現(xiàn):通過(guò)出站數(shù)據(jù)流逐漸選擇操作組,并且通 過(guò)新生成的操作推送所述操作組的所有輸出數(shù)據(jù),新生成的操作將所述操作組的輸出數(shù)據(jù) 路由到正確接收操作。使用唯一生成的不透明表達(dá)式構(gòu)造該路由操作,唯一生成的不透明 表達(dá)式也使用序列敏感合并(如下解釋)。為了查看這如何工作,圖7A中的實(shí)例示出使用數(shù) 據(jù)流合并組合的兩個(gè)單獨(dú)操作集。圖7A在左側(cè)示出操作"al"、"a2",并且在右側(cè)示出操作 吒1"、%2"。操作" &1"具有兩個(gè)輸入"11&1"和"12&1"。操作%1"具有兩個(gè)輸入"11131"和 "12131"。操作" &2"接收變量"11&2"和操作"&1"的輸出。操作吒2"接收變量"11&2"和操作 "bl"的輸出。為了使用數(shù)據(jù)流合并組合操作"al"、"a2"與操作"bl"、"b2",這些操作被布置 為使得在執(zhí)行操作"a2"或"b2"之前執(zhí)行操作"al"和"bl",因?yàn)樵诓僮?al"與"a2"之間并且 還在操作"bl"與"b2"之間添加額外操作。在圖7B中示出針對(duì)這些操作執(zhí)行數(shù)據(jù)流合并的結(jié) 果。在圖7B中,插入路由操作R0P以使得它將在已執(zhí)行操作"al"和"bl"之后但在執(zhí)行操作 "a2"或"b2"之前執(zhí)行。如可以看到的,操作"al"和"bl"不是將其輸出分別傳遞到"a2"和 "b2",而是將它們傳遞到路由操作R0P,路由操作R0P然后將它們繼續(xù)傳遞到正確接收者,即 操作"a2"和"b2"。由路由操作R0P使用的不透明表達(dá)式使得非常難以確定哪個(gè)輸出將轉(zhuǎn)到 哪個(gè)接收者;具體地說(shuō),經(jīng)由靜態(tài)分析幾乎不可能對(duì)此進(jìn)行確定。數(shù)據(jù)流合并過(guò)程繼續(xù)直到 已充分合并組合操作集中的所有數(shù)據(jù)流。
[0164] 通過(guò)實(shí)現(xiàn)核心生成過(guò)程產(chǎn)生的操作集不能以該形式被執(zhí)行,因此將它們變換成可 執(zhí)行形式以便產(chǎn)生能夠?qū)嶋H被使用的實(shí)現(xiàn)。執(zhí)行機(jī)器生成過(guò)程P2執(zhí)行該變換并且產(chǎn)生源代 碼,該源代碼可以被包括到軟件項(xiàng)目中并被直接調(diào)用以便執(zhí)行所需加密操作。但是,根據(jù)一 個(gè)實(shí)施例,不是執(zhí)行操作到代碼的簡(jiǎn)單直接轉(zhuǎn)換,而是過(guò)程P2生成專用機(jī)器以便執(zhí)行提供 防止密鑰提取攻擊的顯著額外保護(hù)的操作。
[0165] 在概念級(jí)別,從存在執(zhí)行引擎(其在虛擬機(jī)模型的上下文中處理虛擬程序并且執(zhí) 行由該程序指定的操作)的意義上說(shuō),生成的機(jī)器大致類似于虛擬機(jī)(VM)。但是,在實(shí)現(xiàn)級(jí) 另IJ,存在許多顯著區(qū)別:
[0166] 每個(gè)生成的機(jī)器是唯一的:對(duì)于每個(gè)機(jī)器而言,它能夠執(zhí)行的操作、它如何執(zhí)行這 些操作、表達(dá)這些操作的方式以及執(zhí)行這些操作的機(jī)制是唯一的。
[0167] 機(jī)器沒(méi)有指令集:給定機(jī)器能夠執(zhí)行的操作集可以被視為指令集,但它們沒(méi)有將 允許它們被提供名稱并以這種方式被使用的可辨別的概念意義;
[0168] 機(jī)器不執(zhí)行程序:給定機(jī)器僅能夠執(zhí)行一個(gè)特定程序并且該程序是機(jī)器本身的組 成部分,并且在許多情況下,在機(jī)器的執(zhí)行側(cè)與程序側(cè)之間沒(méi)有邊界;
[0169] 機(jī)器中沒(méi)有執(zhí)行引擎:每個(gè)機(jī)器包括大量執(zhí)行元素,這些執(zhí)行元素負(fù)責(zé)執(zhí)行操作 并且每個(gè)執(zhí)行元素還負(fù)責(zé)確定要執(zhí)行的下一個(gè)操作,并且沒(méi)有參與所有執(zhí)行步驟的"中央 引擎";
[0170] 機(jī)器沒(méi)有虛擬機(jī)模型:任何給定操作的實(shí)現(xiàn)不與特定虛擬CPU或?qū)θ绾螌?shí)現(xiàn)操作 加以任何限制的任何其它結(jié)構(gòu)相關(guān)聯(lián),并且僅有的例外是存在用于實(shí)現(xiàn)函數(shù)調(diào)用的程序堆 棧,但沒(méi)有用于機(jī)器內(nèi)部調(diào)用的規(guī)定調(diào)用慣例;以及
[0171]機(jī)器不能被靜態(tài)地分析:除了靜態(tài)分析沒(méi)有指令集的唯一機(jī)器的固有困難之外, 沒(méi)有可辨別的程序并且沒(méi)有機(jī)器模型,執(zhí)行機(jī)器的過(guò)程完全依賴于序列敏感合并操作(如 下解釋),并且在執(zhí)行已到達(dá)該部分之前不能理解機(jī)器的任何部分(甚至不能由機(jī)器自身理 解)。
[0172] 根據(jù)一個(gè)實(shí)施例,如圖2中所示,生成機(jī)器的過(guò)程包括以下步驟:
[0173] 操作重新表達(dá)步驟S21,其將由實(shí)現(xiàn)核心生成過(guò)程P1產(chǎn)生、根據(jù)小型統(tǒng)一指令集表 達(dá)的操作集變換成根據(jù)大得多的非統(tǒng)一指令集表達(dá)的操作;
[0174] 操作實(shí)現(xiàn)步驟S22,其產(chǎn)生從步驟S21獲得的重新表達(dá)后的操作的實(shí)現(xiàn);
[0175] 序列合并步驟S23,其變換操作實(shí)現(xiàn)以便利用序列敏感合并抵抗靜態(tài)分析;以及
[0176] 代碼生成步驟S24,其應(yīng)用于由序列合并步驟S23產(chǎn)生的實(shí)現(xiàn)的所有分量,并且準(zhǔn) 備以可執(zhí)行形式被輸出。
[0177] 盡管操作重新表達(dá)步驟S21的輸出被稱為具有指令集,但嚴(yán)格地說(shuō)它沒(méi)有資格作 為指令集,因?yàn)榘诿總€(gè)指令中的子操作彼此沒(méi)有有意義的概念關(guān)系(這種關(guān)系將允許 它們被提供統(tǒng)一名稱以便在傳統(tǒng)意義上如同指令那樣被使用)。例如,"function call"指 令通常將包括子操作序列,這些子操作具有單獨(dú)意義(例如將值推送到堆棧上,跳轉(zhuǎn)到另一 個(gè)程序位置等),但還具有組合意義,該組合意義允許它們被共同表達(dá)為具有名稱 "function call"的單個(gè)指令?,F(xiàn)在考慮與指令(該指令將1234加到寄存器rO以形成新指 令)相組合的該函數(shù)調(diào)用序列。該新指令將必須被稱為"ca 11 f unct ion&add 1234,r0"(或 類似事物)以便表示它執(zhí)行的操作。如果說(shuō)以這種方式組合十個(gè)或更多指令,則得到的新指 令名稱將太復(fù)雜并且太具體而沒(méi)有概念意義。
[0178] 為了實(shí)現(xiàn)所需變換,以兩個(gè)步驟執(zhí)行步驟S21;即,第一步驟一操作重寫(xiě)和第二步 驟一操作組合。第一步驟-操作重寫(xiě)-使用諸如不透明表達(dá)式、算術(shù)/邏輯重寫(xiě)和蠻力等效代 碼生成之類的公知混淆變換,將操作序列變換成語(yǔ)義等同的備選形式。使用隨機(jī)選擇的混 淆變換,隨機(jī)選擇和變換操作序列。重復(fù)該過(guò)程直到已發(fā)生足夠級(jí)別的變換。在該過(guò)程期 間,可以多次變換每個(gè)個(gè)體操作。該步驟的主要目的是降低代碼的一致性以便進(jìn)行第二步 驟?;煜儞Q的使用還有助于使結(jié)果代碼更難以理解,但這不是整體過(guò)程的關(guān)鍵要素。
[0179] 第二步驟-操作組合-組合操作序列以便產(chǎn)生新指令集,其中每個(gè)指令表示被組合 以便產(chǎn)生指令的操作序列。組合過(guò)程的工作方式(根據(jù)每個(gè)函數(shù))是:從第一操作開(kāi)始,并且 選擇隨機(jī)數(shù)量的后續(xù)操作以便與第一操作相組合。這些操作被組合并且與新指令索引關(guān) 聯(lián)。該過(guò)程然后移到下一個(gè)可用(非組合)操作并且將該操作與隨機(jī)數(shù)量的后續(xù)操作相組 合,以此類推直到已處理所有操作。該步驟的目的是產(chǎn)生新指令集,其中在組成每個(gè)指令的 操作之間沒(méi)有概念關(guān)系。這可以單獨(dú)通過(guò)組合過(guò)程實(shí)現(xiàn),但將組合過(guò)程應(yīng)用于重寫(xiě)步驟的 非統(tǒng)一結(jié)果將產(chǎn)生有效得多的結(jié)果。
[0180] 上述操作組合步驟簡(jiǎn)單而有效,然而可以以各種方式對(duì)其改進(jìn)。例如,當(dāng)過(guò)程到達(dá) 函數(shù)的末尾時(shí),可用于組合的操作數(shù)量將減少,其中最壞情況是從單個(gè)操作性質(zhì)最后新指 令。這在實(shí)踐中不可能造成重大問(wèn)題,因?yàn)樵谠撾A段代碼的高度展開(kāi)和內(nèi)聯(lián)性質(zhì)將意味著 這影響相對(duì)微小的代碼部分。如果這確實(shí)變成問(wèn)題,則可以通過(guò)以下操作消除該問(wèn)題:預(yù)計(jì) 算組合序列并且隨機(jī)重新分布其邊界,直到所有序列具有足夠的最小大小。
[0181] 操作實(shí)現(xiàn)步驟S22產(chǎn)生來(lái)自前一個(gè)步驟S21的重新表達(dá)后的操作的實(shí)現(xiàn)。操作實(shí)現(xiàn) 包括以下部分:
[0182] 1.操作的子操作實(shí)現(xiàn)部分,它們被組合以便產(chǎn)生新指令;
[0183] 2.參數(shù)解碼邏輯一可以在多個(gè)上下文中執(zhí)行某些操作(大致相當(dāng)于執(zhí)行程序);這 些操作將接收參數(shù)形式的上下文特定輸入和輸出,這些參數(shù)針對(duì)每個(gè)操作被唯一編碼;以 及
[0184] 3.執(zhí)行連續(xù)邏輯一在已執(zhí)行每個(gè)操作之后,對(duì)下一個(gè)操作及其上下文(如果有)解 碼,并且然后通過(guò)該操作的實(shí)現(xiàn)繼續(xù)執(zhí)行。
[0185] 序列合并步驟S23變換操作實(shí)現(xiàn)以便利用序列敏感合并(如下解釋)抵抗靜態(tài)分 析。在該階段之前,操作實(shí)現(xiàn)直接鏈接到彼此,并且每個(gè)操作實(shí)現(xiàn)對(duì)它自己的輸入/輸出和 合并參數(shù)靜態(tài)解碼。在該階段之后,每個(gè)操作實(shí)現(xiàn)鏈接到解碼器實(shí)現(xiàn),解碼器實(shí)現(xiàn)又鏈接到 下一個(gè)操作實(shí)現(xiàn)。解碼器實(shí)現(xiàn)負(fù)責(zé)對(duì)下一個(gè)操作實(shí)現(xiàn)的位置及其參數(shù)解碼,并且使用序列 敏感合并值,根據(jù)解碼器實(shí)現(xiàn)對(duì)這些參數(shù)唯一編碼。
[0186] 將通過(guò)操作實(shí)現(xiàn)繼續(xù)鏈接的特定解碼器實(shí)現(xiàn)是上下文特定的,即操作實(shí)現(xiàn)接收該 特定解碼器實(shí)現(xiàn)作為參數(shù),并且沒(méi)有它將鏈接到的解碼器的靜態(tài)知識(shí)。該變換的結(jié)果是操 作實(shí)現(xiàn)通過(guò)上下文特定的動(dòng)態(tài)解碼器集(它們僅在使用點(diǎn)被解析)彼此分離,從而使操作序 列的靜態(tài)分析極其困難。
[0187] 在已完成序列合并步驟S23之后,準(zhǔn)備以可執(zhí)行形式輸出實(shí)現(xiàn)的所有分量。在最后 步驟S24-代碼生成中,所有操作實(shí)現(xiàn)被共同呈現(xiàn)為獨(dú)立源代碼段,其能夠被編譯成現(xiàn)有項(xiàng) 目并被直接執(zhí)行一這通常是C源代碼但可以使用其它實(shí)現(xiàn)語(yǔ)言。
[0188] 過(guò)程P2涉及生成執(zhí)行機(jī)器,該執(zhí)行機(jī)器能夠執(zhí)行白盒實(shí)現(xiàn)。除了由在過(guò)程P1中執(zhí) 行的其它白盒生成步驟使用的技術(shù)之外,該機(jī)器生成還使用步驟S21、S22、S23的混淆技術(shù)。
[0189] 執(zhí)行機(jī)器的生成假設(shè)將在執(zhí)行機(jī)器中的任何位置采用所有這些額外混淆。在某些 情況下仍然可以如此,但經(jīng)驗(yàn)已顯示這些混淆與由過(guò)程P1的其它白盒生成步驟使用的混淆 相比不太有效(就保護(hù)加密算法而言),并且在性能影響和代碼大小方面屬于最昂貴的混 淆。
[0190] 根據(jù)一個(gè)實(shí)施例,為了最大化最有效混淆的使用并且對(duì)整體性能/大小影響提供 更多控制,以可變混淆復(fù)雜性生成執(zhí)行機(jī)器,其中復(fù)雜性可以在每個(gè)操作級(jí)別變化以便實(shí) 現(xiàn)最大控制。在最低復(fù)雜性級(jí)別,操作的已生成代碼基本上是操作的簡(jiǎn)單C實(shí)現(xiàn),在操作與 它處理的數(shù)據(jù)之間具有很少(如果有)重定向機(jī)制。在該復(fù)雜性級(jí)別生成的代碼通常比在最 大復(fù)雜性生成的代碼快10-100倍,并且還明顯更小。對(duì)于任何給定操作,可以將復(fù)雜性級(jí)別 設(shè)置為最小與最大復(fù)雜性之間的廣泛級(jí)別之一。當(dāng)級(jí)別增加時(shí),逐漸啟用可用于機(jī)器生成 的各種混淆,其中最大級(jí)別采用所有可用混淆。
[0191] 盡管每個(gè)操作可以具有個(gè)體復(fù)雜性級(jí)別,但在實(shí)踐中可以在更大粒度指定復(fù)雜性 級(jí)別,主要在輸入代碼中的每個(gè)函數(shù)級(jí)別,并且在某些情況下,在函數(shù)中的每個(gè)塊級(jí)別處指 定復(fù)雜性級(jí)別。經(jīng)由代碼注釋在輸入代碼中指定復(fù)雜性級(jí)別。還可以在全局基礎(chǔ)上增加或 減小應(yīng)用于輸入代碼的復(fù)雜性級(jí)別,從而允許以各種不同復(fù)雜性容易地生成執(zhí)行機(jī)器。根 據(jù)一個(gè)實(shí)施例,實(shí)現(xiàn)簡(jiǎn)單線性伸縮操作,但非線性模型也是可能的。
[0192] 根據(jù)各實(shí)施例,序列敏感合并的概念用于多個(gè)步驟(334、343、323),并且對(duì)提供效 用起著重要作用。在高級(jí)別,序列敏感合并是一種方法,其允許程序元素依賴運(yùn)行時(shí)生成的 數(shù)據(jù)(其看似具有隨機(jī)性質(zhì)),以使得僅當(dāng)在程序元素執(zhí)行時(shí)該數(shù)據(jù)恰好具有正確值時(shí),程 序元素才被正確執(zhí)行。該技術(shù)用于以某種方式使這些程序元素的邏輯和數(shù)據(jù)混淆,該方式 極其難以靜態(tài)解析,因?yàn)橹钡秸趯?shí)際執(zhí)行程序元素才知道邏輯和數(shù)據(jù)的某一部分。為使 其工作,預(yù)先知道數(shù)據(jù)生成序列,以使得能夠使用補(bǔ)償操作修改使用數(shù)據(jù)的程序元素,這些 補(bǔ)償操作將生成的數(shù)據(jù)變換成特定已知值而不在使用點(diǎn)泄露這些值。
[0193] 為了有效地防止靜態(tài)分析,數(shù)據(jù)生成過(guò)程可以復(fù)雜到足以使攻擊者不能預(yù)先預(yù)測(cè) 數(shù)據(jù)序列。這通過(guò)在程序中注入大量數(shù)據(jù)變異操作而實(shí)現(xiàn),其中每個(gè)變異操作針對(duì)數(shù)據(jù)生 成緩沖器執(zhí)行唯一操作序列。這些操作可以被設(shè)計(jì)為最大化數(shù)據(jù)緩沖器中的位的混合。
[0194] 操作之間的數(shù)據(jù)流混淆涉及組合真實(shí)和引誘操作的輸出。可以進(jìn)一步使數(shù)據(jù)元素 本身混淆以便防止提取有用的中間數(shù)據(jù)。中間數(shù)據(jù)混淆可以應(yīng)用于在白盒內(nèi)部產(chǎn)生的幾乎 任何數(shù)據(jù)元素,并且在實(shí)踐中,理想地應(yīng)用于每一個(gè)數(shù)據(jù)元素。根據(jù)一個(gè)實(shí)施例,通過(guò)將每 個(gè)中間數(shù)據(jù)元素與混淆上下文關(guān)聯(lián),使實(shí)現(xiàn)的中間數(shù)據(jù)元素混淆,該混淆上下文對(duì)于該數(shù) 據(jù)元素是唯一的并且指定如何使數(shù)據(jù)元素混淆。例如,如果通過(guò)對(duì)數(shù)據(jù)元素加密而使其混 淆,則混淆上下文將包含該元素的加密密鑰。當(dāng)數(shù)據(jù)元素由操作寫(xiě)入時(shí),將使用混淆上下文 使其混淆,并且當(dāng)它由另一個(gè)操作讀取時(shí),將使用相同混淆上下文使其被解除混淆。這確保 將數(shù)據(jù)元素以混淆形式存儲(chǔ)在存儲(chǔ)器中,但是當(dāng)針對(duì)數(shù)據(jù)元素操作時(shí),將其轉(zhuǎn)換成非混淆 形式。因?yàn)槊總€(gè)數(shù)據(jù)元素使用唯一混淆上下文(例如,如果加密,則每個(gè)數(shù)據(jù)元素將具有唯 一加密密鑰),所以攻擊者要想了解整體中間數(shù)據(jù),他將必須針對(duì)每個(gè)個(gè)體數(shù)據(jù)元素打破混 淆,這通常不切實(shí)際。
[0195] 2.使用動(dòng)態(tài)機(jī)密的白盒實(shí)現(xiàn)
[0196] 使用動(dòng)態(tài)機(jī)密的白盒實(shí)現(xiàn)方法促進(jìn)白盒實(shí)現(xiàn)的生成,其中機(jī)密數(shù)據(jù)是動(dòng)態(tài)的,即 僅在運(yùn)行時(shí)已知。靜態(tài)密鑰是白盒解決方案的基本要素。產(chǎn)生白盒的過(guò)程基本上涉及以難 以導(dǎo)出密鑰值的形式,將靜態(tài)密鑰嵌入到加密算法的某一版本中。相比之下,動(dòng)態(tài)密鑰被傳 遞到白盒而不是已經(jīng)被嵌入白盒中,后者違反了白盒的固有靜態(tài)性質(zhì)。根據(jù)一個(gè)實(shí)施例,可 以通過(guò)以下操作解決該問(wèn)題:組合兩個(gè)加密算法,并且從組合后的算法生成單個(gè)白盒實(shí)現(xiàn)。 執(zhí)行該操作的能力是白盒生成(圖2)方法針對(duì)任意加密算法操作的能力的結(jié)果,這自然包 括組合兩個(gè)或更多算法的結(jié)果。
[0197] 為了將動(dòng)態(tài)密鑰Kd與選定算法Ad-起使用,首先使用合適的算法(例如AES)和對(duì) 應(yīng)密鑰Kaes對(duì)密鑰Kd加密,以便產(chǎn)生已加密密鑰Kde:
[0198] Kde = EncryptAES(Kaes ,Kd)
[0199] 為了簡(jiǎn)單起見(jiàn),假設(shè)預(yù)先產(chǎn)生已加密密鑰Kde,并且密鑰Kd從未存在于其中運(yùn)行白 盒實(shí)現(xiàn)的設(shè)備上。動(dòng)態(tài)密鑰Kd的已加密版本Kde可以被傳遞并且被存儲(chǔ)在白盒外部而不泄 露動(dòng)態(tài)密鑰值。為了安全地使用動(dòng)態(tài)密鑰Kd,生成白盒實(shí)現(xiàn),其將對(duì)已加密版本Kde解密以 便恢復(fù)動(dòng)態(tài)密鑰Kd。然后可以將動(dòng)態(tài)密鑰Kd與算法Ad-起使用以便執(zhí)行選定操作。整體操 作如下所示:
[0200] output=Ad(DecryptAES(Kaes ,Kde), input)
[0201] 為了生成白盒實(shí)現(xiàn),簡(jiǎn)單地組合算法DecryptAES與Ad的源代碼并且產(chǎn)生頂級(jí)函 數(shù),該頂級(jí)函數(shù)使用所述算法實(shí)現(xiàn)上面的操作。注意,如果算法Ad也碰巧是算法 DecryptAES,則輸入代碼將僅包含單個(gè)算法,頂級(jí)函數(shù)將調(diào)用該算法兩次。白盒生成方法然 后將生成單個(gè)白盒實(shí)現(xiàn),其在白盒的保護(hù)邊界內(nèi)將整個(gè)操作作為單個(gè)單元執(zhí)行。相同機(jī)制 還將防止從白盒提取已解密密鑰Kd,這些機(jī)制通過(guò)觀察經(jīng)過(guò)白盒的數(shù)據(jù)流而防止密鑰導(dǎo) 出。
[0202] 上述方法是用于將動(dòng)態(tài)密鑰與白盒實(shí)現(xiàn)一起使用的數(shù)種可能方法之一,然而它們 全部共享在單個(gè)實(shí)現(xiàn)中組合兩個(gè)或更多加密算法的通用要素。在單個(gè)白盒中組合多個(gè)算法 的通用概念的進(jìn)一步擴(kuò)展將是允許針對(duì)已加密數(shù)據(jù)執(zhí)行操作而不泄露數(shù)據(jù)內(nèi)容。這可以通 過(guò)以下操作實(shí)現(xiàn):組合解密操作DecryptAES、針對(duì)數(shù)據(jù)的操作DataOp以及加密操作 EncryptAES,如以下實(shí)例中所示:
[0203] output = EncryptAES(Kaes ,DataOp(DecryptAES(Kaes, input)))
[0204] 3.防止上下文外使用
[0205] 攻擊者可能采取兩種主要方式以便試圖在未由應(yīng)用創(chuàng)建者指定的上下文中使用 白盒實(shí)現(xiàn)。
[0206] 攻擊1:隔離實(shí)現(xiàn)并且將其復(fù)制到另一個(gè)程序中。這對(duì)于有能力的攻擊者而言相對(duì) 輕而易舉地完成。某些要素可能使該操作在實(shí)踐中稍微更復(fù)雜一例如,可能必須將代碼放 在特定存儲(chǔ)器位置處以便執(zhí)行它一但是有能力的攻擊者將相當(dāng)迅速地克服這些復(fù)雜性。
[0207] 攻擊2:復(fù)制包含實(shí)現(xiàn)的整個(gè)程序并且直接從另一個(gè)程序調(diào)用該實(shí)現(xiàn)。可以通過(guò)幾 種不同方式執(zhí)行該操作,但關(guān)鍵要素是實(shí)現(xiàn)未與使用它的程序分離。在實(shí)踐中,該攻擊可以 比前一個(gè)攻擊稍微更困難,但這在有能力的攻擊者的能力范圍內(nèi),并且在某些情況下可能 甚至更容易。
[0208] 根據(jù)一個(gè)實(shí)施例,可以通過(guò)以下操作防止攻擊1:將完整性檢查防篡改解決方案應(yīng) 用于包含白盒實(shí)現(xiàn)的應(yīng)用,以使得白盒代碼包含防篡改檢查,這些檢查檢驗(yàn)應(yīng)用的其余部 分實(shí)際存在于預(yù)期存儲(chǔ)器位置中。如果攻擊者然后試圖僅將白盒代碼復(fù)制到另一個(gè)程序 中,則包含在白盒代碼中的防篡改檢查將失敗并且代碼將拒絕執(zhí)行。為使該方式最有效,防 篡改解決方案應(yīng)利用由白盒實(shí)現(xiàn)提供的大型代碼主體,并且自動(dòng)將大量完整性檢查注入到 該代碼中以盡可能使攻擊者難以擊敗它們并且在上下文外使用代碼。
[0209] 攻擊2明顯更難以防止,并且防止攻擊2的方法使用部分在白盒實(shí)現(xiàn)外部的額外機(jī) 制。該額外機(jī)制是完整性檢查防篡改解決方案的擴(kuò)展,稱為"上下文強(qiáng)制"。值得注意的是, 由該機(jī)制使用的基本方法的應(yīng)用超出其在本公開(kāi)中的使用。
[0210] 上下文強(qiáng)制背后的核心理念是在白盒實(shí)現(xiàn)的內(nèi)部細(xì)節(jié)與使用它的程序之間引入 合并,以使得僅程序?qū)Π缀械念A(yù)期使用將產(chǎn)生正確結(jié)果。在高級(jí)別,該過(guò)程涉及將合并產(chǎn)生 器注入到程序中,并且將合并目標(biāo)注入到白盒實(shí)現(xiàn)中。當(dāng)程序執(zhí)行時(shí)合并產(chǎn)生器生成合并 數(shù)據(jù),并且合并目標(biāo)將該數(shù)據(jù)與在白盒實(shí)現(xiàn)內(nèi)部執(zhí)行的操作相組合。
[0211] 構(gòu)造合并數(shù)據(jù)與白盒操作的組合以使得通過(guò)程序的正常執(zhí)行產(chǎn)生的合并數(shù)據(jù)不 會(huì)導(dǎo)致白盒操作的結(jié)果變化,而異常程序執(zhí)行(包括根本沒(méi)有執(zhí)行)導(dǎo)致操作產(chǎn)生不正確結(jié) 果。基本過(guò)程包括以下步驟:
[0212] 1.在應(yīng)用中選擇位置集以便用作合并產(chǎn)生器;
[0213] 2.對(duì)于每個(gè)合并產(chǎn)生器,注入產(chǎn)生合并數(shù)據(jù)的代碼;
[0214] 3.在白盒實(shí)現(xiàn)中選擇操作集以便用作合并目標(biāo);以及
[0215] 4.變換每個(gè)合并目標(biāo)以便將合并數(shù)據(jù)段與其現(xiàn)有操作相組合。
[0216] 選定位置沿著到達(dá)白盒實(shí)現(xiàn)的一個(gè)或多個(gè)稀疏執(zhí)行路徑分布,并且這些稀疏執(zhí)行 路徑表示到達(dá)實(shí)現(xiàn)的所有可能路徑的超集。例如,在具有到達(dá)實(shí)現(xiàn)的10個(gè)不同路徑的簡(jiǎn)單 程序中,可以存在在所有10個(gè)路徑中出現(xiàn)的3個(gè)位置。這3個(gè)位置表示到達(dá)實(shí)現(xiàn)的稀疏執(zhí)行 路徑,并且因此可以用作上下文強(qiáng)制的位置。另一個(gè)實(shí)例將是具有到達(dá)實(shí)現(xiàn)的10個(gè)路徑的 簡(jiǎn)單程序,其中這些路徑的一半全部通過(guò)相同3個(gè)位置,但另一半全部通過(guò)不同的3個(gè)位置。 該程序?qū)⒕哂杏糜趦山M3個(gè)位置的兩個(gè)稀疏執(zhí)行路徑。稀疏執(zhí)行路徑可以交叉并且甚至彼 此"包含",沒(méi)有關(guān)于它們的相對(duì)拓?fù)涞南拗?。僅有的要求是到達(dá)實(shí)現(xiàn)的所有可能路徑由至 少一個(gè)稀疏執(zhí)行路徑表示。
[0217] 每個(gè)產(chǎn)生器通常產(chǎn)生多個(gè)合并數(shù)據(jù)段并且將每個(gè)段存儲(chǔ)在其關(guān)聯(lián)存儲(chǔ)位置中。存 儲(chǔ)位置可以屬于當(dāng)前產(chǎn)生器或者在它之前執(zhí)行的任何產(chǎn)生器。如果位置屬于當(dāng)前產(chǎn)生器, 則它將初始化該位置并簡(jiǎn)單地將數(shù)據(jù)寫(xiě)入該位置。如果位置屬于前一個(gè)產(chǎn)生器,則將當(dāng)前 合并數(shù)據(jù)與已經(jīng)在該位置處的數(shù)據(jù)相合并。以多種方式產(chǎn)生合并數(shù)據(jù)。最簡(jiǎn)單的方法涉及 執(zhí)行變換(靜態(tài)產(chǎn)生的)隨機(jī)輸入值的唯一已生成操作序列,并且使用這些操作的結(jié)果作為 合并數(shù)據(jù)。還可以通過(guò)以下操作產(chǎn)生合并數(shù)據(jù):組合其它合并數(shù)據(jù)段(例如由先前產(chǎn)生器產(chǎn) 生的數(shù)據(jù))并且使用由應(yīng)用本身產(chǎn)生的選定值。當(dāng)程序包含多個(gè)稀疏執(zhí)行路徑(幾乎所有不 簡(jiǎn)單程序都將如此)時(shí),也構(gòu)造合并產(chǎn)生器以使得所有稀疏路徑產(chǎn)生相同合并數(shù)據(jù)集。沒(méi)有 這一點(diǎn),白盒實(shí)現(xiàn)將僅從一個(gè)稀疏路徑(最多)正確地操作。
[0218] 選擇步驟通常優(yōu)選對(duì)整體加密操作具有重大影響的操作。但是,因?yàn)檫@可以針對(duì) 許多加密算法產(chǎn)生選擇群集,所以還優(yōu)選地在實(shí)現(xiàn)中盡可能多地分布選定位置。另一個(gè)重 要選擇準(zhǔn)則是操作對(duì)支持合并變換的適合性。盡管并非所有操作都將是有效目標(biāo),但許多 操作在實(shí)踐中是有效目標(biāo)并且它們?cè)趯?shí)現(xiàn)中良好分布,因此該準(zhǔn)則對(duì)其它準(zhǔn)則具有很小的 影響。構(gòu)造每個(gè)變換以使得僅合并數(shù)據(jù)的預(yù)期值將導(dǎo)致操作產(chǎn)生的結(jié)果與變換之前產(chǎn)生的 結(jié)果相同。所有其它值將產(chǎn)生不正確結(jié)果。
[0219] 為了防止攻擊者簡(jiǎn)單地在使用合并數(shù)據(jù)之前轉(zhuǎn)儲(chǔ)合并數(shù)據(jù)并且然后在出于他自 己的目的而使用白盒之前重新產(chǎn)生該數(shù)據(jù),以一種使轉(zhuǎn)儲(chǔ)相當(dāng)困難的方式存儲(chǔ)合并數(shù)據(jù)。 每個(gè)合并數(shù)據(jù)段具有不同位置,該位置由一個(gè)特定合并產(chǎn)生器(每個(gè)稀疏執(zhí)行路徑)擁有并 且可由需要更新它的其它產(chǎn)生器訪問(wèn)。存在幾種不同類型的位置:
[0220] ?靜態(tài)位置,其通常位于存儲(chǔ)器中程序的可寫(xiě)入部分中,更像全局變量;
[0221 ] ?堆位置,其通過(guò)堆分配動(dòng)態(tài)產(chǎn)生;以及
[0222] ?堆棧位置,其經(jīng)由堆棧移位動(dòng)態(tài)產(chǎn)生。
[0223] 堆棧位置可以僅由在到達(dá)白盒實(shí)現(xiàn)的調(diào)用路徑(與執(zhí)行路徑相反)上的合并產(chǎn)生 器使用。始終通過(guò)已存儲(chǔ)指針值訪問(wèn)位置,這些指針值針對(duì)每個(gè)位置被唯一編碼。每個(gè)產(chǎn)生 器知道如何對(duì)它使用的指針值解碼。以這種方式存儲(chǔ)合并數(shù)據(jù)使得攻擊者更難以成功定位 和轉(zhuǎn)儲(chǔ)所有位置數(shù)據(jù),并且還使得更難以在稍后正確地重新產(chǎn)生數(shù)據(jù)。
[0224] 4.防止通過(guò)隔離小部分算法的攻擊
[0225] 攻擊算法的白盒實(shí)現(xiàn)的一種最有效方法是在白盒中隔離已知以某種方式針對(duì)機(jī) 密數(shù)據(jù)(例如加密密鑰)操作的小部分算法,并且然后針對(duì)該部分算法使用蠻力攻擊以便提 取機(jī)密。這是有效的,因?yàn)榧用芩惴▋H被設(shè)計(jì)為在其整體上對(duì)于蠻力不實(shí)用;在大多數(shù)情況 下,這些算法的個(gè)體部分對(duì)于經(jīng)由蠻力的攻擊非常實(shí)用。
[0226] 用于隔離算法部分的極其有效的方法是分析算法實(shí)現(xiàn)的存儲(chǔ)器訪問(wèn)模式。大多數(shù) 加密算法具有公知的執(zhí)行模式,這些執(zhí)行模式通常在其對(duì)應(yīng)存儲(chǔ)器訪問(wèn)模式中相當(dāng)準(zhǔn)確地 反映出來(lái),并且因此甚至通??梢允褂么鎯?chǔ)器訪問(wèn)模式的簡(jiǎn)單可視化以足夠粒度隔離算法 部分以便幫助蠻力攻擊。
[0227] 例如,AES塊密碼算法執(zhí)行10、12或14輪相同操作序列。這顯示為相關(guān)存儲(chǔ)器訪問(wèn) 的10/12/14個(gè)塊的對(duì)應(yīng)序列,當(dāng)可視化時(shí)它們很容易被定位。攻擊者可以使用該操作隔離 最后兩輪,并且然后使用已知方法通過(guò)觀察這些輪的輸入和輸出來(lái)導(dǎo)出AES密鑰。
[0228] 根據(jù)一個(gè)實(shí)施例,通過(guò)消除攻擊者可以賴以隔離加密操作的個(gè)體部分的訪問(wèn)模 式,使該類型攻擊更困難。存儲(chǔ)器訪問(wèn)模式消除可以通過(guò)以下操作實(shí)現(xiàn):在算法的白盒實(shí)現(xiàn) 中注入額外隨機(jī)化存儲(chǔ)器訪問(wèn)操作。這些操作訪問(wèn)由真實(shí)操作訪問(wèn)的相同存儲(chǔ)器位置集, 但使用隨機(jī)化順序和分布完成該操作,這種隨機(jī)化順序和分布添加足夠的噪聲以便掩藏由 真實(shí)操作展示的任何模式。
[0229] 根據(jù)一個(gè)實(shí)施例,存儲(chǔ)器訪問(wèn)模式混淆被實(shí)施為上述引誘生成的擴(kuò)展。該擴(kuò)展包 括生成更大數(shù)量的引誘,其中額外引誘作為存儲(chǔ)器訪問(wèn)操作的副本產(chǎn)生。還可以通過(guò)不透 明表達(dá)式將這些額外引誘與真實(shí)操作組合,但在實(shí)踐中,它們中的大部分可能不按順序以 便降低其對(duì)性能的影響。
[0230] 根據(jù)一個(gè)實(shí)施例,存儲(chǔ)器布局混淆與存儲(chǔ)器訪問(wèn)模式混淆一起執(zhí)行,以便對(duì)通過(guò) 隔離小部分算法的攻擊提供額外保護(hù)。不同于存儲(chǔ)器訪問(wèn)模式混淆(其設(shè)法通過(guò)引入噪聲 使訪問(wèn)模式混淆),存儲(chǔ)器布局混淆通過(guò)隨機(jī)化數(shù)據(jù)片段在存儲(chǔ)器中的位置來(lái)達(dá)到其目標(biāo)。 [0231 ]如果沒(méi)有布局模糊,則相關(guān)數(shù)據(jù)段通常彼此并存,與訪問(wèn)它們的操作一樣,這在被 可視化時(shí)導(dǎo)致可辨別的訪問(wèn)模式。盡管存儲(chǔ)器訪問(wèn)模式混淆通過(guò)引入的噪聲而使這些模式 難以觀察,但它們?nèi)匀淮嬖凇Mㄟ^(guò)隨機(jī)化由真實(shí)操作在存儲(chǔ)器中訪問(wèn)的數(shù)據(jù)片段的位置,將 相關(guān)數(shù)據(jù)段彼此分離,從而破壞由真實(shí)操作展示的任何模式。
[0232] 相對(duì)于示例性實(shí)施例描述了本發(fā)明。因?yàn)榭梢栽谏厦娴慕Y(jié)構(gòu)中進(jìn)行某些更改而不 偏離本發(fā)明的范圍,所以在上面描述中包含或者在附圖中示出的所有事物旨在被解釋為示 例性的而非限制性的。
[0233] 本發(fā)明并不專門應(yīng)用于加密算法或操縱機(jī)密數(shù)據(jù)的算法,而是可以應(yīng)用于任何算 法。
[0234] 還要理解的是,以下權(quán)利要求將覆蓋在此描述的本發(fā)明的所有通用和具體特性, 并且本發(fā)明的范圍的所有語(yǔ)句(事實(shí)上為語(yǔ)言)可被稱為落入其間。
【主權(quán)項(xiàng)】
1. 一種生成以存儲(chǔ)在存儲(chǔ)器中的代碼形式表達(dá)的算法的受保護(hù)實(shí)現(xiàn)的計(jì)算機(jī)實(shí)現(xiàn)的 方法,所述方法包括: 將實(shí)現(xiàn)所述算法的原始源代碼擴(kuò)展成單個(gè)真實(shí)操作集; 將使用真實(shí)數(shù)據(jù)的每個(gè)真實(shí)操作與每個(gè)真實(shí)操作所使用的真實(shí)數(shù)據(jù)相組合,以獲得以 這樣的方式表示的組合:該方式以不同于原始形式的形式使用實(shí)際真實(shí)數(shù)據(jù)片段; 產(chǎn)生應(yīng)用于引誘數(shù)據(jù)的表示所述算法的備選實(shí)現(xiàn)的重復(fù)和變異引誘操作集; 將所述引誘操作集與包括所述組合的所述真實(shí)操作集相組合,以便獲得其中所述引誘 操作與所述真實(shí)操作和由所述真實(shí)操作處理的所述真實(shí)數(shù)據(jù)交互的實(shí)現(xiàn),以使得難以分析 所述實(shí)現(xiàn)中的真實(shí)數(shù)據(jù)流;以及 將所述實(shí)現(xiàn)變換成被存儲(chǔ)在所述存儲(chǔ)器中并且能夠被執(zhí)行的結(jié)果代碼。2. 如權(quán)利要求1所述的方法,其中所述算法是加密算法并且所述真實(shí)數(shù)據(jù)包括機(jī)密數(shù) 據(jù)。3. 如權(quán)利要求1或2所述的方法,其中擴(kuò)展所述算法包括: 由仿真器執(zhí)行所述原始源代碼,并且記錄正在被執(zhí)行的操作、發(fā)生的控制流改變以及 發(fā)生的對(duì)存儲(chǔ)器的改變; 通過(guò)由所述仿真器使用不同運(yùn)行時(shí)輸入多次執(zhí)行所述原始源代碼并且將這些執(zhí)行的 結(jié)果組合成所述真實(shí)操作集來(lái)恢復(fù)在執(zhí)行期間未被執(zhí)行的代碼;以及 由所述仿真器通過(guò)將在所述執(zhí)行期間未被執(zhí)行的缺失代碼注入所述真實(shí)操作集中來(lái) 協(xié)調(diào)所述缺失代碼。4. 如權(quán)利要求1至3中的一項(xiàng)所述的方法,其中擴(kuò)展所述算法包括產(chǎn)生對(duì)所述真實(shí)操作 集中的操作與在所述真實(shí)操作間流動(dòng)的數(shù)據(jù)值之間的數(shù)據(jù)依賴性建模的數(shù)據(jù)依賴性圖。5. 如權(quán)利要求3或4所述的方法,其中擴(kuò)展所述算法包括消除所述真實(shí)操作集中產(chǎn)生靜 態(tài)已知值的操作,所述產(chǎn)生靜態(tài)已知值的操作包括針對(duì)所述真實(shí)數(shù)據(jù)的操作,以使得所述 真實(shí)數(shù)據(jù)的每個(gè)部分僅以最終導(dǎo)出形式存在并盡可能深入地被傳播到結(jié)果真實(shí)操作集中。6. 如權(quán)利要求3至5中的一項(xiàng)所述的方法,其中擴(kuò)展所述算法包括減小所述真實(shí)操作集 的大小,方式為:消除通過(guò)所述仿真器的執(zhí)行生成的所述真實(shí)操作集的一部分內(nèi)聯(lián)函數(shù)代 碼和展開(kāi)循環(huán),使用來(lái)自所述原始源代碼的函數(shù)調(diào)用和循環(huán)替換這些內(nèi)聯(lián)函數(shù)代碼和展開(kāi) 循環(huán),使用為函數(shù)和基本塊分配得分的決策模型,所述得分表示與通過(guò)這種消除發(fā)生的真 實(shí)數(shù)據(jù)傳播損失的成本相對(duì)的通過(guò)消除內(nèi)聯(lián)和/或展開(kāi)獲得的收益水平。7. 如權(quán)利要求1至6中的一項(xiàng)所述的方法,其中擴(kuò)展所述算法包括: 將涉及導(dǎo)出的真實(shí)數(shù)據(jù)的所述源代碼的原始操作拆分成多個(gè)新操作,以使得每個(gè)新操 作使用一段所述導(dǎo)出的真實(shí)數(shù)據(jù); 將各段所述導(dǎo)出的真實(shí)數(shù)據(jù)變換成產(chǎn)生各段所述導(dǎo)出的真實(shí)數(shù)據(jù)塊的唯一操作子集, 其中這些操作子集使用在運(yùn)行時(shí)生成的序列敏感數(shù)據(jù)值;以及 將所述操作子集插入到所述真實(shí)操作集中。8. 如權(quán)利要求1至7中的一項(xiàng)所述的方法,其中產(chǎn)生重復(fù)和變異引誘操作集包括多次重 復(fù)擴(kuò)展步驟以便產(chǎn)生多個(gè)引誘操作集,其中為每個(gè)引誘操作集供應(yīng)隨機(jī)生成的數(shù)據(jù)而不是 所述真實(shí)數(shù)據(jù),以便產(chǎn)生表示所述算法的備選虛假實(shí)現(xiàn)的多個(gè)引誘操作集。9. 如權(quán)利要求1至8中的一項(xiàng)所述的方法,其中將所述引誘操作集與所述真實(shí)操作集相 組合包括: 使來(lái)自每個(gè)集合的操作與來(lái)自所有其它操作集的操作相交錯(cuò)以獲得組合集,使得當(dāng)所 述組合集被執(zhí)行時(shí),同時(shí)有效地執(zhí)行所有操作集;以及 通過(guò)逐漸選擇多組操作并且通過(guò)將每個(gè)輸出轉(zhuǎn)發(fā)到正確接收操作的新生成的路由操 作路由所述多組操作的輸出,將來(lái)自所述組合集中不同集合的操作的數(shù)據(jù)流彼此合并,由 此使用唯一生成的不透明表達(dá)式來(lái)構(gòu)造路由操作,所述唯一生成的不透明表達(dá)式使用在運(yùn) 行時(shí)生成的序列敏感數(shù)據(jù)值。10. 如權(quán)利要求1至9中的一項(xiàng)所述的方法,其中根據(jù)小型統(tǒng)一指令集表達(dá)所述實(shí)現(xiàn)的 操作,變換所述實(shí)現(xiàn)包括: 使用公知的混淆變換將所述實(shí)現(xiàn)的操作序列變換成語(yǔ)義等同的備選形式; 組合變換后的操作序列的操作以便定義包括新指令的新的大得多的非統(tǒng)一指令集,每 個(gè)新指令被定義為與所述操作序列對(duì)應(yīng)的個(gè)體函數(shù),組合所述個(gè)體函數(shù)以產(chǎn)生所述新指 令;以及 使用新指令集變換所述實(shí)現(xiàn),以便獲得包括操作的變換后實(shí)現(xiàn),每個(gè)操作對(duì)應(yīng)于所述 新指令集的指令。11. 如權(quán)利要求1至10中的一項(xiàng)所述的方法,其中變換所述實(shí)現(xiàn)包括生成執(zhí)行控制代 碼,所述執(zhí)行控制代碼導(dǎo)致以正確序列并使用正確數(shù)據(jù)執(zhí)行所述操作以便執(zhí)行所述算法, 其中由解碼器功能集控制執(zhí)行,每個(gè)所述解碼器功能被與一個(gè)操作關(guān)聯(lián),對(duì)于該操作,每個(gè) 解碼器功能知道執(zhí)行該操作需要的數(shù)據(jù)的位置、對(duì)應(yīng)指令功能的位置,以及如何對(duì)針對(duì)每 個(gè)解碼器功能唯一編碼的該數(shù)據(jù)解碼。12. 如權(quán)利要求11所述的方法,其中所述解碼器功能使用在運(yùn)行時(shí)生成的序列敏感數(shù) 據(jù)值。13. 如權(quán)利要求1至12中的一項(xiàng)所述的方法,其中變換所述實(shí)現(xiàn)包括根據(jù)復(fù)雜程度啟用 混淆,當(dāng)將所述復(fù)雜程度設(shè)置為最大值時(shí),啟用在變換步驟可用的所有混淆。14. 如權(quán)利要求1至13中的一項(xiàng)所述的方法,包括生成所述算法的新白盒實(shí)現(xiàn),其中僅 在運(yùn)行時(shí)才知曉機(jī)密數(shù)據(jù),所述生成包括將所述實(shí)現(xiàn)與使用靜態(tài)密鑰的解密算法組合成使 用動(dòng)態(tài)機(jī)密數(shù)據(jù)的所述新白盒實(shí)現(xiàn),所述動(dòng)態(tài)機(jī)密數(shù)據(jù)被使用所述靜態(tài)密鑰預(yù)加密,所述 解密算法解密傳輸?shù)剿鰧?shí)現(xiàn)的所述動(dòng)態(tài)機(jī)密數(shù)據(jù)。15. 如權(quán)利要求1至13中的一項(xiàng)所述的方法,包括生成新白盒實(shí)現(xiàn),所述新白盒實(shí)現(xiàn)針 對(duì)已加密數(shù)據(jù)執(zhí)行數(shù)據(jù)處理操作而不泄露所述已加密數(shù)據(jù)的內(nèi)容,所述生成包括將解密算 法、所述實(shí)現(xiàn)以及加密算法組合成所述新白盒實(shí)現(xiàn),其中所述解密和加密算法是彼此的逆 算法并且使用相同靜態(tài)密鑰,由此所述解密算法對(duì)要處理的數(shù)據(jù)解密,所述實(shí)現(xiàn)針對(duì)所述 已解密數(shù)據(jù)操作并且所述加密算法重新加密所述數(shù)據(jù)。16. 如權(quán)利要求1至15中的一項(xiàng)所述的方法,包括防止在除包含所述實(shí)現(xiàn)的程序所指定 的上下文之外的上下文中使用所述實(shí)現(xiàn),所述防止包括: 通過(guò)將隨機(jī)生成的數(shù)據(jù)或真實(shí)數(shù)據(jù)與現(xiàn)有合并數(shù)據(jù)相混合,將合并產(chǎn)生器注入到所述 程序中,其中當(dāng)所述實(shí)現(xiàn)執(zhí)行時(shí)所述合并產(chǎn)生器生成合并數(shù)據(jù);以及 將合并目標(biāo)注入到所述實(shí)現(xiàn)中,其中所述合并目標(biāo)讀取合并數(shù)據(jù)并將這些數(shù)據(jù)與由所 述實(shí)現(xiàn)內(nèi)部的操作使用的靜態(tài)數(shù)據(jù)相組合,并且其中修改由所述操作使用的所述靜態(tài)數(shù)據(jù) 以使得它們不正確并且僅當(dāng)將它們與所述合并數(shù)據(jù)組合時(shí)才產(chǎn)生所述正確數(shù)據(jù),從而使得 所述操作依賴于通過(guò)所述程序的執(zhí)行被正確地生成的所述合并數(shù)據(jù),其中每段合并數(shù)據(jù)具 有不同位置,該位置僅對(duì)需要修改該段合并數(shù)據(jù)的所述合并產(chǎn)生器已知并且僅對(duì)所述實(shí)現(xiàn) 中的所述合并目標(biāo)已知。17. 如權(quán)利要求1至16中的一項(xiàng)所述的方法,包括混淆每個(gè)中間數(shù)據(jù)元素,并且將每個(gè) 中間數(shù)據(jù)元素與對(duì)于該數(shù)據(jù)元素唯一并指定如何混淆該數(shù)據(jù)元素的混淆上下文相關(guān)聯(lián)。18. 如權(quán)利要求1至17中的一項(xiàng)所述的方法,包括在所述實(shí)現(xiàn)中注入額外隨機(jī)化的存儲(chǔ) 器訪問(wèn)操作以便掩藏由所述真實(shí)操作展示的存儲(chǔ)器訪問(wèn)模式。19. 如權(quán)利要求1至18中的一項(xiàng)所述的方法,包括隨機(jī)化由所述真實(shí)操作在存儲(chǔ)器中訪 問(wèn)的所述真實(shí)數(shù)據(jù)的數(shù)據(jù)片段的位置。20. -種存儲(chǔ)應(yīng)用的非瞬時(shí)性計(jì)算機(jī)可讀介質(zhì),所述應(yīng)用適于在設(shè)備上運(yùn)行并且通過(guò) 將如權(quán)利要求1至19中的一項(xiàng)所述的方法應(yīng)用于程序而生成。21. -種用于保護(hù)以代碼形式表達(dá)的算法的設(shè)備,所述設(shè)備被配置為實(shí)現(xiàn)如權(quán)利要求1 至19中的一項(xiàng)所述的方法以便生成所述算法的受保護(hù)實(shí)現(xiàn)。
【文檔編號(hào)】G06F21/62GK106030604SQ201580005193
【公開(kāi)日】2016年10月12日
【申請(qǐng)日】2015年1月21日
【發(fā)明人】N·斯圖爾特
【申請(qǐng)人】麥塔福里克有限公司