电工知识|51单片机程序进行软件加密和硬件解密的方法

   更新日期:2017-03-28     来源:建材之家    作者:水电之家    浏览:14    评论:0    
核心提示:由于固化在片外EPROM 里的单片机程序容易复制,所以,如不在技术上采取保护措施,则程序中所采用的处理方法易被他人分析仿制。对单片机程序进行加密是一种有效的保护措施,也是一项实用的技术。虽然本身带有EPROM 的单片机可做到程序保密,但由于价格和存储容量方面的原因,用户仍常常采用外接EPROM 的单片机来开发产品。本文以MCS - 51 单片机为例介绍一种对片外E2PROM 里的程序进行软件加密和

电气施工图纸会审工作要点

推荐简介:1、要审查设计图纸是否符合相关规范或有关技术质量标准,设计是否合理,考虑经济承受能力和投资取得的回报,设计和选用的产品应是开放型的,便于有条件时系统扩展、互联和信息共享。 2、要根据工程的特点和使用功能,明确业主对其项目的定位和需求。应提供意见和建议与业主,及早协调明确要设置哪些系统,以便所设系统与主体工程同步进行,避免主体完工后再上系统,难于施工,造成对建筑主体结构的破坏,加大返工......
水电之家讯:由于固化在片外EPROM里的单片机程序容易复制,所以,如不在技术上采取保护措施,则程序中所采用的处理方法易被他人分析仿制。对单片机程序进行加密是一种有效的保护措施,也是一项实用的技术。虽然本身带有EPROM的单片机可做到程序保密,但由于价格和存储容量方面的原因,用户仍常常采用外接EPROM的单片机来开发产品。

本文以MCS-51单片机为例介绍一种对片外E2PROM里的程序进行软件加密和硬件解密的方法。这种方法不增加用户应用程序开销。

1 基本原理

我们知道,异或运算有这样的特点:AÝBÝB=A,亦即当用变量B对变量A作偶数次异或运算后,其结果恢复为变量A。例如A=32H,B=5EH,则AÝB的结果为6CH,该结果再与变量B作异或运算,即6CHÝ5EH就得到变量A的值32H。因此,我们可以利用这一特点给单片机程序加密和解密。

51系列单片机在对外部程序存储器ROM和外部数据存储器RAM操作时采用两套不同的指令,在对RAM操作时用MOVX指令,并产生相应的读(RD)和写(WR)信号,而当对外部ROM进行读操作时不用RD信号,而是有一条专给外部ROM使用的“读”数控制信号(PSEN)线。亦即外部RAM和ROM的控制信号是严格分开的。这就为利用异或运算给外部ROM里的程序进行加密后固化、解密后执行提供了条件。

这种方法的思路是:首先对欲固化到外部ROM里的目的代码(原代码)进行第一次异或运算(加密),再把加密后的代码固化到ROM里,程序运行时由硬件对从ROM读出的加密代码进行第二次异或运算(解密)变为原代码后送到数据总线。这样,外部ROM

里固化的是加密代码,即便该代码被复制也反汇编不出原程序。另外该程序的执行还需相应的解密电路支持。

图1是可以在实际中应用的单片机解密电路。当CPU对片外EPROM(U04)进行“读”操作时,控制信号PSEN为低电平,这时U04送出八位加密代码(RD0~RD7)并和“密钥”经由U05、U06组成的异或运算电路作第二次异或运算(解密)得到原代码,该代码经三

态缓冲器(U07)由PSEN信号控制送入数据总线。由于电路中已将单片机的EA脚接地,故片外EPROM的最低地址为0。另外,与RD0~RD7一起参与异或运算的另一个数据(“密钥”)取自当前待解密代码在外部EPROM所在存储单元的低八位地址,并从高位到低位按A0A2A4A6A1A3A5A7的顺序组合成新的数据。例如,原地址分别为35H和36H,组合后的地址则分别为E2H和6AH。采用这样的方法确定“密钥”,一是可使一页中的代码中“密钥”不重复,二是由于同页中的代码字节的“密钥”都不同,故很难找到加密规律,可增加破译难度。

2 操作过程

现以SICE通用单片机仿真器为例说明制作加密程序并固化到片外EPROM里的操作过程。设程序一是一个待固化到片外EPROM里执行的用户应用程序。为简便起见,它对外部RAM的前256个单元赋于相应的低地址后转入死循环。因为仿真器的出借RAM为从8000H开始的24K空间,故应根据程序大小用伪指令把最低地址定位在8000H~DFFFH的24K空间里(如程序一中的ORG8000H),否则,无法直接对该程序的目的码进行第一次异或运算。

程序二是对程序一的目的代码(存放于仿真RAM的8000H~804AH中共4BH个字节)进行第一次异或加密运算的。要加密的总代码字节数由程序一经汇编后得知。该程序中“密钥”的计算应与硬件电路中送到解密电路的低八位地址线的连接关系相一致。

程序一:MAIN.ASM

ORG8000H

SJMPMAIN

ORG8003H

RETI

ORG800BH

RETI

ORG8013H

RETI

ORG801BH

RETI

ORG8023H

RETI

ORG8030H

MAIN:CLREA

CLRRS0

CLRRS1

MOVA,#0

MOVDPTR,#0

MOVB,#0

ACALLSUBR

LOOP:NOP

SJMPLOOP

SUBR:MOVX@DPTR,A

INCA

INCDPTR

DJNZB,SUBR

NOP

RET

END

程序二:XORM.ASM

XORM:MOVR0,#4BH;置欲加密代码字节数

MOVDPTR,#8000H;置程序一首地址

LOP1:MOVXA,@DPTR

PUSHACC

MOVA,DPL;取代码单元的低地址

MOVB,A

MOVC,B.0;组合新数据开始加密

MOVACC.7,C

MOVC,B.2

MOVACC.6,C

MOVC,B.4

MOVACC.5,C

MOVC,B.6

MOVACC.4,C

MOVC,B.1

MOVACC.3,C

MOVC,B.3

MOVACC.2,C

MOVC,B.5

MOVACC.1,C

MOVC,B.7

MOVACC.0,C

POPB

XRLA,B;“异或”产生加密代码

MOVX@DPTR,A;加密代码存入原单元

INCDPTR

DJNZR0,LOP1

NOP

STOP:NOP

首先把程序一调入仿真器汇编,目的是得到总的代码字节数。即键入如下内容(带下划线的为键入内容,否则为显示内容)。

>ASM51|

FDASM251V3.0

Copyright1989MicrocomputerLab.FudanUniversity

NoERROR

DisplayList?(Y/N)N|

Nextadr:804B;记下程序一的末地址为804BH,由此可知总代码字节数为4BH。再把程序二添加到程序一的末尾(RET指令后,END伪指令前),调入仿真器后再汇编。即:

>ASM51|

FDASM251V3.0

Copyright1989MicrocomputerLab.FudanUniversity

NoERROR

DisplayList?(Y/N)N|

Nextadr:8081

>EXIT|;退到监控状态

3MAP3|;仿真RAM出借(8000H~DFFFH)

3DX8000|;显示未加密代码(原代码)

8000:802E5B32CD900798A4C05C32C994039C

8010:80E47832EDB027B884E56F32E9B729B8

8020:40224F32724F188F52CF83C31292F483

8030:C2AFC2D3C2D4740090000075F0001143

8040:0080FDF004A3D5F0FA0022784B908000

8050:E0C0E0E582F5F0A2F092E7A2F292E6A2

8060:F492E5A2F692E4A2F192E3A2F392E2A2

8070:F592E1A2F792E0D0F065F0F0A3D8D100

8080:0000000000A041AC4450488D434A4E45

这里应该注意的是如果在程序一中使用了长转移(LJMP)或长调用(LCALL)指令,就应列表显示或打印汇编结果,查找这些指令涉及的标号地址的高八位,并把高八位地址减去80H,使其与外部EPROM的地址相符。

3GOXORM,STOP|;执行程序二,对程序一的目的码进行异或加密运算

3DX8000|;显示加密的代码,804BH以后的代码不变

8000:80AE53BA8D504F50A04450BE8D504F50

8010:A044509A8D504F50A041439E8D534554

8020:42A045B830D8534554498D4D5454BA4D

8030:E00DE879A0361EEAB6A62EDB96E67FAD

8040:1010E56854738D28EE943E784B908000

8050:0EC0E0E582F5F0A2F092E7A2F292E6A2

8060:F492E5A2F692E4A2F192E3A2F392E2A2

8070:F592E1A2F792E0D0F065F0F0A3D8D100

8080:0000000000A041AC4450488D434A4E45

3MECK0,3FFF| ;检查待固化ROM

 OK

3MEP8000,804B,0,5| ;将仿真RAM中8000H~804BH的加密代码

 OK固化到外部ROM的0地址开始的单元里

3MAP0| ;使用片外ROM,取消仿真RAM出借

3EX0|;执行片外ROM里的程序

3DX0|;显示外部RAM从0地址开始的单元内容可见程序执行无误(显示略)对于大的用户应用程序,其操作过程仍如上述,但需改变程序二的加密字节数,并注意不要把程序二的代码固化到EPROM里,否则,加密方法会暴露。

3 讨论

由于单片机程序是固化在EPROM里的,所以不能象个人计算机那样利用类似磁盘防复制等这一类的方法对单片机程序防复制(带保密位的单片机除外),而只能在程序本身和相应的硬件上做文章。

本文虽然以MCS-51单片机为例介绍了一种用异或运算对片外EPROM里的单片机程序进行软件加密和硬件解密的方法,但本方法也适用于其它外接E2PROM的单片机,此法一直应用在笔者于1993年研制成功并生产了20余套的一种分布式数控测井系统中。

使用上面介绍的方法,如果解密电路做得隐蔽,使非设计者不知道加密方法,则要破译片外EPROM里的程序具有一定的难度。实际使用中还可采用更为复杂的方法产生“密钥”,“密钥”周期还可进一步加长;在硬件上也应做得隐蔽,解密电路亦可用编程器件实现,以进一步增加破译难度。

screen.width-333)this.width=screen.width-333" dypop="按此在新窗口浏览图片">

水电之家为您提供最全面的管材,管件,水电,电线,电工,管材水电品牌的装修知识点和各种管材水电的导购与在线购买服务,拥有最便宜的管材水电价格和最优质的售后服务,每天都有秒杀的抢购活动哦!敬请登陆水电之家:http://shuidian.jc68.com/
小程序码
 
打赏
 
更多>文章标签:电工
更多>同类水电电工资讯
0相关评论

推荐图文更多...
点击排行更多...
水电商机信息更多...
水电电工圈更多...
最新视频更多...
推荐产品更多...
天花之家 | 木门之家 | 灯具之家 | 铁艺之家 | 幕墙之家 | 五金头条 | 楼梯头条 | 墙纸头条 | 壁纸头条 | 玻璃头条 | 老姚之家 | 灯饰之家 | 电气之家 | 全景头条 | 陶瓷之家 | 照明之家 | 防水之家 | 防盗之家 | 博一建材 | 卫浴之家 | 区快洞察 | 潜江建材 | 仙桃建材 | 恩施建材 | 随州建材 | 咸宁建材 | 黄冈建材 | 荆州建材 | 孝感建材 | 荆门建材 | 鄂州建材 | 襄樊建材 | 宜昌建材 | 十堰建材 | 黄石建材 | 长沙建材 | 湘西建材 | 娄底建材 | 怀化建材 | 永州建材 | 郴州建材 |
建材 | 720全景 | 企业之家 | 移动社区 | 关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图 | 排名推广 | 广告服务 | 积分换礼 | RSS订阅 | sitemap | 粤ICP备14017808号-1
(c)2015-2017 BO-YI.COM SYSTEM All Rights Reserved
Powered by 电工之家