本发明是一种利用逻辑电路对单片微型计算机程序进行动态加密的方法,主要用于单片微机产品的软件加密。 在单片微机产品内,软件通常固化在ROM(或EPROM)中,因而很容易被读出,致使其关键的软件技术得不到保护。这一问题的存在,严重伤害了生产者的商业利益,也引起了人们的极大关注。
为解决这一问题,人们陆续提出了许多方法。例如,1981年,美国公布了一项名为《一种控制可编程计算机使用的方法和装置》的专利技术(专利号:US 4246638),它的基本原理是将指令所在单元地址的高字节(8位)和低字节(8位)异或后,再与该指令(8位)异或,这个数用做一个存放加密表的加密ROM的某个输入地址,而这个地址指定的单元内,存放着一个密码,它做为加密后的指令。这个密码指令被存入原来未加密指令代码的单元内。解密时,依次将密码所在单元地址的字节(8位)和低字节(8位)异或,再与该单元中存放的密码指令异或,这个数用做一个存放解密表的解密ROM的某个输入地址。与加密过程相对应,在这个单元内,存放着解密后的原码指令代码,以供CPU运行使用。该专利要求CPU除提供读/写信号之外,还要提供一个同步信号,以便使它能够正确运行。该方案能较好的加密,但电路结构过于复杂,在一些以单片机为核心的小型化智能产品内,几乎无法使用。此外,该专利的硬件结构中无任何防复制技术,若用同样的硬件,并复制其加密、解密ROM,该产品的用户程序即可被直接复制使用,这是它的一大弱点。
1984年,德国公布了另一项名为《防止一个程序非法执行的保护装置》的专利技术(专利号:EP 155399A2),实质上,它是将一个可编程解码器由生产商直接做在单片微机内部,来逐条解密ROM中的密码。这样,虽然可对ROM直接复制,但因无法对单片机内地解码器解密,故阻止了对该产品仿制的事件发生。这是一种比较简单实用的方法,但因必须采用特殊的单片机,故给生产带来很大不便。此外,因为它仅使用了一种简单的编码方法,利用计算机对它的密码进行破译也不是很难。
针对上述问题,本专利提出一种新的加密方法,以便能广泛地应用到单片微机产品之中,来阻止对这些产品的非法仿制。
这一发明的最大特点是引入了一种“动态加密”的概念,在此称之为“程序动态加密法”。
它是这样实现的:
在ROM与CPU之间插入几个程序译码器,并由密钥选择器来控制选择其中某个程序译码器工作。此密钥选择器由密钥译码器、触发器等构成。而由程序译码器译码后的原程序经过三态控制门接至CPU。
程序经分段加密后固化于ROM之中。CPU在工作时,启动密钥选择器动态地选用与每一段加密程序相对应的程序译码器工作。这样,就会在密钥选择器的控制下,使正在运行的那一段程序以原码方式提供给CPU,其它仍为密码。随着程序的运行,程序译码器将在密钥选择器的控制下不断动态地更换,以便保证原程序的正确运行。
若用单片微机开发系统由CPU端读出程序时,由于程序并不能正常工作,因而只能读出部分原程序,其它均为密码,从而达到了软件不被破译的目的。
程序译码器及密钥选择器等电路可与其它用户电路一齐固化在GAL或PAL)之中。在GAL或PAL的规模较大时,破译是相当困难的。
本发明的关键技术在于几个程序译码器的切换,它取决于密钥选择器的工作状态。而这些状态的选择,则是利用存放于加密地址中的密钥来实现的。因为所有密码、密钥、密址及加密切换点都可由使用者随意规定,因而具有很强的加密功能和使用灵活性。
图1是本发明的一个具体技术实例。
图中(1)是EPROM;(2)、(3)是密钥译码器;(4)是两个D触发器及时钟,复位电路;(2)、(3)、(4)构成了密钥选择器。(5)、(6)、(7)是(可编程)程序译码器;(8)是三态控制门;(9)是低位地址(A0~A7)锁存器;(10)是MCS-51系列单片微机。其中(2)~(8)可固化于一片GAL之中。
(1)的CE及OE端直接接地,O0~O7构成的数据总线送至(2)、(3)、(5)、(6)、(7)的输入端。
(2)和(3)的输出分别接至(4)的两个D型触发器的“D”端,而D型触发器的输出端Q1和Q2则用来控制选择(5)、(6)、(7)这三个程序译码器,在Q2Q1=00时,(5)被选中;Q2Q1=01时,(6)被选中;Q2Q1=10时,(7)被选中。由于(2)和(3)最多只能被选中一个,所以Q2Q1=11的状态并不存在,因而也不可能有两套程序译码器同时工作。(5)、(6)、(7)的输出接至(8)的输入端,而(8)的输出接至(10)的PO口(PO口是MCS-51的数据总线口)。
(8)的三态控制端由(10)的PSEN控制信号来选通,在PSEN有效时,(8)的输出信号送至(10)的PO口。
RESET信号与(10)的高位地址线P2.7及 PSEN信号构成了(4)中两个D触发器的CP脉冲,用来控制密钥选择器的工作状态和开机复位。
(9)是一个8位锁存器,在ALE的控制下,将地址总线的低八位(A0~A7)由PO口分离出来送至(1)的A0~A7端。
其中(2)~(8)固化于一片GAL之中。
此实例可直接用于ROM不大于32KB的场合,若ROM大于32KB时,则应增加额外的地址译码器来取代(10)的P2.7线。
它的工作过程简述如下:
上电复位后RESET信号将(2),(3)的输出打入(4)中的两个D发器中,由于(2)、(3)的密钥指令不对,故Q2Q1=00,CPU选用第一套程序译码器(5)工作。程序在运行的过程中,一旦出现正确的密钥指令,(4)中的触发器便可以进入相应的状态(01或10),选用第二套程序译码器(6)或第三套程序译码器(7)工作。随着密钥的不断更换,(4)中的两个D触+发器动态的工作在00,01,10这三个状态之中,使得(5),(6),(7)三组译码器不断更换,进而完成了程序所需的动态译码。若开启的密钥或密址不对,(4)中的触发器将返回到00状态。
(8)是一组三态控制门,在 PSEN的选通作用下,(8)将译码后的原程序送至(10)的PO口,保证了CPU的正常工作。显然,对CPU来讲,运行中的每一步程序都是原程序,而其它大部分则是密码。
在用单片微机开发系统由CPU端读出程序时,(4)中的两个D触发器不翻转,读出的大部分内容都将是加密信息。
本发明具有硬件简单,运行速度高、编码灵活,破译难度大等优点,特别适合用于高性能的单片微机产品之中。