单片机原理的加密方法
科研成果保护是每一个科研人员最关心的事情,加密方法有软件加密,硬件加密,软硬件综合加密,时间加密,错误引导加密,专利保护等措施有矛就有盾,有盾就有矛,有矛有盾,才促进矛盾质量水平的提高加密只讲盾,也希望网友提供更新的加密思路,现先讲一个软件加密:利用MCS-51 中A5 指令加密,其实世界上所有资料,包括英文资料都没有讲这条指令,其实这是很好的加密指令A5 功能是二字节空操作指令加密方法在A5 后加一个二字节或三字节操作码,因为所有反汇编软件都不会反汇编A5 指令,造成正常程序反汇编乱套,执行程序无问题仿制者就不能改变你的源程序。
硬件加密:8031/8052单片机就是8031/8052掩模产品中的不合格产品,内部有ROM,可以把8031/8052 当8751/8752 来用,再扩展外部程序器,然后调用8031 内部子程序当然你所选的同批8031芯片的首地址及所需用的中断入口均应转到外部程序区。
硬件加密
用高电压或激光烧断某条引脚,使其读不到内部程序,用高电压会造成一些器件损坏重要RAM 数据采用电池(大电容,街机采用的办法)保护,拔出芯片数据失去机器不能起动,或能初始化,但不能运行。
用真假方法加密
擦除芯片标识
把8X52单片机,标成8X51 单片机,并用到后128B的RAM 等方法,把AT90S8252 当AT89C52,初始化后程序段中并用到EEPROM 内容,你再去联想吧!
用激光(或丝印)打上其它标识如有的单片机引脚兼容,有的又不是同一种单片机,可张冠李戴,只能意会了,这要求你知识面广一点 。
用最新出厂编号的单片机,如2000 年后的AT89C 就难解密,或新的单片机品种,如AVR 单片机。
DIP 封装改成PLCC,TQFP,SOIC,BGA等封装,如果量大可以做定制ASIC,或软封装,用不需外晶振的单片机工作(如AVR 单片机中的AT90S1200),使用更复杂的单片机,FPGA+AVR+SRAM=AT40K系列。
硬件加密与软件加密只是为叙说方便而分开来讲,其实它们是分不开的,互相支撑,互相依存的软件加密:其目的是不让人读懂你的程序,不能修改程序,你可以………….....
利用单片机未公开,未被利用的标志位或单元,作为软件标志位,如8031/8051有一个用户标志位,PSW.1 位,是可以利用的程序入口地址不要用整地址,如:XX00H,XXX0H,可用整地址-1,或-2,而在整地址处加二字节或三字节操作码,在无程序的空单元也加上程序机器码,最好要加巧妙一点用大容量芯片,用市场上仿真器不能仿真的芯片,如内部程序为64KB 或大于64KB 的器件,如:AVR 单片机中ATmega103 的Flash 程序存储器为128KBAT89S8252/AT89S53中有EEPROM,关键数据存放在EEPROM 中,或程序初始化时把密码写到EEPROM 中,程序执行时再查密码正确与否,尽量不让人家读懂程序。关于单片机加密,讲到这里,就算抛砖引玉。
2022-04-12 广告
1、烧断数据总线。这个方法我想应不错,但应有损坏的风险,听说也能**。
2、芯片打磨改型,这个方法有一定作用,改了型号能误导,但同时也增加成本,解密者一般也 能分析出来。
3、用不合格的单片机的的存储器:这个方法听起来不错,值得一试。很多单片机有这种情况,有
的是小容量改为大容量来用,**者应很难发现。例:8031/8052 单片机就是8731/8752掩模
产品中的不合格产品,内部可能有ROM。可把8031/8052 当8751/8752 来用.但使用时要测试 可靠。
4、其他还有添加外部硬件电路的加密方法。但那样增加成本,效果不一定好。
5、软件加密,是一些防止别人读懂程序的方法,单一的这种方法不能防止别人全盘复制。须配合 其他的加密方法。
6、通过序列号加密, 这个方法当你的产品是连接PC时或网络,我想是一个比较理想的方法。原理跟电话产品防伪
标志相近。就是在你的单片机中生成一个唯一的随机长序列号,并加入复杂的特种算法,或加
入你们重新编码的企业信息在里面,每个芯片内不同,复制者只能复制到一个序列号。这个方
法不能防止复制,但能发现复制品,并可在升级或在网络状态控制它或让他自毁。如果产品不
联机或不可升级,则这个方法完全无效,只能是在上法院时可当作证据,因为内含特种算法破 解者是无法知道的。
7、通过单片机唯一的特性标识(不可修改)进行加密
这个方法最好,能很好的防止复制。但大多单片机没有唯一标识。STC单片机里面含唯一标识,
但本人没用过,下次一定要研究使用一下。理论上只要含唯一标识是单片机都可实现,ATMEL
AVR系列单片大部分型号有RC校正字节(几十个芯片才有一个相同,并且不可修改)能实现这
个理想功能,可做到即使芯片内程序被读出也无法直接在另一个同型号的单片机上正常运行。并
且如果用这个唯一标识来生成含有加密算法的序列号,结合第6种方法,哪应是最理想的加密方
法。以上方法应都是一种加密的思路,各种方法可接合着用,6、7两种方法是本人认为比较合适,实现起来比较容易的方法。后面将重点介绍两种加密方式的实现方法。
二、序列号加密实现方法 1、原理 就是在存储器某个区块放入一个唯一的序列号(长一点,无规律),每个芯片不同。原理跟电话
产品防伪标志相近 --------------
---------------------------------------------------------
| PC机 | <------------>|
带自定义算法序列号单片机系统 | --------------
---------------------------------------------------------控制方法:
1、PC根据传回来的序列号根据算法判断是否合法,合法就运行,不合法处理它。当然,如果是 **的序列号,可自毁。
2、单片机内部的序列号经加密算法处理,单片机系统同样要防止软件被更改,可在单片机内部加
入CRC等数据校验。一般情况下,序列号如果不合算法,单片机系统应让程序运行出错,这样
**者一般不会去修改序列号,如果修改了也没关系,因为PC还能判断是否合法。
3、序列号传送时可采用双向加密算法认证,相当于银卡的数据交换方式。传送过程:
PC发送随机SEED数据---->单片机系统跟据随机SEED算出加密的序列号----->PC根据算法判断序
列号是否合法这样在序列号的传送过程中,数据每次不同,解密者无法看到序列号的明码。这样 PC软件他同样不容易更改。
注意:加密算法可以很简单理解一个为异或,当然算法由你自已随意定,反正目的不能上别人一看
软件就懂。**者只是**一个产品只能得到一个序列号,即使序列号是明码,他也只能知
道是一个。如他随便修改一个序列号一般情况就不符合算法,除非他看懂你的软件算法,我
想这是一般解密者最不愿意做的事情。单片机系统的量产:
产生这样的序列号,单片机系统如何生成?如果用手工一个个去计算调入,得重新编译是不
可能的事情。如果编写一个软件生成数据放入到HEX文件中,那样不说工作量好大,编程时
还必须一次次装入HEX文件,量产同样无法完成。这个可于MiniPro TL866 编程器完成。
编程器的介绍可查看:http://www.autoelectric.cn/minipro
TL866编程器有个自动编号功能,可利用DLL动态库调用实现任意的序列号.如何使用DLL设定序列号,可参考编程器安装包内的DLL实例,内有详细说明。后面讲的用单片机唯一的特性标识进行加密也用到DLL调用,基本大同小异。
经过这样的加密,达到一个目的,就是解密者必须修改你的软件后才能放心使用,但是每次升级同样会受你控制,好像微软随时可以黑你屏一样的道理,否则可能随时会被你宰了!!但这种方法只适合连接PC或网络的系统。
三、用单片机唯一的特征标识进行加密加密原理:
单片机必须有唯一标志,单片机程序内只要判断是否是这个标志,就可防止程序直接复制使
用。理论上可以做到很难**,本人认为是最有效又实用的方法。达到目的: 解密者最不愿意做的事让他必须做。
一般大部分搞单片机解密的都是暴力**,因为这个最容易,只要牚握技巧,有设备,工艺熟练就可了,不用太强的专业知识。如果复制后,程序无法运行,那就蒙了,因为这个时候就要去看汇编语言了,我想信有很多汇编高手,能很容易**。但我也同时认为,怎么多型号的单片机,汇编指令差别好大,每一种单片机的汇编都很熟的人应不多了。所以这会大大增加**难度。如果一个加密设计好的软件,跟据单片机的唯一特征字来加密,有时他可能不得不看懂里面的加密算法。这样加密目的就达到了。开发人员需要做的事:
有了唯一特征字,并不是加密万无一失了。如果你只是在程序中只用一条语句判断,是不是这个芯片的特征字,则程序被读出后,解密者只要简单的修改程序,直接跳过判断语句。可能只要几分钟就解决了。所以在程序要加入加密算法,尽量不用IF判断语句。可用子程序调用地址来参与特征字的加密运算等等方法,如何防反汇编及修改软件等不在这里讨论,网上可以找到有关这方面的很多资料。
下面讨论如何用TL866编程器实现,单片机用特征字进行加密的量产操作:
芯片进行加密量产操作同样碰到到一个问题,如果加密算法比较复杂,每个芯片在代码中需要更改的数据较多,用手工的方法是无法实现量产操作编程的,TL866编程器很好的解决了这个问题,下面用ATMEGA8为例,说明TL866编程器如果进行加密量产编程操作。TL866编程器程序安装包(V3.01以上)中有该实例的全部动态库函数及单片机C源代码,稍作修改就可用到你的产品中。下载地址:http://www.autoelectric.cn/minipro
(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种实用的单片机控制程序加密方式。
二、基于芯片身份识别码的加密方法
为提高片内程序代码的安全性,最近上市的某些MCU芯片,如STC公司2009年后推出MCS-51兼容芯片、ST公司的STM32系列芯片等每一芯片内部均具有惟一的芯片ID号。因此,在控制程序中可充分利用这一功能完善控制程序代码的保护,该加密方式的加密步骤可按图1所示进行。
设置首次上电标志的目的是为了便于判别编程后是否开机过,第一次上电时读出并保存芯片的ID号。为防止攻击者通过仿真方式找到芯片ID号信息,一般不宜直接存放ID号的原码,而是经过相应的加密处理后再分散存放到不同的Flash ROM存储单元中;校验方式也不宜采用常见、简单的校验规则,如和校验等,应尽可能采用某些特殊的检验方式,使攻击者不能迅速确定校验算法。
为防止攻击者获取控制程序片段中有用代码,一旦发现ID号不符,最简单办法就是借助IAP编程方式删除控制程序代码,当然也可以随机改写控制程序代码中的1~2K字节,
三、基于片内RC振荡器频率离散性的加密方法
具有惟一ID号的MCU芯片加密容易,破解成功率很低。但由于生产成本、专利限制等原因,许多中低档MCU芯片,如大部分厂家的MCS-51兼容芯片、PIC系列芯片,甚至最近上市的STM8S系列芯片都没有惟一芯片ID号功能。对于这类芯片,如果内部含有作为看门狗计数器时钟或唤醒时钟的RC振荡器,如Philips公司的P89LPC900系列MCS-51兼容芯片、STM8S系列芯片、PIC16/18系列芯片等均内置了一定数量的RC振荡器。设计者可充分利用RC振荡器频率离散性生成芯片ID号,提高片内控制程序代码的安全性。
1、用RC振荡器频率作为芯片ID号
这一加密方式的加密原理大致如下:
(1)复位后启动MCU芯片的某一定时器测量RC振荡器的频率。只要定时器计数脉冲来自精度与稳定性都很高的外部石英晶体振荡器,则频率测量误差是可控的,也不会很大。
(2)考虑到RC振荡器输出信号频率受环境温度影响较大,应考虑温度变化、晶振频率误差等对测量结果的影响。例如STM8S系列MCU芯片内部低速RC振荡器标称频率为128KHz~12.5%,通过定时器TIM3测出某一特定芯片内部RC振荡器频率为OxID4ED(即120 045 Hz),则可将OxOID4ED作为该芯片的ID号。大量实验统计表明开机60秒后(上电延迟一定时间后测量的目的是为了等待MCU芯片内部温度稳定,即尽量减小环境温度对结果的影响)同一芯片频率测量误差在1%以内(不同芯片在不同环境下的频率误差可能略有不同,可通过多次实验确定。确定频率误差范围的原则是同一芯片保证每次上电复位后测到的数据均在误差允许范围内,因此允许误差不宜太小;另一方面,不同芯片频率相同的可能性又要尽可能小,因此频率误差允许范围也不能太大)。因此,只要上电后测到的RC振荡器频率与ID号相比,误差在1%以内即认为合法,反之视为非法。
该加密方式流程大致如图2所示。尽管不能排除两芯片频率接近的情形,但如果破解后的程序代码有50%或以上不能运行,那么盗版者就会烦恼万分,知难而退。
采用该加密方式对以STM8S207RB单片机芯片作控制核心的某型防盗报警器的实验统计结果如表l所示。可见只要频率误差取1—2%之间,代码复制后有50%以上的芯片不能正确运行。
(2)用RC振荡器频率校正值作为芯片ID号
部分厂家MCU芯片,如Microchip公司的PIC16/18系列、Philips公司的P89LPC900系列等内置的RC振荡器有频率校正值(保存在相应的寄存器或片内程序存储器特定单元中)。在实践中发现不同芯片的频率校正值有差异。对于具有这一功能的芯片,可将RC振荡器频率校正值作为芯片的ID号,完善控制程序代码的加密功能(操作流程与图1相似)。
尽管频率校正值一般在8位以内,但破解后的控制程序代码有50%以上不能运行就达到目的了。该加密方式实验统计结果如表2所示,可见频率校正值长度越大,代码复制的成功率就越低。
四、基于上电标志的加密方式
基于上电标志的加密方式可概括为“设置上电标志一检查芯片加密状态一检查上电标志一随机改写控制程序代码”,主要用于保护既没有芯片惟一 ID号,也没有片内RC振荡器的低档MCU芯片的控制程序代码不被复制。
1、加密过程
基于上电标志的加密过程如下。
(1)在上电复位后,开中断前,先读出Falsh ROM状态寄存器,确认芯片的加密状态。
(2)如果芯片加密状态正确,则检查首次上电标志(为防止误判,往往选择具有一定特征的字符串作为首次上电标志)是否存在:如果首次上电标志不存在,则判定为第一次上电,设置首次上电标志后进入正常的运行状态。
反之,如果芯片加密状态不正确,可根据首次上电标志是否存在进行相应处理:如果首次上电标志不存在,则表明芯片从未上电过,芯片未加密的原因可能是编程时漏选了加密锁定位,应进入IAP编程状态,对芯片进行加密操作。如果加密成功,设置了首次上电标志后,进入正常的运行状态;如果首次上电标志存在,说明芯片曾经上电运行过,加密位状态不正确,很可能是加密位被人为破坏,应立即启动某一定时器(目的是为了获得随机数),然后进入IAP编程状态,随机改写指定程序段内数十到数百字节(不必擦除改写字节所在扇区,将待改写字节内的“1”变为“0一即可)破坏应用程序代码的完整性,然后关闭中断进入死循环状态或复位退出。
该加密方法具体的加密流程如图3所示。
这种随机改写程序代码的加密方式具有很大的迷惑性;一方面,通过反汇编方式无法获得完整的源程序;另一方面,如果被随机改写的代码属于某一非主功能模块,则破解后的程序运行似乎正常,但它确实是一个不完整、运行后果难以预料的程序。
(2)代码检查与生成
为防止不法分子,通过反汇编、跟踪执行方式找到并删除随机改写程序段内的指令系列,可将改写程序代码段内的指令机器码读出,并以数表方式存放在主程序中。然后在主程序中的适当位置检查随机改写程序段代码的有效性,一旦发现代码无效,则进入IAP编程方式,重新生成改写程序段代码。
单片机应用程序加密与解密技术都在进步,可以说几乎没有哪一种加密技术绝对安全可靠。只能在实践中根据所选单片机芯片的硬件特征,有选择地交叉组合使用两种或两种以上的加密手段,以增大解密难度,并尽可能破坏解密版代码的完整性。但无论采用何种加密方式都应尽量避免增加系统的硬件成本、占用MCU芯片的硬件资源,此外也不能明显降低系统的运行效率。本文介绍的3种加密方式,尽管不能完全避免盗版者的攻击,但多年实践表明交叉组合使用这些加密手段确实能有效提高MCU芯片控制程序代码的安全性,控制程序代码被成功盗取的几率很小,且不占用任何硬件资源,也没有额外增加MCU应用系统的硬件成本。