随着单片机技术的发展和广泛应用,单片机产品的加密已成为知识产权保护的重要手段,其加密手段无外乎只有两种,软件加密和硬件加密。

一、软件加密技术

软件加密是硬件加密的补充和延伸,只要能使程序代码难以分析和跟踪,并且使反汇编后的程序变得混乱难懂,便是有效的软件加密技术。软件加密简单易行,不需额外增加系统的硬件开销。但采用软件加密技术时,充分考虑系统的实时性要求是采用软件加密护卡应遵循的基本原则。

1、代码置乱加密技术

代码置乱加密是在程序代码中加上一些冗余字节置使整个程序反汇编后变得杂乱无章。以下是代码置乱加密的一些基本方法:

(1)在程序模块之间插入1-2个加密字节,这些加密字节一般应为多字节指令的操作码。采用这种方法后,用一般的反汇编程序将无法得到系统实际运行的程序。例如,在下面的两个子程序模块之间插入一个加密字节02H(02H为3字节指令LJMP的操作码):

SUB1:

2100H 22 RET

210IH 02 DB 02H

2102H 909650

UB2: MOV DPTR,#9695H

2105H 7405 MOV A,#05H

2107H FO M O V X @DPTR,A

2108H 22 RET

用反汇编程序对上述程序进行反汇编后,将得到以下程序:

SUBI:;

i.-i.Vt

2100H 22 RET

210IH 029096 UMP 9096H

2104H 5074 JNC 217AH

2106H 05FO INC B

2108H 22 RET

(2)使程序中的某些字节为两个程序模块共同使用。例如,20FIH单元中的52H为两个程序模块SUB3和SUB4共同使用。

SUB3:

20FOH 0152 AJMP 2052H

20FIH 522F

SUB4:

ANL 2FH,A

以上两条指令经反汇编后,将变成下列指令:

......

AJMP 2052H

ADD A,R7

.....

(3)在未使用的程序存储器区域中全部都加上无用的程序代码,这些程序代码要加得巧妙一些,以进一步增加破译程序的难度。

2、动态反跟踪加密技术

代码置乱加密属于静态加密技术,静态加密的程序代码最终还要以明文的方式在单片机中运行解密者可通过调试跟踪和监视程序的执行过程及运行状态来分析和破解程序。因此,对单单片机应用程序的加密还应考虑动态反跟踪的问题,即程序的动态加密处理。

(1)多循环、多分支

在不破坏系统实时性的前提下,可在程序中设置多重循环、多分支、多次调用子程序,把防跟踪能力隐含在程序的复杂性中。这些程序有些是虚设的,目的是混淆解密者的视线,消耗解密者的精力有些是必须完成的,或为后面的程序提供信息,真假混杂,使解密者眼花缭乱,不易跟踪。

(2)程序动态解码

动态解码是指程序运行时,由一段程序专门对某一区域的加密指令或数据代码进行解密,当解密后的代码使用完毕,再将其重新加密,使存储器中不存在完整的程序代码。程序动态解码不仅对防程序的静态分析很有效,因为从加密程序的清单上很难看出程序的真实目的;而且在程序的反跟踪方面又有独到之处,在阻止带断点调试跟踪时,由于程序在执行之前是以密文形式出现的,解密者很难确定断点设置的位置,稍有不慎就会导致解密失败。

(3)程序段防修改

为了防止程序被修改,可在程序的关键处取指令或数据代码参与某种运算,其结果作为判断程序是否被修改的依据。如果程序未被修改,则使程序正常执行。否则,程序将执行误操作、停机,甚至改变或删除关键代码,使解密者无法重新分析程序。

二、硬件加密技术

单片机系统的硬件加密技术有很多种,尽量不增加或者少增加芯片、连线及过线孔是采用硬件加密技术应遵循的重要原则。

1、总线变换加密技术

总线变换是指对单片机的地址总线或数据总线中的某些线进行交叉换位,或通过逻辑电路改变某些线原有的逻辑关系,使得仿真时从程序存储器中读出的数据变成一个随机数,从而失去反汇编的意义。

总线变换的方法很多,图1是把数据总线Do和D7交换的简单加密电路。

在未加密的单片机系统中,数据总线P0.7~PO.O与外部程序存储器2764的数据总线D7~Do是按顺序一一对应相连的。而在图l中把Do和D1两位交换后,单片机所执行的实际程序代码与外部程序存储器中所存放的程序代码便完全不同了。例如,单片机实际执行的二进制定点数求补子程序为:

lOOOH EA BINCPLA:MOV A,R2

IOOIH F4 CPL A

1002H 04 INC A

1003H FA MOV R2,A

1004H 22 RET

若从外部程序存储器2764中读出该子程序,经反汇编后的程序为BINCPLB:

1000H 6B BINCPLB:XRL A.R3

100IH 7904 MOVRI.#04H

1003H 7822 MOVR3,#22H

由此可见,BINCPLB已面目全非,不再是二进制定点数求补子程序,并且该子程序的最后也不是返回指令,因此,整个程序无法执行。实际应用时,外部程序存储器2764中应存放BINCPLB程序代码,只有采用图1所示的电路才会读出形成BINCPLA二进制定点数求补子程序。若把该外部程序存储器中的程序代码放在常规的单片机上进行反汇编,就会出现BINCPLB的程序代码,从而达到加密的目的。

由于单片机实际执行的是BINCPLA程序代码,而外部程序存储器中应存放的是BINCPLB程序代码。因此存在一个代码转换过程,即将单片机实际执行的程序代码(明文)转换成外部程序存储器中应存放的程序代码(密文)。这个转换过程可以手工完成,也可以编程由机器自动完成。

除了上述交换Do和D7进行加密外,还可对总线的某些位进行逻辑运算,如:求反、与、或、异或等,其加密的原理是类似的。

1、总线烧毁加密技术

单片机片内程序存储器中所存放的程序代码必须通过数据总线才能读出。如果把单片机数据总线的其中一位永久地破坏了,解密者即使擦除了加密位,也无法读出片内程序存储器中所存放的正确程序代码。开发设计人员在设计单片机系统的硬件电路时,只要预留出一条数据总线不用,当将应用程序写入单片机片内程序存储器后,再用高压或激光将预留的数据总线烧毁,即可实现对单片机的加密。

2、总线密钥加密技术

改变单片机地址总线与外部程序存储器地址的对应关系,使它们按密钥进行交换,密钥存放在只读存储器ROM或EPROM中。图2所示为采用密钥阵列的加密电路原理图,用一片2716芯片存放密钥,将外部程序存储器2764的高5位地址A12~A8,重新按密钥进行编码,即可把外部程序存储器2764原来的页号顺序打乱,从而达到加密的目的。

3、重要数据保护加密技术

随机存储器RAM的一个显著特点是存储信息的易失性,即当外部供电电源消失时,所存信息将在几个毫秒之后消失,即使重新供电,原存信息也无法恢复。此外,静态RAM大都为CMOS工艺,CMOS具有超低功耗和强抗干扰的特点,用一个小锂电池供电,可以保存数据10年以上。

利用静态RAM的以上特点,将一些重要数据存放在静态RAM中,用电池供电。如果解密者在没有剖析清楚硬件电路的情况下,拔出RAM芯片或取出电池,RAM中存储的这些重要数据就会消失。以后即使插入该RAM芯片或接入电池,系统也无法正常工作。

4、采用PLD器件加密技术

PLD包括PAL、GAL、CPLD和FPGA等,它具有设计灵活、调试方便、可靠性高等众多优点,并且具有加密保护单元,以防止抄袭电路设计和非法复制。

将PLD器件用于单片机系统的UO地址译码逻辑、总线变换加密等硬件电路的设计,可以有效地保护硬件电路和软件程序,使单片机系统软、硬件的破译和仿制更加困难。

小知识之单片机

单片机(Single chip microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。