专利名称:用于指令级软件加密的方法和设备的利记博彩app
技术领域:
本发明一般地涉及软件,更具体地,涉及软件的加密及其解密以及在处理器中的执行。
背景技术:
本节意在向读者介绍可能与以下描述和/或要求保护的本发明的各方面相关的 领域的各个方面。相信这种讨论有助于向读者提供背景信息,以便于更好地理解本发明的 各个方面。相应地,应注意,应根据这一点来阅读这些陈述,而不应将其接纳为现有技术。
长期以来,在本领域中,例如在US5386469以及US6345359中,已知通过加密来保
护软件代码并且仅当要执行指令时才逐条指令地对指令进行解密。这些系统的缺陷是黑客 可以相对容易地修改指令以查看会发生什么。 为了克服该缺陷,US 2005/108507提出对代码的基本块进行加扰并且通过生成签 名来确保完整性。该解决方案的缺陷在于,在不关心完整性的被破解的系统上,依然有可能 在尝试破解该系统时替换指令。 因此可以理解,需要一种克服现有技术的这些缺点中的至少一些缺点的软件加密 解决方案。本发明提供了这种方案。
发明内容
在第一方面,本发明的目的是提供一种对编译的计算机代码指令的集合进行加密 以获得编译的计算机代码指令的加密集合的方法,所述加密集合预期在执行期间逐条指令 地进行解密。所述编译的计算机代码指令的集合包括多个分支指令以及标记指令,其中,所 述编译的计算机代码指令的集合的执行可以从多个分支指令中的每一个直接继续至标记 指令。使用链式加密函数对标记指令进行加密,使得加密的标记指令至少依赖于标记指令 的值和所述多个分支指令中所选的一个分支指令的值;以及将所述多个分支指令中除了所 选的一个分支指令之外的至少一个分支指令中的每一个与补偿器值相关联,所述补偿器值 要用于调整对加密的标记指令的解密,使得不管紧接在标记指令之前执行所述多个分支指 令中的哪一个,在执行期间都产生相同的结果。 在第一优选实施例中,对标记指令的加密还依赖于与标记指令相关联的伪随机 数。 在第二优选实施例中,所述伪随机数是作为代码密钥和所述伪随机数的生成所针 对的指令的偏移的函数来生成的。 在第三优选实施例中,所述标记指令的值和所述多个分支指令中所选的一个分支 指令的值分别是相应的操作码(opcode)部分的值。 在第四优选实施例中,加密是通过对所述标记指令的值与所述多个分支指令中所 选的一个分支指令的值进行异或(X0R)来执行的。 在第二方面,本发明的目的是提供一种对使用链式加密函数加密的编译的计算机代码指令的集合进行解密的方法。在所述编译的计算机代码指令的执行期间,获得针对所 执行的函数的补偿器值和后续加密的函数,在所述编译的计算机代码指令的执行期间,所 述后续加密的函数跟随在所执行的函数之后;获得针对所述后续加密的函数的伪随机数; 以及使用与所述链式加密函数相对应的解密函数来对后续加密的指令进行解密,所述解密 函数至少根据所述后续加密的指令、所执行的函数、所述伪随机数和所述补偿器值来生成 后续函数。 在第一优选实施例中,所述伪随机数是作为代码密钥和所述后续加密的函数的偏 移的函数来生成的。 在第二优选实施例中,加密的函数包括加密的操作码和未加密的参数(如果存 在),并且只有所执行的函数和所述后续加密的函数的操作码部分用于解密。
在第三优选实施例中,解密是通过对所述后续加密的指令的值、所执行的函数、所 述伪随机数和所述补偿器值进行异或来执行的。 在第三方面,本发明的目的是提供一种用于对编译的计算机代码指令的集合进行
加密以获得编译的计算机代码指令的加密集合的设备,所述加密集合预期在执行期间逐条
指令地进行解密。编译的计算机代码指令的集合包括多个分支指令以及标记指令,其中编
译的计算机代码指令的集合的执行可以从多个分支指令中的每一个直接继续至标记指令。
所述设备包括适于执行以下步骤的处理器使用链式加密函数对标记指令进行加密,使得
加密的标记指令至少依赖于标记指令的值和所述多个分支指令中所选的一个分支指令的
值;以及将所述多个分支指令中除了所选的一个分支指令之外的至少一个分支指令中的每
一个与补偿器值相关联,所述补偿器值要用于调整对加密的标记指令的解密,使得不管紧
接在标记指令之前执行所述多个分支指令中的哪一个,在执行期间都产生相同的结果。 在第四方面,本发明的目的是提供一种用于对使用链式加密函数加密的编译的计
算机代码指令的集合进行解密的设备。所述设备包括适于在编译的计算机代码指令的执行
期间执行以下步骤的处理器获得针对所执行的函数的补偿器值;获得后续加密的函数,
在所述编译的计算机代码指令的执行期间,所述后续加密的函数跟随在所执行的函数之
后;获得针对所述后续加密的函数的伪随机数;以及使用与所述链式加密函数相对应的解
密函数来对后续加密的指令进行解密,所述解密函数至少根据所述后续加密的指令、所执
行的函数、所述伪随机数和所述补偿器值来生成后续函数。 在第五方面,本发明的目的是提供一种包括计算机代码指令的数字支持介质,当 在计算机上执行时,所述计算机代码指令执行根据本发明的第二方面的方法。
现在参考附图,通过非限制性示例来描述本发明的优选特征,其中
图1示出了根据本发明的优选实施例的总体链式处理模式加密方案;
图2更详细地示出了如何根据本发明的优选方法对指令进行加密
图3示出了使用本发明的优选实施例加密的具有跳转的代码的示例;以及
图4示出了根据本发明的优选实施例的用于代码加密和解密的系统。
具体实施例方式
本发明提出通过对编译的软件代码指令进行加密以及随后的解密来保护软件。为 了进行描述,高级代码指令包括下列至少其一 -基本块,即永远按顺序执行的机器级指令的集合。如果基本块包括跳转或者类似 指令,则该指令为最后的机器级指令。这是由于通常在执行该代码时才决定下一个机器级 指令。 _标记,可以认为是跳转指令的目的地。如果基本块包括标记,则该标记永远作为 第一个指令出现。
图1示出了根据本发明的优选实施例的总体链式处理模式加密方案。通常,通过
将指令与随机数和先前的指令进行异或来对指令进行加密。在图1中给出的示例中,仅对
三条指令进行加密,但是将理解这可以推广到更大(或者更小)的数目。待加密的指令Instr 1、 Instr 2以及Instr 3出现在左侧的第一列中。第二列
包括伪随机数,优选地,这些伪随机数对于每一条指令来说是不同的。伪随机数是由流密码
102使用秘密密钥来提供的伪随机流的一部分,所述密钥优选地对每一个编译的代码而言
是唯一的。流密码是众所周知的密码原语;RC4和Salsa是两个非限制性示例。可以以以下
方式来使用块密码块密码可以有效地用作流密码,例如计数器模式中的AES(AES-CTR)。 第三列包括先前未加密的指令的值,除了第一个指令不具有先前的指令以外,所
以,取而代之地使用初始化向量IV 104。第四列包括产生的加密函数。 可以看到,将第一指令与第一伪随机数以及初始化向量IV进行异或以产生第一
加密指令{Instr. 1}。然而,通过将第二指令与第二伪随机数和第一指令进行异或来对第二
指令进行加密,以产生第二加密指令{Instr. 2}。以相同方式对其它指令进行加密,即通过
与伪随机数和先前的指令进行异或。 本领域技术人员将理解,图1描述的链式处理模式对于基本块的加密可以良好地 工作。然而,超出该范围则无法使用该模式,这是由于可能发生以下情况可以从多处到达 的指令(例如通过跳转)具有多个互不相同的先前指令。通常这仅在一种情况下可以产生 可以正确的解密,即从"正确"的先前指令到达后续指令的情况。 然而,本发明使得可以对整个代码进行链式处理。为此,将至少一些(可能是全 部)指令与随机数补偿器相关联,随机数补偿器用于对随后的指令进行加密和解密。如下 面将描述的,这些随机数补偿器确保不管哪一个指令是先前指令都可以正确地对指令进行 解密。为了清楚,应当指出,随机数补偿器通常不是随机的,而是补偿伪随机数的值。
假定例如指令114具有两个可能的先前指令,113和17。每一个先前指令分别与随
机数补偿器Q和(:7相关联。 在没有随机数补偿器的情况下,使用从指令113的链式操作对指令114进行加密得到 {I14}=I14@R14 113, 其中①表示异或运算并且括号表示加密的指令。 类似地,使用从指令17的链式操作对指令114进行加密得到 {Ii4}= 1,4十R14@ 17, 如果17和113不同(这是通常情况),则{114}具有两个可能值。为了得到{114}的
相同加密值,使用随机数补偿器(:13和(:7。等式变为
6
{I14}=I14 R14 Cn十I。,以及 {114}= I14 R14 C7 I7。 为了确保两个等式产生相同的结果,右侧必须相同,即 I)4 R14④C13 I,3 = I14④R14④C7④I7, 可以将其简化为
C13 I13= C ④I7。
这意味着,如果(13=C7 I7@ 113,则获得相同的加密结果。 有利地,将随机数补偿器存储在具有二进制代码的随机纠正表(RCT)中,优选地 在其首部中进行加密。 优选地,就在代码执行之前执行代码的解密。处理器420能够使用流密码202以 秘密密钥作为输入来生成正确的伪随机数,以对每一条指令进行解密。在具有随机数补偿 器的情况下,从指令I7对指令I14进行解密得到 {114}十R14④C7 I7 = I14 R14 @ C7①I7④R14④C7④I7 = Ii4, 从指令113得到 {114}十R14十C13十I13 = {114}十RM十C7 @ I7十I13 @ I13 = I14 因此两个等式产生相同的解密结果I14 图2更详细地示出了如何根据本发明的优选方法对指令进行加密。在软件代码的 编译期间,编译器提供与执行跳转的指令相关的信息。该信息用于对编译的代码进行加密。
如图1所示,通过将指令Instr. 2与先前指令Instr. 1和伪随机数进行异或来对 指令Instr. 2进行加密,得到加密的指令{Instr. 2}。 然而,图2提供了生成伪随机数的更多细节。由流密码202(如图1所示,优选地是 RC4、 Salsa或者AES-CTR)生成伪随机数。流密码202使用代码密钥以及指令偏移206作 为输入。RCT 204也使用指令偏移206作为输入并且提供随机数补偿器Q。如果Instr. 2 的加密不需要纠正(如果Instr. 2不是标记则属于这种情况),则在RCT 204中优选地没有 与指令偏移206相关联的信息。 指令偏移206向流密码202提供信息以确保针对指令每次都生成相同的随机数。 本领域技术人员将理解,由于以预定顺序生成代码块,因此在图1中不需要这种指令偏移, 而图2允许代码中的跳转;S卩,第n个待执行的指令不一定必须是代码中的第n个指令。
可以认识到,可以将任意跳转指令的随机数补偿器设置为零,然后按照需要进行
迭代,以计算应当纠正的指令的随机数补偿器,从而实现代码的完全链式处理。
图3示出了使用本发明的优选实施例来加密的具有跳转的代码的示例。可以看 到,可以从两个不同指令I5、 I7到达最终指令I8。为了确保不管先前指令是哪一个,加密指 令{Instr. 8}都相同,则确保(:7@17=(:5@ 15。出于简明的原因,在图3中未示出用于对指 令进行加密的随机数&。
如果设置了 (:7,则将(:5计算为(:76> 17@ 15。另一方面,如果设置了 (:5,则将(:7计
算为C5④17@ 15。如前所述,通常设置哪个随机数补偿器是并不重要;重要的是能够对从
每一个可能的先前指令到达的指令进行解密。 然后,在前述RCT表中存储随机修改器的值。
图4示出了根据本发明的优选实施例的用于代码加密和解密的系统400。系统400 包括适于接收和加密编译的二进制代码"Code"的加密设备410。加密设备410适于如前 所述对二进制代码进行加扰。加密设备410存储预期用于加扰代码{Code}K。的处理器420 的公共密钥Kpub,并且生成优选地每次都改变的秘密代码密钥K。(随代码不同而不同)。公 共密钥Kpub可以对预期的设备或多个设备而言是唯一的。由流密码使用秘密密钥K。来生成 随机流。为了安全地传输秘密密钥K。,使用公共密钥Kpub对其进行加密,这产生加密的秘密 密钥{K。}Kpub。 {K。}Kpub具有二进制代码(优选在其首部中)。 可以在一个或者更多处理器(图中未示出;下文中称为"处理器")或者更大设备 的一部分中实现加密设备410,该更大设备还包括适于编译代码的编译器并且还包括至少 一个通信单元和一个存储器。加密设备410适于分析编译的代码以找到必需的信息(例如 标记)以完成加密。 加密设备410还适于通过相同的信道或者通过分离的信道向处理器420发送加扰 的代码{Code}K。以及加密的秘密密钥{K。}Kpub。可以理解,加扰代码(CocMK。(具有或者不 具有加密的秘密密钥{Ke}Kpub)可以分布在数字支持介质430上,例如CD-ROM,或者任意合 适的数字分布网络(例如因特网、LAN、 UMTS)。 处理器420从二进制代码首部中提取加密的秘密密钥{Ke}Kpub。处理器420优选 包括适于使用与公共密钥相对应的私有密钥KPriv来对{K。} Kpub进行解密的密码处理器421 。 优选地,在安全(防篡改的)的位置存储私有密钥KpHv。密码处理器还适于使用秘密密钥 K。对加扰的代码(CocMK。进行解扰,以获得二进制代码,当对指令进行解扰时,将该二进制 代码转发至高速缓存423,并且从高速缓存423将其进一步传送至第二处理器(CPU) 424以 供执行。处理器420还包括适于存储RCT的存储器(RAM) 422。 尽管可以使用普通处理器来实现该系统和方法,应当理解,由于所谓的密码处理 器更安全,因此使用密码处理器是有利的。 在前文的描述中,已经提到对指令进行加密。本领域技术人员将理解,指令的长度 可以根据与所谓操作码相关联的变量的数目而改变。 根据第一种变型,仅对每一条指令的操作码进行加密,不对变量进行加密。 根据第二种变型,用于加密的伪随机数与最长指令的长度一样长。如果这样,首先
对操作码进行解密,以获得与该操作码关联的变量长度相关的知识。然后在第二过程中,对
变量进行解密。为了使用第二变型对指令进行链式处理,如果先前指令较长则将先前指令
截断至当前指令的长度,但是如果之前的指令较短(或者等长)则不需要截断。 本领域技术人员将理解,如果仅计算随机数补偿器以便不管当前讨论的指令之前
执行哪个指令都获得相同的解密值,则可以将用于指令加密的伪随机数与指令本身或者与
先前指令相关联。 可以独立地或以任何合适组合来提供说明书以及(在合适时)权利要求和附图中
公开的每个特征。被描述为以硬件实现的特征也可以以软件实现,反之亦然。 权利要求中出现的参考标记仅作为示意,不应对权利要求的范围起限制作用。
8
权利要求
一种对编译的计算机代码指令的集合进行加密以获得编译的计算机代码指令的加密集合的方法,所述加密集合预期在执行期间逐条指令地进行解密,所述编译的计算机代码指令的集合包括多个分支指令(I5、I7)以及标记指令(I8),其中,所述编译的计算机代码指令的集合的执行能够从所述多个分支指令中的每一个(I5、I7)直接继续至所述标记指令(I8),所述方法包括在设备(410)处执行的以下步骤使用链式加密函数对所述标记指令(I8)进行加密,使得加密的标记指令({Instr.8})至少依赖于所述标记指令(I8)的值和所述多个分支指令中所选的一个分支指令的值;以及将所述多个分支指令中除了所选的一个分支指令之外的至少一个分支指令(I5、I7)中的每一个与补偿器值(C5、C7)相关联,所述补偿器值(C5、C7)要用于调整对所述加密的标记指令({Instr.8})的解密,使得不管紧接在所述标记指令(I8)之前执行所述多个分支指令(I5、I7)中的哪一个,在执行期间都产生相同的结果。
2. 根据权利要求l所述的方法,其中,对所述标记指令(I8)的加密还依赖于与所述标 记指令(I8)相关联的伪随机数。
3. 根据权利要求2所述的方法,还包括以下步骤作为代码密钥和所述伪随机数的生 成所针对的指令的偏移的函数,来生成所述伪随机数。
4. 根据权利要求l所述的方法,其中,所述标记指令(I8)的值和所述多个分支指令 (I5、 I7)中所选的一个分支指令的值分别是相应的操作码部分的值。
5. 根据权利要求l所述的方法,其中,所述加密是通过对所述标记指令(I8)的值与所 述多个分支指令(I5、I7)中所选的一个分支指令的值进行异或来执行的。
6. —种对使用链式加密函数加密的编译的计算机代码指令的集合进行解密的方法,所 述方法包括在所述编译的计算机代码指令的执行期间在设备(420)处执行以下步骤获得针对所执行的函数(I5、I7)的补偿器值(C5、C7),获得后续加密的函数({Instr. 8}),在所述编译的计算机代码指令的执行期间,所述后 续加密的函数跟随在所执行的函数(I5、I7)之后;获得针对所述后续加密的函数({Instr.8})的伪随机数;以及使用与所述链式加密函数相对应的解密函数来对后续加密的指令(I8)进行解密,所述 解密函数至少根据所述后续加密的指令({Instr. 8})、所执行的函数、所述伪随机数和所述 补偿器值来生成后续函数(I8)。
7. 根据权利要求6所述的方法,还包括以下步骤作为代码密钥和所述后续加密的函 数({Instr.8})的偏移的函数,来生成所述伪随机数。
8. 根据权利要求6所述的方法,其中,加密的函数包括加密的操作码,如果存在未加 密的参数,还包括未加密的参数,并且,只有所执行的函数(I5、 I7)和所述后续加密的函数 ({Instr.8})的操作码部分用于解密。
9. 根据权利要求6所述的方法,其中,所述解密是通过对所述后续加密的指令 ({Instr.8})的值、所执行的函数、所述伪随机数以及所述补偿器值(C5、 C7)进行异或来执 行的。
10. —种用于对编译的计算机代码指令的集合进行加密以获得编译的计算机代码指令 的加密集合的设备(410),所述加密集合预期在执行期间逐条指令地进行解密,所述编译的 计算机代码指令的集合包括多个分支指令(I5、I7)以及标记指令(18),其中,所述编译的计算机代码指令的集合的执行能够从多个分支指令中的每一个(I5、 I7)直接继续至所述标记 指令(18),所述设备(410)包括适于执行以下步骤的处理器使用链式加密函数对所述标记指令(I8)进行加密,使得加密的标记指令({Instr. 8}) 至少依赖于所述标记指令(I8)的值和所述多个分支指令中所选的一个分支指令的值;以及将所述多个分支指令中除了所选的一个分支指令之外的至少一个分支指令(I5、I7)中 的每一个与补偿器值(C5、C7)相关联,所述补偿器值(C5、C7)要用于调整对所述加密的标记 指令({Instr.8})的解密,使得不管紧接在所述标记指令(I8)之前执行所述多个分支指令 (I5、 I7)中的哪一个,在执行期间都产生相同的结果。
11. 一种用于对使用链式加密函数加密的编译的计算机代码指令的集合进行解密的设 备(420),所述设备(420)包括适于在编译的计算机代码指令的执行期间执行以下步骤的 处理器(421):获得针对所执行的函数(I5、I7)的补偿器值(C5、C7),获得后续加密的函数({Instr. 8}),在所述编译的计算机代码指令的执行期间,所述后 续加密的函数跟随在所执行的函数(I5、I7)之后;获得针对所述后续加密的函数({Instr.8})的伪随机数;以及使用与所述链式加密函数相对应的解密函数来对后续加密的指令(I8)进行解密,所述 解密函数至少根据所述后续加密的指令({Instr. 8})、所执行的函数、所述伪随机数和所述 补偿器值来生成后续函数(I8)。
12. —种包括计算机代码指令的数字支持介质(430),当在计算机上执行时,所述计算 机代码指令执行根据权利要求6至9中任一项所述的方法。
全文摘要
本发明提供一种对要在执行期间逐条指令地进行解密的编译的计算机代码指令进行加密的方法。使用链式处理模式对所述计算机代码指令进行加密,使得加密的指令({Instr.8})依赖于指令(I8)的值、先前指令(I5、I7)的值和伪随机数。由于可能发生可以从多于一个先前指令(I5、I7)到达指令的情况,先前指令(I5、I7)中的至少一个与随机数补偿器相关联,所述随机数补偿器在加密的指令的解密期间使用,使得不管先前指令是哪个指令,对加密的指令的解密都产生相同的结果。本发明还提供了一种加密设备、解密设备和方法、以及存储加密的编译的计算机代码指令的数字支持介质。
文档编号G06F21/12GK101751243SQ20091025280
公开日2010年6月23日 申请日期2009年12月1日 优先权日2008年12月15日
发明者安东尼·蒙西弗罗特, 斯蒂芬·昂奴, 穆罕默德·卡若米 申请人:汤姆森许可贸易公司