对扩展程序存储器的加密保护可通过对其数据和地址线的异或/取反扰乱来实现,其目的都是不能直接获取程序存储器内部保存的数据。由于X=XK
K,X=X,因此在系统工作时由硬件实现代码和密钥的异或/取反操作可得到正确的程序(文献[2]中用二级异或提高加密强度的观点不正确,因为Y=X
K1
K2=X
K),其原理如图4所示。通常单片机加密的方式是密钥固定不变,或CPU读取程序代码的同时,从另一片EPROM读取密码,使每一代码对应一密钥。这两种方式的解密只需用简单的组合逻辑电路,对前一种方式,用逻辑分析法很容易求解逻辑关系而解密,后一种方法进行逻辑分析的工作量虽然大大提高,但密钥本身容易被直接获取。因此我们用m序列产生器动态产生密钥,将解密的组合逻辑电路与时序逻辑相结合,而较复杂时序逻辑的分析是很困难的。
对8031、MC6085兼容系列的单片机系统,编程使开始的一段初始化程序顺序执行,系统复位时自动对移位寄存器设初值,复位后程序存储器的读信号同时作为移位时钟,使每条指令的密钥不断变化;在第一次执行循环、跳转指令前,程序发控制字阻断移位时钟,使以后的程序密钥相同。在高速DSP系统中,一般上电后将低速EPROM中的程序加载到高速SRAM中运行,可使EPROM的读控制信号一直作为移位时钟,使密钥不断变化;如果用串行口方式加载,程序解密操作与数据通信中的数据解扰相同,数据输出时钟直接作为移位时钟。单片机/DSP作为微机系统的协处理器时,单片机/DSP的代码一般经总线装载,可将加密代码与移位寄存器输出的密钥异或解密,输出到单片机/DSP的程序RAM。
系统运行时,用于MCU/DSP程序保护的防跟踪计数器时钟一直有效,这样可以防止仿真器的跟踪。防跟踪计数器要用程序读或其相关信号清零,有的DSP从内部RAM运行程序时,程序读无相应输出信号,这时可用定时器中断或程序中及时插入的代码来清零。
上述介绍应用移位寄存器产生伪随机数据对程序进行加密的一些方法,曾在我们设计的系统中得到验证,整个电路的设计不复杂,占用PLD 器件的资源不多,完全可结合在系统的硬件逻辑设计中。使用8/16位的移位寄存器时,密钥量有限,制约了加密的复杂度,使用者应根据设计要求和自己的经验,引入各种非常规的操作方式,这样就可以用简单的硬件电路,很好地实现软件和系统的保护。