專利名稱::生成軟件應用程序的白盒實現(xiàn)的系統(tǒng)和方法
技術領域:
:本發(fā)明一般涉及密碼術(cryptography)。更具體地說,本發(fā)明涉及對被設計為在攻擊者已完全訪問并控制正在執(zhí)行的軟件的環(huán)境中安全操作的軟件應用程序的開發(fā)。
背景技術:
:白盒密碼(cryptographic)軟件是在白盒攻擊環(huán)境中執(zhí)行密碼功能的軟件;也就是說,在這樣一種環(huán)境中,其中軟件應用程序的至少部分并且有可能整個實現(xiàn)可能暴露給攻擊者,而該攻擊者至少在某種程度上控制并且可能完全控制該軟件正運行于其上的平臺。例如,這種環(huán)境與諸如數(shù)字版權管理(DRM)之類的密碼應用程序一起出現(xiàn),其中電視節(jié)目、電影、音樂等等被顯示在個人計算機(PC)或其它類似的日用計算設備上,而非經(jīng)由廣播或經(jīng)由DVD播放器顯示在傳統(tǒng)電視上。雖然這種日用設備的許多所有者會遵守版權法,但是還是有其它人企圖通過制作并出售媒體內(nèi)容的違法拷貝來盜取該內(nèi)容而不為他們的使用向其所有者付費,從而在面向PC或類似設備的媒體上獲利。PC是一個特別暴露的環(huán)境在行的攻擊者可以獲得對該設備的完全控制,并且可以詳細監(jiān)控軟件運行并利用調(diào)試器控制、中止或修改其執(zhí)行,以及可以重復執(zhí)行相同的代碼以查找可以利用的行為模式寸寸。白盒密碼軟件被設計為在這種環(huán)境中運行。以白盒攻擊環(huán)境為目標的密碼功能,雖然可以很好地實現(xiàn)傳統(tǒng)密碼,卻是以極為非傳統(tǒng)的方式來實現(xiàn)它,以便阻止攻擊者獲知軟件運行所采用的方式。例如,通常,要么通過部分賦值將密鑰嵌入在白盒密碼軟件的余部中,要么對密鑰進行編碼。此外,通常對密碼的輸入和輸出文本進行編碼,以使得攻擊者擁有的密碼的傳統(tǒng)實現(xiàn)的知識在對白盒密碼實現(xiàn)發(fā)動攻擊方面毫無用處。在過去,會要求用戶確定和指定安全參數(shù),這些安全參數(shù)會并入用戶定義的軟件內(nèi),該用戶定義的軟件還包括用于訪問白盒庫工具的API調(diào)用。換句話說,在過去,通過將已構造的白盒實現(xiàn)包含到軟件中而后可選地利用諸如CloakwareTranscoder(克勞克維爾代碼轉換機)之類的混淆和/或防篡改工具保護它們的接口數(shù)據(jù)(例如,對于加密,這通常包括密鑰和明文輸入以及密文輸出)而將白盒加密運算注入到軟件應用程序中。將使用密碼功能的軟件和實現(xiàn)密碼功能、密鑰(或在公鑰密碼術的情況下為多個密鑰)、文本輸入以及文本輸出的軟件正確地連接在一起的職責在于使用密碼功能的程序員(程序員/用戶)。因為每一步都受程序員/用戶控制,因此所有問題來自于人們對完美性能的期望。當程序員/用戶成功時,結果是該功能是所想要的。如果程序員/用戶遺漏了一步或者錯誤地執(zhí)行了一步,則該功能可能在總體方式上或在細微方式上與所想要的不同。后者更加危險總體錯誤通常在測試過程中被捕捉到;而細微的錯誤可能容易被遺漏。因此,明顯的是,雖然白盒密碼實現(xiàn)的出現(xiàn)已經(jīng)使DRM內(nèi)容分發(fā)系統(tǒng)更加可行,不過,大的問題歸于我們將怎么調(diào)用該實現(xiàn)的周圍隱含(peri-cryptic)(在未加密文本進入或離開白盒實現(xiàn)的情況下)和相互隱含(inter-cryptic)(在加密文本從一種形式的加密向另一種形式的加密移動的情況下)方面。我們已經(jīng)確定,除了白盒密碼或密碼散列本身之外,還需要改進白盒密碼或密碼散列駐留于其中的軟件的構造,以及在系統(tǒng)使用多種加密和散列的情況下不同密碼組件中的連接的構造,所述多種加密和散列形成加密或散列內(nèi)容沿其傳播的信息管道的“管件(plumbing)”,其中軟件的周圍隱含部分和相互隱含部分從前必須由在行的用戶詳細地手動構造。
發(fā)明內(nèi)容提供一種計算機實現(xiàn)的利用白盒密碼術生成受保護的軟件應用程序的方法,以及一種具體實現(xiàn)該方法的計算機程序產(chǎn)品。該方法包括接收包括應用程序源代碼和抽象的白盒函數(shù)調(diào)用的至少一個輸入源文件;并且接收包含用于每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)的參數(shù)化文件。然后,根據(jù)每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)生成用于定義每個抽象的白盒函數(shù)調(diào)用的白盒調(diào)用定義數(shù)據(jù)。然后,將諸如塊密碼或非對稱密碼之類的至少一個數(shù)據(jù)轉換應用于所述輸入源文件和所述白盒調(diào)用定義數(shù)據(jù),以分別生成轉換后的源文件和轉換后的白盒調(diào)用定義數(shù)據(jù)。然后,根據(jù)所述白盒調(diào)用定義數(shù)據(jù)和所述轉換后的白盒調(diào)用定義數(shù)據(jù)生成包含用于每個白盒函數(shù)調(diào)用的特定實例數(shù)據(jù)的數(shù)據(jù)初始化。然后,編譯所述轉換后的源文件、所述轉換后的白盒定義數(shù)據(jù)以及所述數(shù)據(jù)初始化代碼,并且將所得到的編譯代碼鏈接到白盒庫以提供可執(zhí)行軟件應用程序。所述白盒調(diào)用定義數(shù)據(jù)以自動方式生成將白盒實現(xiàn)應用程序接口(API)鏈接到所述應用程序源代碼的代碼以及當白盒實現(xiàn)API和另一白盒實現(xiàn)API必須通信時將白盒實現(xiàn)API鏈接到另一白盒實現(xiàn)API的代碼。根據(jù)這方面的實施例,所述白盒調(diào)用定義數(shù)據(jù)可以包括白盒調(diào)用定義文件和指定為每個白盒函數(shù)調(diào)用選定的參數(shù)的白盒元數(shù)據(jù),并且將所述至少一個數(shù)據(jù)轉換應用于所述轉換后的白盒調(diào)用定義數(shù)據(jù)生成轉換后的白盒調(diào)用定義文件和指定為所選擇的參數(shù)選定的數(shù)據(jù)轉換的轉換元數(shù)據(jù)。生成所述數(shù)據(jù)初始化可以包括根據(jù)所述白盒元數(shù)據(jù)和所述轉換元數(shù)據(jù)生成數(shù)據(jù)初始化文件。在回顧了結合附圖對本發(fā)明的特定實施例的下列描述之后,本發(fā)明的其它方面和特征對于本領域普通技術人員來說將變得明顯?,F(xiàn)在將參照附圖,僅僅以示例的形式描述本發(fā)明的實施例,其中圖1是根據(jù)本發(fā)明實施例的白盒密碼術集成的基本設計流程圖;圖2是根據(jù)本發(fā)明的實施例白盒密碼術的擴展設計流程圖。圖3是根據(jù)本發(fā)明實施例的鏈式加密場景的圖;圖4是根據(jù)本發(fā)明實施例的使用鏈式加密API的鏈式加密場景的圖;圖5是示出本發(fā)明的實施例及其運算的示意圖;以及圖6是示出根據(jù)本發(fā)明實施例的用于編連健壯實現(xiàn)的步驟的圖。具體實施例方式很明顯,需要這樣一種方法和系統(tǒng)通過它可以使構造使用白盒密碼功能的應用程序的周圍隱含和相互隱含部分的步驟自動操作,從而使得當前用于構建這種系統(tǒng)的容易出錯的方法可以由相當可靠的自動化方法來代替。為了實現(xiàn)這一點,公開了一些實施例,在這些實施例中,應用程序的普通內(nèi)部隱含(intra-cryptic)部分(實際執(zhí)行白盒運算的部分)與這些部分的慣常情況相比變得更加靈活,以適應于上述自動化系統(tǒng)。這種系統(tǒng)的好處類似于通過編譯代碼而非寫手工匯編代碼所得到的好處。理論上,好的程序員應該能夠以手工匯編代碼的方式寫應用程序。然而,實際上手工匯編代碼極其容易出錯,并且編譯器通過將低級的、高度詳細的軟件構造體制(regime)用更為自動化的軟件構造體制來替代,使得在匯編代碼級別從未實現(xiàn)的復雜性的軟件系統(tǒng)成為可能。本申請的一方面是要提供這樣的系統(tǒng)和方法,通過它可以對白盒實現(xiàn)的周圍隱含和相互隱含方面進行抽象并使之自動操作,使得其用戶可以實現(xiàn)在之前通過周圍隱含和相互隱含的手寫編碼軟件要么難以實現(xiàn)要么不可實行的復雜性的級別上的白盒加密實現(xiàn)的使用,同時還通過使它們更易于為程序員/用戶創(chuàng)建,而有益于甚至更簡單地使用白盒密碼術,正如非常簡單的程序通過用從諸如C++之類的高級語言的源代碼編譯的代碼取代手工匯編代碼而受益。這種自動操作的一方面是對表達不同形式的密碼功能所采用的方式的統(tǒng)一。例如,在諸如C++之類的編譯語言中,相同的句法形式用于加法,無論正在被加的是兩個整數(shù)、兩個浮點數(shù)還是兩個復數(shù)。該語言及其編譯器將加法抽象為針對它所使用的每種環(huán)境適當?shù)貙崿F(xiàn)的概念,不管該實現(xiàn)是內(nèi)置于該編譯器(當它用于整數(shù)和浮點數(shù)時)還是標準庫的一部分(當它用于復數(shù)時)。針對白盒密碼運算,這里公開了類似的統(tǒng)一如果每個密碼運算具有它自己唯一的接口并且需要它自己唯一的表達方式,則程度小的自動化是可能的;進行適當選擇的許多職責必需屬于程序員/用戶。如果接口和表達方式被統(tǒng)一,則系統(tǒng)可以從特定的密碼中抽象出來并且以自動化方式處理每種環(huán)境的需要。相應地,公開了使安全性相關參數(shù)與用戶定義的軟件分離的實施例,其中用戶定義的軟件包括用于訪問白盒庫工具的API調(diào)用。這允許簡單通過改變參數(shù)而不需要改變用戶定義的軟件而容易地改變應用于應用程序的保護的類型和安全級別。這允許現(xiàn)場升級能力,其中安全實現(xiàn)和代碼可以被改變,或者額外的工具和/或保護級別可以被使用。在黑客攻破安全性的情況下,這種系統(tǒng)可以進行如下響應通過改變參數(shù)并重新編譯應用程序而向黑客提供新的和/或額外的挑戰(zhàn)。當前優(yōu)選的實施例提供了對許多多樣安全性實現(xiàn)的可能使用,許多安全性措施對于每個應用程序來說是可能的。這有益于確保對一個實現(xiàn)的成功攻擊不會變成對使用白盒密碼術的給定軟件應用程序的所有或許多實現(xiàn)的成功攻擊。一般而言,所公開的實施例提供了計算機實現(xiàn)的用于將白盒密碼術集成到軟件文件中的方法和系統(tǒng),其包括將API與用于加密、混淆或以其它方式保護應用程序或文件的參數(shù)分離。通過使用可以在應用程序中應用并且被白盒加密實現(xiàn)所理解的數(shù)據(jù)轉換,這種集成的開發(fā)套件的特別的好處是對密碼應用程序和周圍應用程序之間的邊界進行保護。在下列描述中,為了說明的目的,各種細節(jié)被闡述以便提供對本發(fā)明的充分理解。然而,對于本領域技術人員來說明顯的是,為了實踐本發(fā)明,并不需要這些具體細節(jié)。在其它情況下,公知的電結構和電路以框圖的形式示出,從而不會使得本發(fā)明難以理解。例如,關于這里描述的本發(fā)明的實施例是實現(xiàn)為軟件例程、硬件電路、固件還是它們的結合,并沒有提供具體細節(jié)。本發(fā)明的實施例可以被表示為存儲在機器可讀介質(zhì)(也稱為計算機可讀介質(zhì)、處理器可讀介質(zhì)或者其中嵌入有計算機可讀程序代碼的計算機可用介質(zhì))中的軟件產(chǎn)品。機器可讀介質(zhì)可以是包括磁、光或電存儲介質(zhì)的任何合適的有形介質(zhì),包括磁盤、只讀光盤存儲器(CD-ROM),存儲器設備(易失性的或非易失性的),或者類似的存儲機制。機器可讀介質(zhì)可以包含各種指令集、代碼序列、配置信息或其它數(shù)據(jù),其在被執(zhí)行時使得處理器執(zhí)行根據(jù)本發(fā)明的實施例的方法中的步驟。本領域技術人員會理解的是,還可以在機器可讀介質(zhì)上存儲為實現(xiàn)所描述的發(fā)明所需的其它指令或運算。從機器可讀介質(zhì)中運行的軟件可以與電路交互以執(zhí)行所描述的任務。在整個該文獻中,術語“白盒”頻繁地用作前綴,從而創(chuàng)建了像“白盒調(diào)用”、“白盒庫”、“白盒函數(shù)”等術語。當用作這種前綴時,術語“白盒”是“被設計為提供對抗白盒攻擊者的安全性的密碼實現(xiàn)”的簡寫。類似地,術語“白盒密碼術”本身是“被設計為提供對抗白盒攻擊者的安全性的密碼實現(xiàn)”的簡寫。清楚的是,“白盒”前綴決不是指該項本身;因為所描述的實施例在軟件環(huán)境中運行,所以假設這些實施例和用戶的應用程序對于攻擊者來說是一目了然的事;換句話說,它們是白盒。事實上,這些術語只是另一種簡寫。例如,“白盒庫”是包含提供對抗白盒攻擊者的安全性的密碼函數(shù)的實現(xiàn)的庫,或者稍微更加簡便地,是包含白盒密碼術的庫(因此,這里我們明白“白盒庫”怎么是雙重簡寫)?!鞍缀泻瘮?shù)”是白盒庫中的函數(shù)之一?!鞍缀泻瘮?shù)調(diào)用”或者僅僅“白盒調(diào)用”是對白盒函數(shù)的調(diào)用。其它術語應當被類似地進行解釋。所描述的實施例將白盒密碼術集成到軟件開發(fā)套件中。參見圖1,在非常高的級別處,根據(jù)本發(fā)明的將白盒密碼術集成到應用程序中涉及用戶對在他們的全部應用程序中的密碼功能和重要安全性參數(shù)流進行功能性的和健壯性相關的若干次選擇。如在100處示出的,用戶將抽象的調(diào)用(示出為wbfimcC..))添加到白盒API以實現(xiàn)所期望的密碼功能,并且還在他們的全部代碼中添加命令以識別重要安全性參數(shù)所需要的保護。然后,利用若干白盒工具和庫(步驟10創(chuàng)建健壯的代碼104,健壯的代碼104可以被編譯并鏈接(步驟106)到白盒庫108以創(chuàng)建可執(zhí)行文件109,可執(zhí)行文件109以安全方式執(zhí)行密碼運算,并且在全部應用程序的整個數(shù)據(jù)流中保護重要安全性參數(shù)。然而,在概念上,更容易將該過程理解為演化,其中用戶首先對他們的應用程序中的密碼功能和密鑰流進行并實現(xiàn)最基本的選擇,然后,進一步提煉這些功能參數(shù)并最終采取措施增加健壯性。在每個階段,存在編連(build)并測試應用程序的能力,并且在最后,用戶調(diào)整健壯的應用程序并且可選地使每個編連個性化。圖2中示出此擴展的設計流程,并且涉及存根(stub)編連110、平滑(smooth)編連112以及健壯(robust)編連114。存根編連110和平滑編連112是可選的,并且僅僅以寬泛的術語進行描述。如本領域技術人員應當清楚的是,它們的實現(xiàn)是設計選擇,并且在這里僅僅為了示出根據(jù)本發(fā)明的白盒應用程序開發(fā)流程的實施例的目的進行討論。在存根編連110中,用戶將白盒函數(shù)調(diào)用添加到合適的白盒密碼API以添加諸如對稱加密、非對稱加密以及散列之類的功能,從而創(chuàng)建輸入源文件100。用戶依賴在白盒存根庫118中定義的白盒調(diào)用的存根實現(xiàn),對他們的程序進行編譯和鏈接(步驟116)以生成存根可執(zhí)行120,然后對存根可執(zhí)行120進行測試(步驟12以檢查編譯和鏈接錯誤,以及密鑰流中的基本錯誤。存根庫118中實現(xiàn)的存根加密函數(shù)是簡單的,但是以加密和解密彼此不太可能互逆除非將匹配參數(shù)傳遞給兩個函數(shù)的這種方式進行構造。例如,動態(tài)密鑰解密必須使用與動態(tài)密鑰加密相同的密鑰,以便恢復原始消息。如果這些密鑰由于編碼錯誤而不相同,則存根解密不太可能正確地解密存根加密的結果以產(chǎn)生原始消息。在平滑編連112中,用戶進行一些初始的、功能性相關的選擇以使每個調(diào)用參數(shù)化,并且創(chuàng)建詳細說明那些選擇的白盒參數(shù)化文件124。然后,用戶應用代碼生成工具(步驟126)以應用所進行的選擇,并且依賴在白盒庫130的平滑版本中定義的白盒調(diào)用的平滑實現(xiàn)來編譯并鏈接(步驟128)他們的程序。白盒庫130的平滑版本僅指實現(xiàn)與真的白盒庫相同的API的庫,但其是平滑的。然后,所得到的平滑可執(zhí)行132可以被測試(步驟134)以確?;镜墓δ苄哉谡_地工作。在健壯編連114,用戶在他們的受保護的應用程序中進行關于尺寸、速度和安全折衷的選擇。用戶應用下面詳細說明的白盒加密工具(步驟136),以生成健壯的轉換后的代碼138。然后,該健壯的轉換后的代碼138被編譯并鏈接(步驟140)以保護在白盒庫144中的白盒調(diào)用的實現(xiàn)以生成受保護的可執(zhí)行146。然后,該受保護的可執(zhí)行可以被測試(步驟147)以確保功能性和安全性。然后,用戶為了個別化目的利用更輕便的過程可選地生成(步驟148)數(shù)據(jù)的許多多樣實例149。參見圖5和圖6,現(xiàn)在將更詳細地描述健壯編連的過程和組件。圖5提供健壯編連的簡化概述,而圖6示出下面詳細描述的詳細實現(xiàn)的實施例。圖5的實施例包括三個模塊,用于產(chǎn)生例如軟件應用程序文件的受保護的文件,該三個模塊即白盒代碼生成工具(wbcodegen)150、數(shù)據(jù)轉換引擎(xcode)152以及白盒數(shù)據(jù)生成工具(wbdatagen)154。在白盒密碼術環(huán)境中,數(shù)據(jù)轉換引擎152用于保護密碼運算與周圍代碼之間的邊界。具體而言,數(shù)據(jù)轉換引擎152用于將數(shù)據(jù)轉換應用到密碼運算的輸入和輸出。如果用戶經(jīng)由白盒參數(shù)化文件1指定需要轉換,則wbcodegen150將由用戶指定的信息翻譯成數(shù)據(jù)轉換引擎152理解的形式,即作為有關數(shù)據(jù)變量和函數(shù)原型的修飾符。然后,數(shù)據(jù)轉換引擎152應用所指定的轉換,并且將關于選擇什么轉換的信息傳遞給wbdatagen154。用于實現(xiàn)這個的數(shù)據(jù)流在圖5中以高的級別示出。白盒代碼生成工具150接收包括應用程序源代碼和抽象的白盒函數(shù)調(diào)用的至少一個輸入源文件lOOOiseCode)以及包含用于每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)的參數(shù)化文件124。白盒代碼生成工具150根據(jù)每個抽象的白盒函數(shù)調(diào)用的加密域參數(shù)并且以數(shù)據(jù)轉換引擎152會理解的方式處理這些輸入,以生成用于定義每個抽象的白盒函數(shù)調(diào)用的白盒調(diào)用定義數(shù)據(jù)156(wbglue,c)。然后,數(shù)據(jù)轉換引擎152將一個或多個數(shù)據(jù)轉換應用到輸入源文件100以及白盒調(diào)用定義數(shù)據(jù)156,以生成轉換后的源文件160和轉換后的白盒調(diào)用定義數(shù)據(jù)158(wb.xwbm)。然后,數(shù)據(jù)生成工具1根據(jù)轉換后的白盒調(diào)用定義數(shù)據(jù)158生成包含用于每個白盒函數(shù)調(diào)用的特定實例數(shù)據(jù)的數(shù)據(jù)初始化162(wb-glUedata)。然后,數(shù)據(jù)初始化162和轉換后的源文件160可以利用本地編譯器進行編譯并鏈接到白盒庫。白盒API一旦用戶已識別在他們的應用程序中需要加密,針對他們將會進行的對API的每個調(diào)用,他們具有兩種選擇。這些選擇將會確定他們的應用程序的基本密鑰流。(1)待執(zhí)行的密碼運算是什么?可能的運算包括加密、解密、簽名、簽名驗證、散列等等。(用于該調(diào)用的密鑰將僅在運行時可用還是將在之前可用?諸如會話密鑰或內(nèi)容密鑰之類的密鑰通常要么被動態(tài)地產(chǎn)生,要么作為非對稱解密的結果被計算出。我們寬泛地稱這種密鑰為動態(tài)的。在另一方面,在編連時已知的或者可以通過一些離線簽約/更新過程獲取的密鑰被稱為固定密鑰。當然,所有的密鑰可以被處理為動態(tài)的,但在密鑰可以被處理為固定的情況下,這樣做具有安全性的優(yōu)點?!┮呀?jīng)做出上述決定,用戶應用程序代碼可以被寫成調(diào)用適合于該選擇的API。作為輸入源文件100的用戶應用程序由源代碼(例如用C或C++)組成,該源代碼包含使用非常最小化的API對諸如密鑰調(diào)度、加密、解密等等之類的密碼運算進行的調(diào)用。諸如密文、明文、iv(初始化向量)等等之類的密鑰用戶提供數(shù)據(jù)作為參數(shù),連同用于將相關的調(diào)用分組成單個密碼域的數(shù)值常量ID參數(shù)一起,被傳遞給這些調(diào)用。在優(yōu)選的實施例中,用戶應用程序代碼將需要包括包含文件170:XC/XC_wb.h,其定義白盒類型和宏。所有密碼運算可以利用來自該包含文件170的宏來調(diào)用。優(yōu)選地,白盒包含文件170(XC/XC_wb.h)為所有密碼類型的密碼運算中的每一個提供單個宏定義。這些宏將用戶供應參數(shù)(通常諸如明文/密文之類的應用程序數(shù)據(jù))的最小集、單個ID參數(shù)(用來識別運算的密碼域)以及選項參數(shù)作為參數(shù)。例如,下面示出塊密碼加密調(diào)用。請注意,宏調(diào)用(XC_Fixed_Key_Bl0Ck_Cipher_Encrypt)是非常抽象的,并且僅僅指定密碼運算所需的實際應用程序數(shù)據(jù)。#include〃xc/xcwb.h"XC_0ctetplain[16];XC_0ctetcipher[16];intcsize;intret;/*Loadplaintextintoplain*/ret=XC_Fixed_Key_Block_Cipher_Encrypt(1,plain,16,cipher,&csize,NULL,0,NULL);if(ret!=XC_0K){/tissueerror氺/}/氺Processciphertext氺/白盒包含文件170(XC/XC_wb.h)從用戶的應用程序代碼的角度定義整個白盒API。該API采用類似函數(shù)的宏形式,該宏對可用于應用程序代碼的所有抽象密碼運算進行定義。此外,該包含文件170再次以宏定義的形式描述以下描述的白盒粘合(glue)文件的內(nèi)容。下列示例性代碼片斷示出用于固定密鑰、塊密碼加密運算的單個抽象API的高級細節(jié)—#ifdefXC_WB_INF0//DefinitionscommontoSmoothandRobustinvocations;#defineXC_Fixed_Key_Block_Cipher_Encrypt(ID,PLAIN,PLAINSIZE,CIPHER,PCIPHERSIZE,IV,IVSIZE,OPTIONS)\<XC_Fixed_Key_Block_Cipher_Encrypt>\_XC_TCGEN(_XC_GLUE,ID,MAIN,cat(XC_Fixed_Key_Block_Cipher_Encrypt_,ID)Λ_XC_TCGEN(_XC_ASSERT,\FunctionType=BlockCipher\KeyLocation=Fixed\Operation=Encrypt\)\XC_Block_Cipher_Glue(ID,)\)#defineXC_Block_Cipher_Glue(ID,SUBOP)\XC_Block_Cipher_Externs(ID,SUBOP)\intMangledNamecat(XC_Block_Cipher_Op_Prefix(SUBOP),Prototype){\returnXC_Block_Cipher_Main_Invocation(ID,SUBOP){\cat(XC_Block_Cipher_Op_Prefix(SUBOP),Base_Params)(ID)\XC_Block_Cipher_Additional_Params(ID,SUBOP)\};\}#ifdefXC_WB_SM00TH//Definitionsofsuchsub-macrosasXC_Bl°ck_Cipher_Externsetc.//foraSmoothimplementation#else/*notXC_WB_SM00TH*///Definitionsofsuchsub-macrosasXC_Bl°ck_Cipher_Externsetc.//foraRobustimplementation//All_ParamsmacrosgeneratedbyXC_Robust*_Prefixaredefinedhere:#include〃χc_wb_bc_dk_aes_keysched_tables.h//#include"xc_wb_bc_fk_aes_tables.h"#include〃xc_wb_bc_dk_aes_tables.h"#endif/*XC_WB_SM00TH*/#endif/*XC_WB_SM00TH*/#else/*notXC_WB_INF0*///Thissectionisfornormalmacro-expansion//xcffBCodeGenisnotinplay,andthus_XC_TCGEN()operatorsmaynotappear#ifdefXC_WB_STUB//Stubbuild#defineXC_Dynamic_Key_Block_Cipher_Encrypt_Key_Schedule(ID,KEY,KEYSIZE,PRKS,OPTIONS)\XC_Dynamic_Key_Block_Cipher_Encrypt_Key_Schedule_Stub(ID,KEY,KEYSIZE,PRKS,OPTIONS)#else/*notXC_WB_STUB*///SmoothorRobustbuild(theseareidenticalatmacro-expansionlevel)#defineXC_Dynamic_Key_Block_Cipher_Encrypt_Key_Schedule(ID,KEY,KEYSIZE,PRKS,OPTIONS)\cat(XC_Dynamic_Key_Block_Cipher_Encrypt_Key_Schedule,ID)(KEY,KEYSIZE,PRKS,OPTIONS)#endif/*XC_WB_STUB*/#endif/*XC_WB_INFO*/經(jīng)常在隔離時并不執(zhí)行密碼函數(shù)。代替地,應用程序包含一連串通常采用層次結構的密鑰,并且進行鏈式加密運算,層次結構中最低的密鑰用于保護內(nèi)容,而更有價值的密鑰用于保護較低級的密鑰。在層次結構的頂部,會有一個或多個“可信根(rootsoftrust)”,即其公開將會暴露其它全部密鑰從而導致安全性完全被攻破的密鑰。層次結構的簡單實例將會具有諸如音樂文件之類的內(nèi)容,這些內(nèi)容利用具有稱為內(nèi)容密鑰的隨機密鑰的AES加密進行保護。該內(nèi)容密鑰本身將會利用具有客戶端指定的公鑰的RSA加密進行保護。然后,該可信根是(經(jīng)常固定的)RSA私鑰,RSA私鑰為客戶端應用程序的一部分。圖3中示出該層次結構。一般而言,一個加密運算的輸出成為隨后加密運算的輸入之一的任何場景被稱為鏈式加密。另一頻繁出現(xiàn)的鏈式加密的示例也被稱為轉換加密(transcryption)。這涉及使用一個算法和密鑰對一些內(nèi)容進行解密,接下來使用另一算法和密鑰立即對同一內(nèi)容進行重新加密。這經(jīng)常在彼此通信的兩個程序之間的邊界處進行,或者在軟件和硬件之間的邊界處進行。在將鏈式加密運算考慮為單個運算時,存在明顯的安全性好處,即從一個運算傳遞到下一運算的值可以被很好的隱藏,這與在這兩個運算之間的邊界處被暴露正好相反。雖然在運算之間的邊界處轉換該值當然也是可行的并且確實提供了保護,但是鏈式運算的真正混合(blending)在可以應用的安全性技術方面提供更大的靈活性,從而提供更好的全面保護。這里描述的白盒基礎結構和API可以容易地被擴展以支持多種鏈式加密場景。下面給出具體示例。該示例對應于圖3的客戶端側,被修改為將RSA解密和AES解密結合成單個鏈式解密。圖4示出這個改變。請注意,被解密的內(nèi)容密鑰不再出現(xiàn)在該圖中。該示例僅僅是示例性的。#include〃xc/xcwb.h"XC_0ctetekey[128];XC_0ctetcipher[65536];XC_0ctetplain[65536];intpsize;intret;/氺Loadencryptedcontentintocipher氺//*Loadencryptedcontentkeyintoekey氺/ret=XC_Fixed_Key_Chained_Cipher_Decrypt(2,cipher,65536,plain,&psize,ekey,128,NULL);if(ret!=XC_0K){/tissueerror氺/}/氺Processplaintext氺/白盒參數(shù)化一旦用戶已經(jīng)使他們的密鑰流生效,則他們不得不進行一連串的功能選擇以進一步使每個白盒加密函數(shù)調(diào)用參數(shù)化。這些問題中的大部分是密碼特有的,但是一般問題中的一些示例為(1)需要什么算法?經(jīng)常,使用的算法由某些相關標準指定。(2)需要什么尺寸的密鑰?這里的有效選擇取決于該算法。這些決定在用戶提供的白盒參數(shù)化文件124中被捕獲,然后,白盒參數(shù)化文件1連同用戶的源代碼一起被處理,以便構建可執(zhí)行文件。用戶對密碼運算的特定方面進行選擇所依據(jù)的主要機制(基礎到使用哪個算法,并且詳細到使用哪個密鑰)是經(jīng)由白盒參數(shù)化文件124。由用戶寫的該文件提供了關于對白盒函數(shù)的每個調(diào)用的細節(jié)。在實施例中,白盒參數(shù)化文件124的格式是面向行的文本,由密碼域參數(shù)名和密碼域參數(shù)值組成。這些參數(shù)名/值對(下文稱為“密碼域參數(shù)”或簡稱為“參數(shù)”)被分組以組成獨立的白盒參數(shù)化記錄。每個記錄的開始是以標識符(ID)參數(shù)的存在來劃界的,并且在標識符下一次出現(xiàn)(或文件結束)時結束。在參數(shù)化記錄的范圍內(nèi),可以列出任意數(shù)目的唯一參數(shù)(任何參數(shù)名的重復都是錯誤)。正如本領域技術人員將會理解的,某些參數(shù)可能被省略,并且可以具有缺省值,而其它參數(shù)是強制性的并且必須被提供。在任何情況下,獨立的參數(shù)的范圍僅僅在于當前的參數(shù)化記錄。ID參數(shù)的值用于識別白盒調(diào)用。同樣,優(yōu)選的是UID是字面值整數(shù)常量,使得給定的調(diào)用一致地映射到參數(shù)化文件124中的給定記錄。2、每個調(diào)用被給定唯一的ID,使得參數(shù)化文件124中的給定記錄映射到唯一的調(diào)用。這個規(guī)則可以有例外a、選擇用來共享數(shù)據(jù)的調(diào)用必須被給定相同的ID。b、其它的密碼特有的例外。對于每個ID,白盒參數(shù)化文件1會包含一記錄,該記錄將會列出與該記錄相關的某些參數(shù),文件的每行列出一個參數(shù)。白盒記錄的參數(shù)可以被分成三個寬的種類分類參數(shù)這些參數(shù)描述有待使用的密碼算法的種類,例如,塊密碼或非對稱密碼以及固定密鑰對動態(tài)密鑰。這些參數(shù)用于雙重目的;第一,在用戶可以看見這種記錄并且確切地知道相應的白盒調(diào)用的行為將會是什么的意義上,它們使參數(shù)化文件記錄自包含,并且第二,當這些參數(shù)的指定準確地確定哪些用戶提供的參數(shù)被期望時,它們允許進行錯誤檢查。功能參數(shù)這些參數(shù)描述有待使用的密碼算法的特定屬性,例如循環(huán)(round)的次數(shù),并且將作為參數(shù)或選項傳遞給白盒API(這被自動執(zhí)行并且對終端用戶是透明的)。請注意,算法(Algorithm)被認為是功能參數(shù)(例如Algorithm=AES對Algorithm=DES),并且不是分類參數(shù)。健壯性參數(shù)這些參數(shù)描述與白盒調(diào)用的健壯性特點相關的具體決定,例如,對所選擇的參數(shù)的轉換。最高級別的分類參數(shù)是FimctionType(功能類型)。其它有效分類參數(shù)以及功能和健壯性參數(shù)取決于為FimctionType指定的值。下列示例示出用于塊密碼的典型白盒參數(shù)化條目(entry)。所列出的參數(shù)中的大部分是密碼特有的,并且它們的意義在這里沒有進行描述。Identifier1FunctionTypeBlockCipherKeyLocationFixedOperationEncryptAlgorithmAESModeECBFixedKey00000000000000000000000000000000KeySize16KeyTypeStandardNumRounds10在這點上,用戶必須進行若干安全性相關的選擇。在可能的情況下,應當轉換對白盒密碼函數(shù)的調(diào)用的所有輸入和輸出。具體來說,對于塊密碼,應當轉換明文、密文、密鑰(用于動態(tài)密鑰函數(shù))和初始化向量(用于ECB之外的模式)。作為示例,按安全性的升序,可用轉換的集合可以是權利要求1.一種計算機實現(xiàn)的利用白盒密碼術生成受保護的軟件應用程序的方法,包括接收包括應用程序源代碼和抽象的白盒函數(shù)調(diào)用的至少一個輸入源文件;接收包含用于每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)的參數(shù)化文件;根據(jù)每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)生成用于定義每個抽象的白盒函數(shù)調(diào)用的白盒調(diào)用定義數(shù)據(jù);將至少一個數(shù)據(jù)轉換應用于所述輸入源文件和所述白盒調(diào)用定義數(shù)據(jù),以分別生成轉換后的源文件和轉換后的白盒調(diào)用定義數(shù)據(jù);以及根據(jù)所述白盒調(diào)用定義數(shù)據(jù)和所述轉換后的白盒調(diào)用定義數(shù)據(jù)生成包含用于每個白盒函數(shù)調(diào)用的特定實例數(shù)據(jù)的數(shù)據(jù)初始化。2.根據(jù)權利要求1所述的方法,進一步包括編譯所述轉換后的源文件、所述轉換后的白盒定義數(shù)據(jù)以及所述數(shù)據(jù)初始化代碼,并且將所得到的編譯代碼鏈接到白盒庫以提供可執(zhí)行軟件應用程序。3.根據(jù)權利要求1所述的方法,其中生成所述白盒調(diào)用定義數(shù)據(jù)包括生成白盒調(diào)用定義文件和指定為每個白盒函數(shù)調(diào)用選定的參數(shù)的白盒元數(shù)據(jù)。4.根據(jù)權利要求3所述的方法,其中將所述至少一個數(shù)據(jù)轉換應用于所述轉換后的白盒調(diào)用定義數(shù)據(jù)生成轉換后的白盒調(diào)用定義文件和指定為所選擇的參數(shù)選定的數(shù)據(jù)轉換的轉換元數(shù)據(jù)。5.根據(jù)權利要求4所述的方法,其中生成所述數(shù)據(jù)初始化包括根據(jù)所述白盒元數(shù)據(jù)和所述轉換元數(shù)據(jù)生成數(shù)據(jù)初始化文件。6.根據(jù)權利要求1所述的方法,其中生成所述白盒調(diào)用定義數(shù)據(jù)包括生成包括被數(shù)據(jù)轉換引擎理解的轉換修飾符的至少一個白盒調(diào)用定義文件;并且生成用于描述所述密碼域參數(shù)和所選定的轉換的至少一個轉換元數(shù)據(jù)文件。7.根據(jù)權利要求1所述的方法,其中生成所述白盒調(diào)用定義數(shù)據(jù)以自動化方式生成將白盒實現(xiàn)應用程序接口(API)連接到所述應用程序源代碼的代碼以及當白盒實現(xiàn)API和另一白盒實現(xiàn)API必須通信時將所述白盒實現(xiàn)API連接到所述另一白盒實現(xiàn)API的代碼。8.根據(jù)權利要求1所述的方法,其中所述白盒函數(shù)調(diào)用對至少一個鏈式加密進行調(diào)用。9.根據(jù)權利要求8所述的方法,其中所述至少一個鏈式加密作為單個運算被執(zhí)行。10.根據(jù)權利要求2所述的方法,進一步包括生成所述可執(zhí)行軟件應用程序的多樣實例。11.根據(jù)權利要求10所述的方法,其中生成所述多樣實例包括將不同的固定密鑰與所述可執(zhí)行軟件應用程序的每個實例相關聯(lián)。12.根據(jù)權利要求1所述的方法,其中所述至少一個數(shù)據(jù)轉換包括塊密碼。13.根據(jù)權利要求1所述的方法,其中所述至少一個數(shù)據(jù)轉換包括非對稱密碼。14.一種計算機實現(xiàn)的利用白盒密碼術生成軟件應用程序的方法,包括接收包括應用程序源代碼和抽象的白盒函數(shù)調(diào)用的至少一個輸入源文件;接收包含用于每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)的參數(shù)化文件;根據(jù)每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)生成用于定義每個抽象的白盒函數(shù)調(diào)用的白盒調(diào)用定義文件以及指定為每個白盒函數(shù)調(diào)用選定的參數(shù)的白盒元數(shù)據(jù);將至少一個數(shù)據(jù)轉換應用于所述輸入源文件以生成轉換后的源文件;將所述至少一個數(shù)據(jù)轉換應用于所述白盒調(diào)用定義文件,以生成轉換后的白盒調(diào)用定義文件和指定為所選擇的參數(shù)選定的數(shù)據(jù)轉換的轉換元數(shù)據(jù);根據(jù)所述白盒元數(shù)據(jù)和所述轉換元數(shù)據(jù)生成包含用于每個白盒函數(shù)調(diào)用的特定實例數(shù)據(jù)的數(shù)據(jù)初始化文件;以及編譯所述轉換后的源文件、所述轉換后的白盒定義文件以及所述數(shù)據(jù)初始化文件,并且將所得到的編譯代碼文件鏈接到白盒庫以提供可執(zhí)行軟件應用程序。15.一種計算機程序產(chǎn)品,包括存儲計算機可執(zhí)行指令的計算機可讀介質(zhì),所述計算機可執(zhí)行指令在由處理器執(zhí)行時使得所述處理器實現(xiàn)一種利用白盒密碼術生成受保護的軟件應用程序的方法,所述方法包括以下步驟接收包括應用程序源代碼和抽象的白盒函數(shù)調(diào)用的至少一個輸入源文件;接收包含用于每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)的參數(shù)化文件;根據(jù)每個抽象的白盒函數(shù)調(diào)用的密碼域參數(shù)生成用于定義每個抽象的白盒函數(shù)調(diào)用的白盒調(diào)用定義數(shù)據(jù);將至少一個數(shù)據(jù)轉換應用于所述輸入源文件和所述白盒調(diào)用定義數(shù)據(jù),以分別生成轉換后的源文件和轉換后的白盒調(diào)用定義數(shù)據(jù);以及根據(jù)所述白盒調(diào)用定義數(shù)據(jù)和所述轉換后的白盒調(diào)用定義數(shù)據(jù)生成包含用于每個白盒函數(shù)調(diào)用的特定實例數(shù)據(jù)的數(shù)據(jù)初始化。16.根據(jù)權利要求15所述的計算機程序產(chǎn)品,其中所述方法進一步包括編譯所述轉換后的源文件、所述轉換后的白盒定義數(shù)據(jù)和所述數(shù)據(jù)初始化代碼,并且將所得到的編譯代碼鏈接到白盒庫以提供可執(zhí)行軟件應用程序。17.根據(jù)權利要求15所述的計算機程序產(chǎn)品,其中生成所述白盒調(diào)用定義數(shù)據(jù)包括生成白盒調(diào)用定義文件和指定為每個白盒函數(shù)調(diào)用選定的參數(shù)的白盒元數(shù)據(jù)。18.根據(jù)權利要求17所述的計算機程序產(chǎn)品,其中將所述至少一個數(shù)據(jù)轉換應用于所述轉換后的白盒調(diào)用定義數(shù)據(jù)生成轉換后的白盒調(diào)用定義文件和指定為所選擇的參數(shù)選定的數(shù)據(jù)轉換的轉換元數(shù)據(jù)。19.根據(jù)權利要求18所述的計算機程序產(chǎn)品,其中生成所述數(shù)據(jù)初始化包括根據(jù)所述白盒元數(shù)據(jù)和所述轉換元數(shù)據(jù)生成數(shù)據(jù)初始化文件。20.根據(jù)權利要求15所述的計算機程序產(chǎn)品,其中所述至少一個數(shù)據(jù)轉換包括塊密碼或非對稱密碼中的至少一個。全文摘要一種開發(fā)套件,用于利用白盒密碼術生成諸如DRM保護文件之類的文件。該套件由代碼生成工具、數(shù)據(jù)轉換引擎和白盒數(shù)據(jù)生成工具以及白盒庫組成。在白盒密碼術環(huán)境中,數(shù)據(jù)轉換引擎用于保護密碼運算和周圍代碼之間的邊界。具體而言,數(shù)據(jù)轉換引擎用于將數(shù)據(jù)轉換應用于密碼運算的輸入和輸出。如果用戶經(jīng)由白盒參數(shù)化文件指定需要轉換,則代碼生成工具將由用戶指定的信息翻譯成數(shù)據(jù)轉換引擎理解的形式,即作為有關數(shù)據(jù)變量和函數(shù)原型的修飾符。然后,數(shù)據(jù)轉換引擎應用所指定的轉換,并且將關于哪些轉換被選定的信息傳遞給數(shù)據(jù)生成工具。文檔編號G06F9/45GK102047220SQ200980118647公開日2011年5月4日申請日期2009年5月25日優(yōu)先權日2008年5月23日發(fā)明者丹尼爾·阿列·默多克,格蘭特·斯圖爾特·古德茲,菲利普·阿蘭·艾森申請人:愛迪德加拿大公司