厂商利用单片机进行产品开发时,都会关心其代码和数据的保密性。考虑到用户在编写和调试代码时所付出的时间和精力,代码的成本是不言而喻的。
早期的单片机,代码是交给芯片制造商制成掩膜ROM。有两种加密的机制,一是彻底破坏读取代码的功能,无论是开发者还是使用者都永远无法读取其中的内容。从安全上来说,这种方式很彻底,但是已经无法检查ROM中的代码了。另一种方法是不公开读取方法,厂商仍可以读取代码。这种方式留有检查代码的可能性,但是并不能算是一种真正的“加密”,被破解的可能性是存在的。
客观地讲,一方面希望加密很彻底,而另外一方面又希望留有检查代码的可能,这是相互矛盾的要求。


单片机简单加密(Flash型单片机的加密与解密)(1)


自Flash技术得到广泛应用以来,各类单片机制造商纷纷采用了多种不同的芯片加密方法,对比掩膜ROM芯片来说,Flash ROM在线可编程特性使得芯片的加密和解密方式变得更加灵活和可靠。在Flash型单片机中,芯片的加密和解密工作都是通过对Flash ROM的编程来完成的,由于用户程序可以在线地改写ROM的内容,可以编写一套加密和解密的小程序,随用户程序下载到芯片中,通过运行该程序,在线修改Flash ROM的内容,对芯片进行加密和解密,使整个的加解密过程更为简单灵活。
Freescale公司的HCS12单片机采用的加解密思路有一定的典型性,我们对此作了一些研究,现以MC9S12DP256单片机为例,介绍Flash型单片机的加密解密方法。

BDM程序调试接口
Freescale公司的很多单片机都借用一种被称为后台调试模式(Background Debug Mode,BDM)作为下载和调试程序的接口。
BDM是一种单线调试模式,芯片通过一个引脚与编程器进行通信。在HCS12系列单片机中,内部都置有标准的BDM调试模块。


单片机简单加密(Flash型单片机的加密与解密)(2)


该模块的有三种作用:
1) 对内部存储器的读写。将用户程序下载到目标芯片中或是将存储器中的数据读出。
2) 对单片机工作方式和资源进行配置。部分涉及到单片机工作方式和资源配置的寄存器只能在特殊模式下由编程器发送BDM命令来修改。
3) 程序调试。利用BDM模块可以读写内存和CPU内部寄存器,调试程序。
在HCS12单片机未加密的状态下,使用BDM硬件命令可以将Flash ROM中的程序读出或将新的程序写入。BDM命令可以由独立的硬件系统来送出,我们一般称此类系统为BDM编程器。
BDM编程器的时序协议是公开的,任何人都可以根据协议设计硬件、编写程序,实现BDM编程器的功能。使用BDM接口,编程器可以很容易的访问到目标系统的存储器,这给程序调试和烧写带来了很大的方便,然而,便利的对外接口也给盗用者留下了可乘之机。
在带有BDM模块的单片机中引入数据保密机制并非HCS12系列的首创,先前的HC12系列单片机的D家族中,就已经引入了屏蔽Lockout BDM读写的机制,可惜,该机制在单片机的扩展工作模式下存在着漏洞。相比之下,HCS12系列单片机中的保密机制更加完善,无论在BDM模式下或是扩展模式下,都可以屏蔽外部对Flash ROM的读写。

两种加密解密方法
在HCS12系列单片机中,加密可以分成两种方法:完全加密和使用密码的加密。这两种加密的方法根据用户的需求,使用的场合也有所不同。


单片机简单加密(Flash型单片机的加密与解密)(3)


·完全加密
所谓完全加密,就是将芯片彻底的保护起来,屏蔽对芯片的所有读操作。在MC9S12DP256单片机中,加密是通过对某一Flash单元($FF0F)编程来实现的。加密后的芯片,BDM编程器对Flash的读操作就被禁止了。
采用完全加密,读取ROM代码的可能性就不存在了,这是一种最为“安全”的加密方法。如果用户想修改ROM的内容,唯一的办法就是将Flash的内容全部擦除,这一操作可以通过BDM编程器来完成。
使用BDM编程器擦除Flash ROM和EEPROM的过程与在普通模式下对片内的Flash ROM擦除操作过程基本一样,区别是对寄存器或是存储单元的读写要改由BDM命令来实现。通过BDM编程器将一连串完整的擦除指令序列送给单片机,就可将Flash ROM和EEPROM的内容全部擦除了。
在全擦除操作完成后,BDM编程器将系统复位,系统会自动检查全擦除操作是否成功。如果成功,BDM状态寄存器的UNSEC位会自动置“1”,系统进入解密状态。
由于系统靠检查Flash ROM和EEPROM是否清空来决定系统是否保持加密状态,所以,如果用户程序偶然将Flash ROM和EEPROM的内容全部擦除,那么系统也将自动解密。

,