2024年4月21日发(作者:)

白盒AES加密在软件保护中的应用

摘要 加密是软件保护中最古老、最常见的方法,它常常和其他的方法和混合起来使用,

以进一步增强对软件的保护效果。由于软件是处在“白盒”的执行环境中的,传统的加密

方法在软件保护领域难以取得良好的效果,这并因为非加密算法的强度不够,而是由于软

件的执行过程是可以被跟踪的,也就是说密钥和加密算法对于攻击者是可见的,所以需要

特定的针对白盒模型的加密手段来保护软件及密钥安全。本文主要探讨软件保护中的密钥

安全问题,分析了传统软件密钥保护方法的局限与不足,提出一种最佳的解决方案,即白

盒加密算法,并具体分析了一种基于AES加密的白盒实现算法。

引言

软件保护主要是为了防止软件被破解、被修改或被盗版等,现在较为成熟的软件保护

技术主要包括,代码混淆[1]、加密、多态、水印、指纹、虚拟机、远程过程调用和基于硬

件的保护等,我们往往根据不同的保护目的,选择或混合使用不同技术对软件进行保护。

其中加密技术是使用最广泛的软件保护技术之一,如软件加壳就是对整个代码段进行一次

性加密并在软件运行时一次性解密,自修改代码就是在软件运行的过程中根据需要动态地

进行代码块的加解密。传统的加密技术的有一个基本假设就是攻击者无法获得密钥,具体

而言,认为攻击者并未实质性地接触到密钥或者任何内部操作,仅仅能观察到一些外部信

息或者操作,这些信息包括系统内的明文(输入)或者密文(输出)。但在软件保护领域传

统加密算法遇到了很大的挑战,这主要是由于软件实际上是处在白盒环境中的。白盒的定

义主要包括三点,一是攻击者对主机和软件具有完全控制权,二是软件动态执行过程是可

见的,三是加密算法内部细节完全可见。在这种白盒环境中,传统的密钥由于需要存储在

软件中,很容易被跟踪和定位,并以密钥为线索分析加密算法的种类进而对程序进行破解,

因此当加密技术应用于软件保护上时,需要更多关注如何隐藏和保护密钥。

1 相关研究

在软件保护领域中,密钥保护的思路主要有三种,第一种是自生成密钥,即密钥是由

需要保护信息自身生成出来的;第二种是分块密钥,即密钥有很多块,存放在不同位置。

第三种是白盒加密[2],其核心思想是让密钥固化在加密算法中,同时用人类无法理解的随

机矩阵将算法混淆。

1.1 自生成密钥

自生成密钥的基本思路是让由文件自身的信息来生成密钥,要从文件自身提取信息来

生成密钥就必须将文件分块加密,这是因为若文件没有分块,即仅有一块,加密后文件变

成了密文,密钥依赖的生成信息也就不存在了。自生成密钥的实现方法是首先对文件进行

分块,然后按指定顺序依次加密,每一块的密钥都不是提取自身的信息,而是依赖于其他

块的信息,这种顺序依赖原则可以保证始终有信息可以用来生成密钥,在解密时必须严格

按照加密相反的顺序逐块解密。

自生成密钥的缺点有两点,一是必须按顺序解密,所以当仅需要解密Bi块时,必须将

B1,B2,···Bi块全部解密。二是需要保存加密顺序t及分块的数量n,由于每次解密时都

需要访问t和n,因此它们是加密算法的敏感数据,很容易成为攻击的突破口。

自生成密钥算法的本质并没有脱离使用密钥,它是一种把单密钥设计改成循环动态生

成密钥并加密的算法,该算法严重依赖解密顺序,使用场景有一定的限制,而且重复生成

密钥会带来较大开销。

1.2 分块密钥