阐述了3种给单片机加密的方法,给出了完整的加密操作与判别流程。这3种加密方式不占用单片机芯片的硬件资源,代码短,加大了控制程序的**难度,有效地提高了MCU片内控制程序代码的安全性。
大家都知道,单片机应用系统由硬件电路与控制程序两部分组成,尽管硬件电路部分同样凝聚了设计者的心血,也体现了设计者创造性劳动成果,但却无密可守,惟一有保密可能的就是控制程序部分。如何完善控制程序的加密功能,防止他人**、盗取、复制单片机应用系统中的控制程序代码成了单片机应用系统开发人员和生产厂家保护自己知识产权不被侵犯的关键措施之一。
我们在分析传统单片机控制程序软件加密技术和硬件加密技术的基础上,探索如何充分利用单片机芯片新增的硬件功能,提出了基于单片机芯片身份识别码(即芯片惟一 ID号)、片内RC振荡器频率离散性、上电标志等多种单片机控制程序的加密策略。
一、新型MCU芯片特征与传统软件加密方式的局限性
1、新型MCIJ芯片特征
近年来,单片机技术有了长足的进步,实现了真正意义上的单片化,主要体现在:支持ISP、ICP、IAP编程方式的Flash ROM存储器已逐渐成为单片机芯片内部程序存储器的主流,对于MCS-51兼容芯片来说,也无须通过总线方式扩展外部程序存储器:内置了1一2个RC振荡器(作看门狗计数器时钟或系统主时钟)。为保护片内控制程序代码的安全,除了进一步强化加密锁定位功能外,部分厂家的MCU芯片,如STC的MCS-51兼容芯片、ST公司Cortex-M3内核的STM32系列芯片还增加了芯片身份识别码。
2、传统软件加密原理及其局限性
传统软件加密方式归纳起来主要有以下几种;
(1)指令伪装法
指令伪装法叫的策略是在不影响控制程序运行条件下,改变汇编语言源程序中个别指令的形态来增大反汇编代码阅读的难度,归纳起来主要有以下几种方式:
a、对采用CISC指令系统的MCU芯片,用DB伪指令在两模块间插入多字节指令(双字节或3字节)的操作码,使反汇编后插入的操作码字节与下一模块第一条指令机器码组合形成新的指令(甚至会继续拆分源程序中第二条指令),使反汇编后看不到真实的汇编指令。
b、将长跳转指令中的目标地址压入堆栈,然后用RET指令代替无条件长跳转指令LJMP。
c、将长跳转指令中的目标地址送DPTR,然后用散转指令JMP @A+DPTR代替无条件长跳转指令LJMP。
不过,以上指令伪装方式最多只能增加反汇编程序的阅读难度,对**后直接复制的盗取方式没有任何防范作用,严格地说指令伪装法并不属于软件加密范畴。
(2)破坏单片机芯片特定硬件资源加密法
破坏单片机芯片特定硬件资源加密法洲归纳起来主要有以下几种:
a、故意烧坏数据总线。对于MCS-51兼容芯片,程序代码总是从数据总线(PO口)读出,因此人为地将12V高压引到PO口某一I/O引脚,使其下拉N沟MOS管击穿——对地短路。
这一方法对防止片内代码被非法读出是有效的,但其局限性也非常明显:一方面无法通过总线方式扩展并行I/O口(破坏了芯片内部数据总线接口电路);另一方面,不能再通过并行编程方式更新片内程序代码;三是占用了芯片I/O引脚资源。
b、破坏芯片的加密锁定位。由于Flasb ROM擦写次数仅为10K左右,因此在运行中通过IAP编程方式对芯片加密位进行多次擦写,使Flash ROM不能再擦除。这种方式的潜在危险是万一加密位擦除失效后不能再写入,则片内代码就很容易被读出;再就是该方法也不能阻止探针攻击法。此外,软件设计者也不能更新片内程序代码。
c、破坏MCS.51的EA引脚。对于MCS-51兼容芯片来说,当EA引脚为低电平时,将从外部ROM执行程序。于是有设计者试flj破坏E引脚,使MCS-51芯片复位后总是从片内执行程序,但这一方法并不能阻止通过擦除芯片加密琐定位方式读取片内代码。
(3)总线加密法
早期MCS-51芯片内部程序存储器容量小,甚至没有内部ROM,一般均需要通过总线方式扩展外部程序存储器,于是出现了所谓的总线加密法。
总线加密法主要有地址总线乱序法、数据总线乱序法,或在MCU芯片地址总线与存储器地址总线间增加可编程芯片(如GAL、FPGA等)俐,使MCU芯片地址与存储器地址之间形成新的映射关系。这些加密方式对采用外设程序存储器的早期的MCS-51应用系统来说也许有一定的作用,但目前几乎所有的单片机应用系统都不再采用外部程序存储器。
经过长期实践,针对目前主流单片机芯片硬件特征,本文提出了基于芯片身份识别码、片内RC振荡器频率离散性、上电标志等3种实用的单片机控制程序加密方式。
|