黄一平,孙健华,梁梓辰
(1.广西师范大学电子与信息工程学院/集成电路学院,广西桂林 541000;2.广西师范大学计算机科学与工程学院,广西桂林 541000)
根据360 安全发布的2020 年上半年手机安全报告显示,360 安全共截获恶意程序104.8 万个,新增的恶意程序主要是资源消耗、隐私窃取等,360 手机卫士在2020 上半年为全国的手机用户拦截恶意程序攻击达19.8 亿次,手机信息安全存在着巨大的隐患,对加密工作形成了巨大的挑战[1]。手机属于白盒环境,而传统的AES(Advanced Encryption Standard)算法和国密SM4 算法[2-3]不能满足白盒环境。对于手机应用程序,各种逆向技术与各种破解技术层出不穷,黑客可能会在手机应用程序当中加入后门,导致手机设备信息泄露,造成重大的损失。
自从2002 年Chow 提出白盒密码以来,白盒密码就受到了广泛的关注。在国产密码的发展中,2010年,肖雅莹等提出了白盒SM4 国产密码算法。张慧[4]对白盒算法进行了分析,罗一诺[5]对白盒方案进行了改进,孙涛等[6]利用NoisyRounds 实现了白盒AES 算法,姚思等[7-8]使用置乱编码等方式对查找表进一步操作,提出了一种新型白盒。吴震等[9]使用白盒SM4 加密视频,取得了一定的成果。张跃宇[10-11]对白盒SM4算法进行了改进。汪宗斌等[12]将白盒算法应用到计算终端上。陶慎亮等[13]对白盒AES 算法进行了优化。白盒技术不断发展,但是大多数文献都是对白盒本身的查找表进行分析,白盒应用较少,无法真正体现白盒的优越性。水印技术的发展也很迅速,Celestine[14]提出了利用代码统计的方法来防止代码被篡改。方立娇[15]利用同态加密设计了水印算法,并应用于图片加密中。龙晓泉[16]将水印技术运用在数据库当中。
白盒SM4 算法空间复杂度高、执行效率慢,如果应用到手机应用软件当中,会极大地影响手机应用的运行效率。同样,软件水印信息暴露在白盒环境中,会遭到攻击者的攻击与破坏,水印若是遭到篡改,将无法达到检测的目的。白盒SM4 算法的改进措施如下:
1)针对应用软件被动态调试的问题,提出了一种白盒SM4 算法与水印技术相结合的方法,可以保证在对称加密的执行过程中,密钥可以隐藏,可以有效地阻止手机软件动态调试。
2)针对白盒SM4 算法执行效率低的问题,对白盒SM4 算法进行了优化,在满足手机应用白盒环境的前提下,空间复杂度降低到原来的1/2 左右,时间效率能提升四倍左右,既可以保证占用空间小,又能提高运行效率。通过计算得出,所提出的优化算法的复杂度较为合理,可以防止暴力破解,并能抵御BGE 攻击,表明白盒SM4 优化算法有着很好的安全性。
Chow 依据AES(Advanced Encryption Standard)第一次提出了关于白盒密码的概念,并且设定了白盒攻击的环境,其主要的条件如下:
1)运行在同一个主机中,并且可以运行加密软件,也有着特殊权限的攻击软件,对密码算法的攻击具有完全的控制权。
2)程序的动态执行是可以被监视的。
3)密码算法实现的细节以及执行的过程对于攻击者来说,是可见的,也是可以修改的。
SM4 算法主要是为了应对侧信道攻击所提出的方案,但是并不能抵御白盒环境下的攻击。肖雅莹按照Chow 等人提出的白盒AES 的思想设计了白盒SM4 算法。肖雅莹设计白盒SM4 算法主要思想为:将SM4 算法当中的每一轮加密分割成小块,然后对每一个小块进行置乱编码,置乱编码之后的结果使用查找表和仿射变换来表示,也就是将密钥的信息隐藏在查找表当中,防止攻击者获取到密钥信息。简单来说就是将每轮加密过程当中的信息进行混淆,与SM4 算法相同,加密轮数仍然为32 轮。
肖莱白盒SM4 算法的主要步骤为:
1)计算X=Xi+1⊕Xi+2⊕Xi+3,其主要过程如图1所示。
图1 肖莱白盒SM4加密步骤1
2)计算T(X⊕rki),把密钥隐藏在S 盒中,其主要过程如图2 所示。
图2 肖莱白盒SM4加密步骤2
3)计算Xi+4,其主要过程如图3 所示。
图3 肖莱白盒SM4加密步骤3
其中,式(1)中两个变量的计算如式(2)和式(3)所示:
其中,Ai+j(x)是GF(2)上的32×32 矩阵,GF(2)是最简单的有限域,只有0、1 以及异或运算和与运算;Eij为GF(2)上8 bit 到8 bit 的可逆仿射变换,并且Pi+j和Ei都是随机选择并且保密的。
图2 中的计算式如计算式(4)所示:
式(4)中X与rki的计算式如式(5)-(6)所示:
图3 中的主要计算式如式(7)-(8)所示:
经过图1 到图3 的步骤,将密钥隐藏在查找表中,即使攻击者能访问内存,也得不到密钥的相关信息。
水印技术是在代码中进行标记,开发者可以加入一些信息,主要作用就是防止代码被篡改,或者保护自己的核心代码不被逆向工作者直接盗用。因此文献[14]提出了一种盲零水印的算法,根据代码的原有特性以一定的逻辑加入相关的水印信息,当软件遭受攻击时,能够检索出来,并将代码进行还原,使得攻击无效。
这个算法需要一个可以被信任的证书颁发机构(Certificate Authority,CA),以版权的名义来注册内容,当怀疑受到攻击之时,从第三方提取相关的水印,当监测到篡改时,根据原始代码对软件进行恢复。此算法水印的嵌入是由软件的开发者来完成,而水印的提取由可信的第三方进行提取。
首先这个方法并不适用于白盒环境,其中的一些统计代码或者嵌入信息可能受到逆向工作者的攻击。其次,第三方的CA 证书并不可控,可以通过伪造CA 证书来实现SSL(Secure Sockets Layer)的中间人攻击等一系列的攻击方式,所以对于第三方的CA 证书需要改进。
对于手机应用程序,防止逆向主要就是混淆加密密钥,使其密钥不可见,可以很大程度上保证设备的安全性,并保证破解时无法计算复杂度,就可以有效地保证所提出的整个算法的安全性。加密时,运算的复杂度以及占用的时间都不能太高,否则将会很大程度上拖慢手机应用程序的运行速度,所以必须要降低空间占用并提升运行速度,以此来保证白盒SM4 算法能够运用到应用软件当中。
肖莱白盒算法有五次32 bit×32 bit 仿射变换,32轮的轮密钥加密。算法的优化设计主要就是简化循环次数和仿射变换复杂度,经过多次数据验证,发现循环的次数对于整个程序的执行时间影响并不是很大。所以需要优化仿射变换的次数,在保证安全性的前提下,降低其空间复杂度,并最大程度地优化时间。根据潘文伦对肖莱白盒的分析可知,其仿射矩阵和仿射常数的拆分对方案并没有明显加强,反而增加了运算的负担,但是仍需要保证一定的空间复杂度,保证从计算上不会被破解。潘文伦指出,在设计中应避免泄露复合变换的仿射常数。依据潘文伦的分析,对仿射变换的空间复杂度进行了优化,提高运行的效率,适配应用程序的运行。
如图1-3 所示,第一步将密钥隐藏于SBox 盒中;第二步依据16 bit×16 bit 的仿射变换,得到置乱编码,然后将其作为下一个变换的输入,每一个变换都需要对输入进行处理加入置乱编码,以此得到上一个变换输出的置乱编码,进行计算之后,得到本次的置乱编码;第三步,在经过两次16 bit×16 bit 的仿射变换,输出Xi+4。经过32 轮加密,最后输出(X35,X34,X33,X32)作为密文输出。其SBox 盒的复杂度保持不变,并使其加密的轮数依然保持在32 轮。通过大量的计算以及实验验证可知,这种方式对白盒SM4 的时间效率的提升最为有效,在保证安全性的基础上,提高应用程序的运行效率。
对于水印的算法优化,利用代码本身的数量以及特点进行统计,把这些信息当作水印信息进行处理。启动工程时就对这些信息进行统计,在此之前要将这些代码的相关信息存储到字符数组当中,然后结合白盒SM4 算法进行后续的操作。其水印数据的产生步骤如图4 所示。
图4 水印数据的产生步骤
将白盒SM4 加密算法与水印技术进行优化,以更好地适用于手机应用工程文件,保证整个手机应用的运行与加密过程流畅并能安全地运行。
首先编写对应的代码统计算法与基于肖莱白盒的SM4 加密算法,这部分在编写完成之后,能够根据这个思想,变换不同的语法,以嵌入到不同的工程当中。对白盒SM4 算法进行了优化,其嵌入替换的方式完全相同。
将上述思想融合到具体的手机应用工程文件当中,根据手机应用工程的运行方式添加代码同步运行,其主要过程如图5 所示。
图5 嵌入到APP工程当中具体过程
利用相关的统计代码提取工程中的相关信息作为水印,为了防止水印信息被篡改,将其水印信息直接输入到白盒SM4 算法中进行加密。为了防止攻击者通过内存分析等方式直接获取到统计信息,将这些统计信息直接输入白盒SM4 加密的明文数组当中。如果每个数据分为128 bit 分别输入,可以将这128 bit 信息加入伪造信息进行混淆,保证输入不可见并且可靠。将水印的对比信息存储下来,为了防止存储信息被破解推导,将存储信息也进行白盒加密。产生密文之后,可以对密文信息进行选择性比较,以此来进行置乱。存储信息可以存储在代码环境中经过白盒加密,也可以通过服务器发送相应的密文进行加密。然后把这两个加密之后的密文进行对比,如果出现问题,那么就直接改变程序的入口点,使工程停止运行;如果比对结果相同,那么工程就正常运行。
对密文进行比较之后,如果改变了此时程序的入口点,工程项目可能缺少相应的内存数据,导致整个软件崩溃,而且程序的入口地址可以由程序的开发者自行设定,完全可以使程序先运行一段时间,然后产生栈溢出、数据为空等一系列操作。为了保证白盒代码不被修改,也可以将白盒代码本身作为一个水印,将其统计信息输入到自身加密的信息当中。
白盒SM4 算法生成轮密钥的方式可以不断地进行改变,保证其算法的独特性,不会因为攻击者得到相同的算法,就能得到相同的密文。白盒算法也可以根据白盒SM4 算法的发展不断地进行更新换代,保证其安全性与稳定性。
现在很多手机应用软件,都会发布各种版本,不断升级,可以随时更新白盒加密的代码,也可以统计不同字符的相关信息,简单来说就是旧版本统计整数类型(int)有多少个,新版本去统计双精度浮点型(double)的数量,并可以加入很多无效信息,这个可以根据逆向人员修改代码的主要位置进行统计,输入的信息可以不断地变化。而且利用白盒SM4 加密后的水印数据进行判断时,可以将字符使用base64等加密算法进行加密,这样可以保证字符不会直接出现在代码中,保证其安全性,即使逆向工作者找到并破解了base64 的加密字符,也不能判断这些字符是否使用了白盒算法进行加密,更无法判断哪些是密文。
另外,判断加密数据与存储数据不同时,改变程序入口地址的位置,这些位置在不同的版本中可以选择不同的位置。当检测到加密数据与存储数据不同,可以采用备份或者是网络调用的方法,恢复相应的代码,使攻击者的攻击失效;还可以根据后期的项目对安全性的需求、备份所占用的空间、网络更新所需要的成本等按需设计。
基本设备为PC 机,其搭载的实验环境为Windows10 操作系统、12 GB内存、i5-6200U CPU-2.30 GHz、Visual Studio 2019,Android 版本为5.0。
白盒SM4 算法中有三个步骤,每一步所占用的空间为:
第一步,根据图3 流程所示,有三个16 bit 到16 bit的仿射变换,计算式如式(9)所示:
第二步,根据图4 流程所示,有四个8 bit 的输入和16 bit的输出,计算式如式(10)所示:
第三步,根据图5 流程所示,有两个16 bit 到16 bit的仿射变换,计算式如式(11)所示:
由于白盒SM4 中一共有32 轮加密,总占用空间的计算式如式(12)所示:
所改进的水印技术的统计与比较对空间复杂度影响甚微。其算法主要是分析白盒SM4 的空间复杂度,这直接关系到算法统计信息和存储信息的安全性。当前最主要的几种白盒算法的空间复杂度如表1 所示。
表1 白盒空间复杂度比较
提出的白盒+水印方案的复杂度相较于肖莱白盒SM4 降低了一倍,相较其他的算法,可以看出优化后的白盒SM4+水印方案在手机应用软件占用更少的资源。随着计算机技术的发展,量子计算机的出现将会对传统的密码算法造成很大的挑战,而密码算法也在不断演变,未来可以考虑将新的密码算法与水印技术相结合,从而替换目前的算法,继续保证应用的安全性,也可以根据不同的场景来更换不同的算法,有较高的适用性。
三种算法加密不同大小数据平均所占用的时间,其对比如图6 所示。在白盒SM4 算法与水印技术结合之后,发现其与仅为SM4 算法消耗的时间大致相同,水印技术占用的资源和时间很少,主要取决于加密算法的资源与时间。随着密码学的发展,可以替换白盒SM4 算法,继续保护应用安全,再次验证了优化之后的水印技术有着良好的可移植性。
图6 三种算法消耗时间及结果对比
通过对肖莱白盒SM4 算法、肖莱白盒SM4 算法+水印技术以及所提出白盒SM4 算法+水印技术的时间复杂度的对比,可以得出水印技术的植入对整个算法并没有太大的影响,表明白盒SM4 算法+水印技术有很好的可移植性,并且优化过后的白盒SM4+水印技术在时间效率上可以提升四倍左右,在保证安全的基础之上,保证整个算法降低内存占用,提高算法的效率,这样可以很好地将算法应用到手机应用软件中。
依据图1-3 的基本流程,经过优化改造之后,每一轮的白盒多样性如下。
第一步:
第二步:
第三步:
依据式(13)-(15)的计算,每一轮都包含上述三步的多样性,所提出的白盒SM4 算法基于肖莱白盒SM4,一共有32 轮加密。从多样性上来看,优化后的白盒SM4+水印技术是安全的。
BGE 攻击是根据查找表将输入置乱编码与输出置乱编码来恢复仿射变换,是针对白盒AES 的攻击,根据仿射变换输出置乱编码,因为每一轮的置乱编码与下一轮是互逆的,也就是Outr=(Inr+1)-1,除了第一轮,其他的置乱编码都可以计算,这样就可以得到隐藏的密钥。在白盒SM4 算法中,Outr≠(Inr+1)-1,这之间相差一个常数,这个常数对于攻击者来说是不可见的,也不能从查找表和预处理仿射变换中得到,因此白盒SM4 算法可以抵抗BGE 攻击。
将白盒代码与统计代码加入到Android 的项目工程文件当中一起进行编译,然后找出相应的资源文件进行代码统计,并统计自身的代码,防止被修改。最后对其密文进行判断,如果不相等,就改变程序的入口点,使程序失效。Android 工程使用Androidkiller进行逆向分析。
Androidkiller 是一款可以对手机的APK 文件进行反编译的工具,可以对反编译之后的smali 文件按照逆向工作者的想法进行修改,然后可以对修改后的文件重新进行打包。将上述编写好的APK 利用Androidkiller 逆向分析出相关代码,应用程序的逆向代码,为smali 语言。其中包含goto 的跳转,数据库的传输、关闭,还有if-eqz,即为if-else,逆向工程师可以对这些代码进行修改,比如a变量大于0,继续执行;如果a变量小于或等于0,提示错误信息,不在向下执行,逆向工程师可以直接修改a变量小于或等于0 即可成功执行,导致占用服务器或其他的资源,对整个项目运行的安全性造成了极大的挑战。在应用程序代码中加入所提出的算法,逆向修改完成之后可重新打包签名,在测试环境下进行安装,发现程序已经停止运行,无任何修改时,手机软件可以正常运行,说明白盒SM4+水印技术有着很好的适用性。
白盒加密技术对今天各种安全问题有着重要的意义,特别是对于手机这种白盒环境当中的应用软件,针对无法联网认证的手机软件,需要保证应用程序不被篡改。对白盒SM4 算法进行优化,在满足手机应用白盒环境的基础上,相较于肖莱白盒SM4 算法空间复杂度降低为原来的1/2,时间效率提升四倍左右,其复杂度满足保护手机软件的要求,且可以抵抗BGE 攻击。白盒SM4 优化算法结合水印技术应用于手机应用软件,既可以保证运行效率,也有利于保护手机的安全以及手机应用开发者的权益。由于仿射常数的特殊性,对常数的保护,是下一步白盒算法研究的重点。