1. 引言
数字信号处理器(DSP)目前在航空、国防、机器视觉等领域都有广泛应用,然而随着破解技术的不断发展,DSP脆弱的安全体制与强大的攻击方法之间形成巨大反差。为了保护DSP产品的经济价值和知识产权,需要对程序文件进行加密存储。
一般情况下,DSP的用户程序往往以明文的方式存储于外部的存储器中,例如FLASH或EEPROM。非法用户可以通过读取存储器中数据,或通过监听系统总线获取源程序或敏感数据,并对其进行反编译或篡改。因此有必要对用户程序进行加密处理和完整性检测。
DSP程序文件加密保护目前可以采用DSP芯片加密、专用加密芯片、软件加扰混淆、FPGA加密等方法。目前已有部分DSP芯片(例如TI公司的28335芯片 [1] )具备加密功能,但是由于芯片是国外厂商,无法确定其是否留有后门,一般不采用此方法。专用加密芯片或者FPGA加密需要修改硬件架构,对于硬件成熟度较高的产品并不适用 [2]。软件加扰即向原有源程序中添加干扰代码,在增加阅读难度的同时也增大了DSP程序文件占用内存的大小,有可能会影响软件正常运行。基于上述情况,本文提出了一种以软件的方式实现了DSP程序文件的加密保护,可在不改变DSP硬件系统架构的情况下对DSP程序文件进行有效的加密保护。
2. DSP程序文件结构分析
在对DSP程序文件进行加密之前,需要对其文件结构进行分析,确保加密前后程序文件的运行结果能够完全一致。目前主流的DSP芯片主要有TI公司的TMS320系列和AD公司ADSP21xx系列,因此需对这两种芯片程序文件格式分别进行分析。TMS320系列DSP芯片采用CCS开发工具进行编译,生成的程序文件为OUT格式,需要对其进行转换为BIN格式烧录到Flash中;ADSP21xx系列芯片采用ADSP++开发工具进行编译,生成的程序文件为LDR格式。
2.1. OUT格式和BIN格式分析
使用CCS开发后的程序文件为OUT格式,文件包含文件头、扩展头、段落头、段落数据、重定位表、行号表、符号表、字符串表,文件结构如图1所示。文件头用于保存OUT文件的基本信息,如文件标识、各个表的位置等;根据文件头的基本信息,决定扩展头是否存在,扩展头用于描述文件头没有描述的信息;段落头用于描述段落信息,每个段落都有一个段落头描述,段落的数目在文件头中会指出;段落数据通常是OUT文件中最大的数据段,每个段落的真实数据就保存在这个位置;重定位表用于描述OUT文件中符号的重定位信息;行号表用于描述OUT文件行号信息;符号表用于描述文件中所用到的所有符号的信息;字符串表用于保存程序中所用到的字符串。
与程序加密有关的主要有文件头、扩展头、段头和段数据,具体数据结构如图2所示:可以从文件头中获取到区块个数,扩展头大小;从扩展头获取到代码段和数据段偏移地址、段长度、程序入口点等信息。后续加密操作可以基于此结构对代码段和数据段进行选择性加解密。
在研制过程中开发人员需将OUT格式文件转换为BIN格式进行烧录,一般的转换方法为先将OUT文件通过TI工具hex6x_33.exe依据开发人员编写的cmd文件,转换为hex文件和map文件,再通过hex2bin.exe生成BIN格式文件,流程如图3所示。

Figure 3. BIN file generation process
图3. BIN文件生成流程
转换后的BIN格式文件如图4所示:文件头为4字节_c_int00的地址,软件从该地址开始初始化并运行;接着为段n的长度、地址和段数据,最后为文件结尾。通过分析与测试验证可知,该文件是连续加载到内存中,因此可以对BIN文件全部数据进行加解密处理。
2.2. LDR格式分析
针对AD公司的DSP芯片开发人员需要使用Visual DSP++工具进行开发,最终生成的程序文件为LDR格式文件。某工程项目的LDR文件示例如图5所示。该文件中数据由多行组成,每行的数据格式为:起始为1个“:”,1个字节的数据长度n,6字节内存映射地址,n字节数据,1字节校验,具体的LDR文件数据结构如图6所示。由于该格式文件的内存映射地址往往是不连续的,无法对其直接进行统一处理,因此,针对LDR格式文件,需首先从中分别过滤出地址部分呵数据部分,然后才能进行加解密处理。
3. SM4密码算法
1) 密码算法描述
加密算法主要有对称加密、非对称加密、Hash算法。对称加密算法在加解密过程中使用相同的密钥,应用简单快捷,可以加密大量数据。非对称加密算法采用公钥和私钥两种不同的密钥进行加解密,密钥成对出现,安全性高,但是算法强度复杂。Hash算法时一种单向算法,通过该算法可以对目标数据生成一段特定长度且唯一的Hash值,却不能通过Hash值重新获得目标数据,通常用于数字摘要,完整型校验等。在DSP程序文件加密过程中,主要采用对称加密算法进行数据加密,本文选用SM4对称加密算法进行数据加密。
SM4算法是由国家密码管理局公布的一种分组密码算法,在使用上表现出了安全高效的特点,与其他分组密码算法相比较有以下的优势 [3]。
· 首先是算法资源利用率高,表现为在密钥扩展算法与加密算法可共用;
· 其次加密算法流程和解密算法流程一样,只是轮密钥顺序相反,因此无论是软件实现还是硬件实现都非常方便;
· 算法中包含异或运算、数据的输入输出、线性置换等模块,这些模块都是按8位进行运算的,现有的处理器完全能处理。
2) 算法整体结构
SM4分组密码算法主要包括加密算法、解密算法以及密钥扩展算法三部分。算法分组长度为128bit,密钥长度为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以32位为单位进行加密运算,每一次迭代运算均为一轮变换函数F。SM4算法解密过程与加密一致,只是使用加密轮密钥的逆序进行解密,整体结构如图7所示 [4]。
整体的加密函数为:
其中X0、X1、X2、X3为128bit明文分组后的结果,轮密钥表示为rki。T为一个合成置换,由非线性变换
和线性变换L复合而成,即
。
非线性变换
由4个平行的S盒构成,S盒的数据均采用16进制。设输入为
,输出为
,则
。
线性变换L公式如下,其中B为非线性变换得到的字:
3) 密钥扩展
已知加密密钥
,系统参数
,采用16进制表示,具体为:
,
,
,
;固定参数
。rki为轮密钥,轮密钥由加密密钥生成。
首先
;然后对
,该变换与加密中的T变换基本相同,只是将其中的线性变换为
。
4) 加/解密算法
定义反序变换R为:
设明文输入为
,密文输出为
,轮密钥为
。则本算法的加密变换为:
本算法的解密变换与加密变换结构相同,不同的仅是轮密钥的使用顺序。
加密时轮密钥的使用顺序为:
。
解密时轮密钥的使用顺序为:
。
4. 基于SM4密码算法的DSP程序文件加密处理方法
4.1. 程序文件加密处理
根据文件解析和SM4密码算法的实现结果,需要设计对程序数据的加密,一般程序加密过程在上位机软件中运行,加密过程如图8所示。
1) 首先打开上位机软件,将程序文件读入内存中,根据选择的文件格式,按照分析结果对其进行解析,提取出需要加密的数据,通常我们选择对代码段(.text)和数据段(.data)进行加密;
2) 然后进行密钥初始化:根据SM4密码算法密钥扩展过程,对系统参数,加密密钥,固定参数进行密钥扩展,生成轮密钥,其中加密密钥一般由用户输入或采用随机数生成器生成随机数;
3) 对(1)中提取出的待加密数据进行摘要生成,此部分采用摘要算法,例如MD5、SM3,具体算法原理参考文章 [5];
4) 对(1)中提取出的待加密数据按照密码算法要求(128bit)进行分组;
5) 将分组后的数据输入到密码算法的加密函数中进行加密,生成密文数据后,写入到密文文件中;将(4)中的摘要数据也写入到密文文件中,最终得到加密后的程序文件。
4.2. 自动解密设计和完整性验证
DSP通常依赖片外Flash启动系统,其主要工作原理是:DSP系统在上电复位时序结束后,DMA控制器从片外Flash的起始地址空间拷贝一定数目的代码到片内RAM,并从RAM空间零地址处开始存放。当数据块传输完成后,CPU脱离“阻塞”状态,开始从片内RAM的零地址处执行相应的指令 [6]。通过上述一次硬件代码加载(一级BootLoader)往往难以将用户应用搬迁到系统RAM,需要再编写二次拷贝代码,进而形成二次启动加载程序(二级BootLoader)。DMA控制器先将二次启动程序拷贝到片内RAM,执行二次启动加载程序,再将FLASH中的程序完全拷贝到高速的片内RAM中,再跳转到程序入口_c_int00地址,完成启动过程。
由于密文程序文件需要解密为DSP可识别的明文二进制码,才能够正确运行,因此解密过程一般设计在二级BootLoader程序中,具体过程如图9所示:
1) DSP系统上电;
2) 系统启动,自动运行一级BootLoader;
3) 将二级BootLoader搬移到RAM中运行;
4) 在二级BootLoader中将Flash中的密文程序数据搬移到RAM中;
5) 使用解密密钥、系统参数、固定参数进行SM4密钥扩展,完成密钥初始化;
6) 根据SM4分组要求,对RAM中的密文数据进行分组;
7) 将分组后数据输入到SM4解密函数,对密文进行解密;
8) 对解密完成后的明文数据采用加密选用的摘要算法生成摘要;
9) 与加密时生成的摘要数据比较,进行完整型检测 [7]。摘要一致则证明完整型验证通过,跳转到_c_int00中执行;否则证明程序被篡改或者解密错误,将直接退出。
5. 总结
本文在分析研究DSP程序文件的结构和SM4密码算法的基础上,提出了一种基于SM4密码算法的DSP程序文件加密保护方法。该方法利用国密SM4对称加密算法,以软件的方式实现了DSP程序文件的加密保护,能够在不改变DSP硬件系统架构的情况下对程序文件进行加密处理和完整性验证,增加了非法反编译破解和篡改的难度,降低了系统的硬件成本,保障了DSP关键程序文件的安全性,具有广阔的应用前景。