我们知道,研究一套可行实用的单片机系统肯定要花大量的人力和物力。为了使所研制的系统不被别人所剽窃,保护知识产权,通常在单片机系统设计时,都要进行加密设计。加密设计一般有硬件加密和软件加密。而硬件加密的方法很多,可以采用PAL、GAL等芯片将CPU与ROM之间的地址线或数据线按一定密钥规律进行交换,这样就把原程序页号打乱,起到加密作用。但这里想与读者共同探讨的是几种简单的硬件加密技术。
1. 硬件加密设计步骤
1.1 根据具体项目和任务,设计目标程序并在未加密情况下调试成功。
1.2 设计硬件加密电路.
1.3 对调试好的软件按硬件电路进行加密翻译,不同的硬件加密电路翻译出来的软件不同.
1.4 将加密翻译后的软件写进EPROM.
这样,剽窃者将得到的EPROM里的程序进行反汇编后,不在是原来的程序,甚至是逻辑关系混乱毫无价值的代码.从而保护了原设计者的利益.
2. 硬件加密电路的设计
为方便说明硬件加密原理和软件加密翻译方法,先列举一例题,以下论述均以该例子为研究对象.
例1 比较两个无符号数的大小,设两个无符号数事先分别存在RAM里的30H和31H单元,若(30H)里的数大,则累加器的A.0~A.3为高电平;若(31H)里的数大,则累加器的A.4~A.7为高电平;若两数相等,则累加器的A.2~A.5为高电平。试设计汇编程序实现。
该例题所设计的原程序、机器代码和存储单元如下:
程序存储单元地址 机器代码 汇编语言
0100H 75 30 80 QAB:MOV 30H,#80H
0103H 75 31 06 MOV 31H,#06H
0106H E5 30 MOV A,30H
0108H B5 31 03 CJNE A,31H,QDC
010BH 74 3C MOV A,#3CH
010DH 22 RET
010EH 40 03 QDC:JC SMALL
0110H 74 F0 MOV A,#0F0H
0112H 22 RET
0113H 74 0F SMALL:MOV A,#0FH
2.1 硬件加密方法一
将数据线中某几根线换位,如图1所示。将图中数据线D1、D2交叉,这样单片机系统执行的实际代码就与EPROM中存储的代码完全不同了。若将例1的程序存入EPROM ,那么存入的实际代码就要做相应的加密翻译,以使单片机从EPROM中所取的代码正确。加密翻译后在EPROM中实际存的代码和反汇编的结果如下:
P2.0~P2.4P0.3~P0.7P0.2P0.1P0.0ALEPSENCPU8031
|
A8~A12A3~A7A2A1A0 2764OE CED3~D7D2D1
|
图 1
程序存储单元 机器代码 反汇编结果
0100H 73 JMP @A+DPTR
0101H 30 80 73 JMB 30,73
0104H 31 06 ACALL 06H
0106H E5 30 MOV A,#30H
0108H B3 CPLC C
0109H 31 05 ACALL 05H
010BH 72 3C ORL C,3CH
010DH 24 40 ADD A,#40H
010FH 05 74 INC 74H
0111H F0 MOVX @DPTR,A
0112H 24 74 ADD A,#74H
0114H 0FH INC R7
0115H 24** **
从反汇编结果看,整个程序无法读懂,逻辑关系混乱.
2.2 硬件加密方法二:
将CPU和EPROM间的地址换位,如图2所示,将地址线A0、A1换位交叉,这样单片机系统程序存在EPROM中的代码不变,但存储顺序完全打乱。若将例1的程序存入EPROM时,为保证单片机的正常工作,要将存储代码的顺序按硬件电路要求做相应的改变,即进行加密翻译,加密翻译后EPROM中存储的实际代码和反汇编的结果如下:
程序存储单元 机器代码 反汇编结果
0100H 75 80 30 MOV 80H,#30H
0103H 75 31 E5 MOV 31H,#0E5H
0106H 06 INC @R0
0107H 30 35 B5 JNB B5,03H
010AH 31 74 ACALL 74H
010CH 3C ADDC A,R5
010DH 40 22 JC 22H
010FH 03 74 22 LJMP 74H,22H
0112H F0 MOVX @DPTR,A
0113H 74 0F MOV A,#0FH
0115H ** **
P2.0~P2.4P0.2~P0.7P0.1P0.0 ALEPSENCPU8031
|
A8~A12A2~A7A1A0 2764OE CE D2~D7D1D0
|
图 2
从反汇编的结果看,既是剽窃者取出EPROM里的程序代码,反汇编后也得不到原来的程序了,
2.3 硬件加密方法三
将CPU和EPROM间的数据线某些位经过三态反相器求反。如图3所示,将数据线D0、D1分别求反后送CPU,这样存在EPROM里的程序和原来的程序就不同了。若将例1的程序按硬件加密电路进行软件加密翻译后,存在EPROM里的实际代码和反汇编后结果如下:
P2.0~P2.4P0.2~P0.7P0.1P0.0 ALEPSENCPU8031
|
A8~A12A2~A7A1A0 2764OE CE D2~D7D1D0
|
图 3
程序存储单元 机器代码 反汇编结果
0100H 76 33 MOV @R0,#33H
0102H 83 MOVC A,@A+PC
0103H 76 32 MOV @R0,#32H
0105H 05 E6 INC 0E6H
0107H 33 RLC A
0108H B6 32 00 CJNE @R0,32H,00H
010BH 77,3F MOV @R0,3FH
010DH 21 43 AJMP 43H
010FH 00 NOP
0110H 77 F3 MOV @R0 ,F3H
0112H 21 77 AJMP 77H
0114H 0C INC R4
0115H 21** **
可见经硬件加密后,存在EPROM里的代码与原来代码完全不同.
2.4 硬件加密方法四
将CPU和EPROM间的地址线的某些位求反。如图4所示,将地址线A0、A1求反,这样存在EPROM里的代码内容不变,但代码的存储顺序要按硬件电路相应改变。若仍以例1为例,将该程序代码加密后,存在EPROM里的代码和反汇编后的结果如下:
A8~A12A2~A7A1A0OE CE2764D2~D7D1D0
|
P2.0~P2.4P0.2~P0.7P0.1P0.0 ALEPSENCPU8031
|
图 4
程序存储单元 机器代码 反汇编结果
0100H 75 80 30 MOV 80H,30H
0103H 75 35 E5 MOV 30H,E5H
0106H 06 INC @R0
0107H 31 74 ACALL 74H
0109H 03 RR A
010AH 31 B5 ACALL B5H
010CH 03 RR A
010DH 40 22 JC 22H
010FH 3C ADDC A,R4
0110H 74 22 MOV A,22H
0112H F0 MOVX @DPTR,A
0113H 74 ** ****
0115H ** **
可见将EPROM里的代码反汇编后,仍得不到原程序。
2.5 硬件加密方法五
将EPROM输出的某些数据线经过三态异或门后送入CPU。如图5所示,将D1、D0通过三态异或门后再送入CPU的P0.1,而D0直接送入P0.0,根据逻辑关系有
P0.1=D0(+)D1
于是实际存入EPROM的代码也要作相应变化,限于篇幅请读者自行加密翻译。
2.6 硬件加密方法六
将CPU和EPROM间的地址线通过与门后送入单片机。如图6所示,将CPU的P2.0和P2.1通过与门后送入EPROM的A9,而P2.0直接送入A8,根据逻辑关系有
A9=P2.0* P2.1
P2.0~P2.4P0.2~P0.7P0.1P0.0 ALEPSENCPU8031
|
A8~A12A2~A7A1A0 2764OE CED2~D7D1D0
|
这样,实际送入EPROM的代码内容不变,但代码存储顺序要变,这也留作读者自行翻译.
图5
P2.2~P2.4P2.1P2,0 P0.0~p0.7ALEPSENCPU8031
|
A10~A12A9A8 2764 A0~A7OE CE D0~D7
|
图6
3 总结:从上述硬件加密技术方法来看,读者还可采用多种逻辑电路,或者选择其他的数据线和地址线进行硬件加密设计,甚至也可将上述加密电路加以复合,形成较复杂的硬件加密电路,这就使解密更加困难.