加密与破解,自单片机诞生以来就是永恒的主题。本文主要探讨的是为什么要给单片机加密,如何加密,加密方法有哪些。
为什么要给单片机加密,如何加密?
当您的产品推向市场的时候,您的竞争对手就开始盯上它了,如果您的产品硬件很容易被模仿,而且您使用的单片机没有被加密的话,那么您辛辛苦苦的劳动成功就很容易成为您竞争对手的产品了,使用JTAG调试工具FET虽然可以将程序下载到芯片内部,但只有使用专业编程器能够防止程序被窃取。
JTAG、BSL、BOOTLOADER、熔丝的区别和关系是什么?
JTAG接口能够访问MSP430单片机内部所有资源,通过JTAG可以对芯片进行程序下载、代码调试、内存修改等等,通过JTAG还能烧断加密熔丝,熔丝一旦被烧断,JTAG接口绝大部分功能失效,就再也不能通过它进行编程了。
BSL接口是利用芯片内部驻留的bootloader程序实现的自编程,通过特定的时序使得CPU进入bootloader代码断,然后利用每个msp430芯片内部都有的Timer A构成一个软件串口来与上位机通讯,这样可以将代码下载到芯片内部。实现BSL除了JTAG接口的一些引脚外,还需要用到两个TA0功能引脚,因此在设计产品时如果需要加密,则应该考虑将这两个引脚也连出来。要烧断熔丝(加密)必须使用JTAG接口;烧断熔丝后只能通过BSL或者用户代码来实现编程更新。
BSL的验证密码是怎么回事?
BSL也能读出芯片内部的代码,这样可以实现编程后的校验等功能。通过BSL擦除所有Flash信息时不需要验证密码,但是要进一步操作,就得输入32字节密码进行验证。
BSL的协议规定这32字节密码为芯片FLASH区域的最高32字节,也就是程序的16个中断向量,如果您拥有这段程序的最后32字节,就能通过BSL将芯片内部所有代码读取出来。
为什么要使用高级加密?
32字节的密码看似几乎完全没可能使用穷举法来实现破解,但是各位别忘了,msp430的16个中断向量未必每一个都用到了,没用到的中断向量为0xffff,如果您的程序只用到了复位向量,那么破解者只需尝试最多32768次(中断向量为偶数,所以除以2)就能将其破解,另外,如果芯片本身Flash容量较小,比如4K字节,那么破解者只需尝试最多2K次就能将其破解。这对自动操作的计算机来说几乎是一瞬间的事情。那么如果用到的中断向量越多,就越难破解,最好的办法就是将所有未用到的中断向量全部填充为随机数据,这就是“高级加密”。
关于TI-TXT文件
TI-TXT文件是TI公司为MSP430单片机定义的一种编程代码格式,其内容为纯文本格式,使用任何文本编辑器都能对其进行阅读,下面是一个这类文件的例子:
@FEFE
B2 40 80 5A 20 01 F2 40 9D 00 90 00 F2 40 2E 00
40 00 F2 D0 80 00 01 00 F2 43 33 00 C2 43 95 00
C2 43 9A 00 F2 D0 20 00 53 00 F2 40 1F 00 52 00
F2 43 91 00 F2 43 92 00 F2 43 93 00 F2 43 94 00
F2 43 95 00 F2 43 96 00 F2 43 97 00 F2 43 98 00
F2 43 99 00 F2 43 9A 00 32 D0 D0 00 FD 3F 31 40
00 03 B0 12 A2 FF 0C 93 18 24 3C 40 00 02 0E 43
30 12 00 00 B0 12 C4 FF 3C 40 00 02 3E 40 FE FE
30 12 00 00 B0 12 A6 FF 21 52 3C 40 00 02 3E 40
FE FE 30 12 00 00 B0 12 A6 FF B0 12 FE FE 30 40
A0 FF FF 3F 1C 43 30 41 0A 12 1D 41 04 00 0F 4C
0A 4D 1D 83 0A 93 05 24 EF 4E 00 00 1F 53 1E 53
F7 3F 3A 41 30 41 0A 12 1D 41 04 00 0F 4C 0A 4D
1D 83 0A 93 04 24 CF 4E 00 00 1F 53 F8 3F 3A 41
30 41
@FFFE
5C FF
q
第一行的@FEFE表示从地址0xFEFE开始,有如下代码。每行为16字节,每个字节使用16进制数表示,每两个字节之间用一个空格格开。
内容末尾的@FFFE就是程序的复位向量了,表示程序的入口地址为0xFF5C。最后用一个小写的q字符加换行结束,当然也可以把中断向量的那两行放到最前面去,比如下面这段代码的含义跟上面的是一样的,同样符合规则。
@FFFE
5C FF
@FEFE
B2 40 80 5A 20 01 F2 40 9D 00 90 00 F2 40 2E 00
40 00 F2 D0 80 00 01 00 F2 43 33 00 C2 43 95 00
C2 43 9A 00 F2 D0 20 00 53 00 F2 40 1F 00 52 00
F2 43 91 00 F2 43 92 00 F2 43 93 00 F2 43 94 00
F2 43 95 00 F2 43 96 00 F2 43 97 00 F2 43 98 00
F2 43 99 00 F2 43 9A 00 32 D0 D0 00 FD 3F 31 40
00 03 B0 12 A2 FF 0C 93 18 24 3C 40 00 02 0E 43
30 12 00 00 B0 12 C4 FF 3C 40 00 02 3E 40 FE FE
30 12 00 00 B0 12 A6 FF 21 52 3C 40 00 02 3E 40
FE FE 30 12 00 00 B0 12 A6 FF B0 12 FE FE 30 40
A0 FF FF 3F 1C 43 30 41 0A 12 1D 41 04 00 0F 4C
0A 4D 1D 83 0A 93 05 24 EF 4E 00 00 1F 53 1E 53
F7 3F 3A 41 30 41 0A 12 1D 41 04 00 0F 4C 0A 4D
1D 83 0A 93 04 24 CF 4E 00 00 1F 53 F8 3F 3A 41
30 41
q
手动修改TI-TXT文件来实现高级加密:
下面是使用到中断向量较少的一段代码的中断向量:
@FFE0
10 FF A0 FF
@FFFE
5C FF
它与下面这段代码意义是一样的:
@FFE0
10 FF A0 FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF 5C FF
这里我们把未用到中断向量改成随机数据,就实现高级加密了,不过注意不要把有效的中断向量也改了
@FFE0
10 FF A0 FF A5 5A 37 21 F3 44 E0 77 9A 00 22 33
44 55 66 77 88 99 AA BB CC DD EE 3E E3 0F 5C FF。
单片机的加密方法
自从上世纪七十年代MCU诞生以来,芯片的破解技术与防止芯片被破解方案就在不断在上演着“道高一尺,魔高一丈”,一山更比一山高的追逐。
一、 单板机时代
上世纪70年代初期,嵌入式系统是由分离部件如: CPU、ROM、RAM、I/O缓存、串口和其他通信与控制接口组成的控制板。如图:
这一时期除法律外,几乎没有保护措施来防止侵入者复制单板机上ROM区的数据。
二、 单片机时代
随着大规模集成电路技术的发展,中央处理单元(CPU)、数据存储器(RAM)、程序存储器(ROM)及其他I/O通信口都集成在一块单片机芯片上了,微控制器MCU取代了单板机。如图:
这一时期,内部存储器EEPROM和MCU是分开封在同一封装内部。侵入者可用微探针来获取数据。
三、 安全熔断丝(Security Fuse)
随着入侵者的增加,MCU为了自身的安全,后来增加了安全熔断丝(Security Fuse)来禁止访问数据。如图:
优点:很容易做到,不需要完全重新设计MCU构架,仅用熔断丝来控制数据的访问。
缺点:熔断丝容易被定位、攻击。例如:熔丝的状态可以通过直接把位输出连到电源或地线上来进行修改。有些仅用激光或聚焦离子束来切断熔丝的感应电路就可以了。用非侵入式攻击也一样成功,因为一个分离的熔丝版图异于正常存储阵列,可以用组合外部信号来使位处与不能被正确读出的状态,那样就可以访问存在内部芯片上信息了。用半侵入式攻击可以使破解者快速取得成功,但需要打开芯片的封装来接近晶粒。一个众所周知方法就是用紫外线擦掉安全熔断丝。
四、 安全熔丝变成存储器阵列的一部分
再后来MCU制造商将安全熔丝做成存储器阵列的一部分,如图:
一般的熔丝与主存储器离得很近,或干脆共享些控制线,与主存储器用相同的工艺来制造,熔断丝很难被定位。非入侵试攻击仍然可以用,可以用组合外部信号来使熔断位处于不被正确读出的状态。同样,半侵入式攻击也可用。当然破解者需要更多的时间去寻找安全熔丝或控制电路负责安全监视的部分,但这些可以自动完成。进行侵入式攻击将是很困难需要手工操作,那将花费更多的成本来破解。
五、 用主存储器的一部分来控制外部对数据访问
利用上电时锁定特定区域地址的信息,将它作为安全熔丝。或用密码来控制对存储器访问。例如德州仪器的MSP430F112只有输入正确的32字节密码后才能进行回读操作。如果没输入,只有擦字节密码后才能进行回读操作。尽管这个保护方法看上去比先前的更有效,但它有一些缺点可以用低成本的非侵入式攻击,如时序分析和功耗来破解。如果安全熔丝状态是上电或复位后存储器的一部分,这就给破解者用电源噪声来破解的机会,强制路进入存储中错误状态。
六、 使用顶层金属网络
使用顶层金属网络设计,提升入侵难度。所有的网格都用来监控短路和开路,一旦触发,会导致存储器复位或清零。如图:
普通的MCU不会使用这种保护方法,因为设计较难,且在异常运行条件下也会触发,如:高强度电磁场噪声,低温或高温,异常的时钟信号或供电不良。故有些普通的MCU使用更廉价的伪顶层金属网格,会被非常高效的光学分析进行微探测而被攻击。另外,这些网格不能防范非侵入式攻击。同样不能有效防范半侵入式攻击,因为导线之间有电容,并且光线可以通过导线抵达电路的有效区域。
在智能卡中,电源和地之间也铺了一些这样的网格线。部分可编程的智能卡走的更远,干脆砍掉了标准的编程接口,甚至干掉了读取EEPROM接口,取而代之的是启动模块,可以在代码装入后擦掉或者屏蔽自己,之后只能响应使用者的嵌入软件所支持的功能。有效的防范了非侵入式攻击。
七、 智能卡芯片安全设计
近些年,一些智能卡使用存储器总线加密(Bus Encryption)技术来防止探测攻击。如图:
数据以密文方式存储在存储器中。即使入侵者获得数据总线的数据,也不可能知道密钥或者别的敏感信息(如数据还原方法)。这种保护措施有效的防范了侵入式和半侵入式攻击。
有些智能卡甚至能够做到每张卡片总线加密密钥不同,这样即使入侵者完全破解了,也无法生产出相同功能的芯片来,因为每个智能卡芯片有唯一的ID号,无法买到相同ID号的智能卡。
另外值得一提的是,有些智能卡将标准的模块结构如解码器,寄存器文件,ALU和I/O电路用类似ASIC逻辑来设计。这些设计成为混合逻辑(Gle Logic)设计。混合逻辑使得实际上不可能通过手工寻找信号或节点来获得卡的信息进行物理攻击。大大提高了CPU内核的性能和安全性。混合逻辑设计几乎不可能知道总线的物理位置,有效的防范了反向工程和微探测攻击。
智能卡芯片加密方案优缺点
对于开发者来讲,选择更为安全设计的微控制器或可以得到更好的保护。与大多数微控制器相比,即使是十年前设计的智能卡也能提供更好的保护。
现代的智能卡提供了更多的防攻击保护,内部电压传感器保护免受电源噪声攻击(Power Glitch attacks)、过压和欠压保护。时钟频率传感器防止受到静态分析(Static analysis)的降低时钟频率攻击。同时也可以防止时钟噪声(Clock glitch attacks)进行提高时钟频率的攻击。顶层金属网格和内部总线硬件加密使可以防止微探测攻击。
但是与微控制器相比,智能卡芯片也有劣势,如:芯片价格昂贵,小批量的很难买到货。开发工具昂贵,需要和制造商签署保密协议,即使是说明书也要这样。很多制造商仅向特定客户销售大批量的智能卡。另一个不足是 I/O的功能受限,普通智能卡芯片通常只有ISO7816接口,极少有单独的I/O口。这使得多数应用中不能取代微控制器,而只能用于安全要求非常高的行业,如:付费机顶盒,银**,SIM卡,二代身份证,高端加密芯片等领域。
智能卡芯片在加密芯片领域的应用,将是个不错的方向。因为智能卡芯片安全等级高,IO资源少。 而普通MCU的硬件资源非常丰富,安全程度却不高,可以将MCU中一些关键算法及运行参数,以特殊形式存放在智能卡芯片中,从而实现高安全强度的强大功能。
随着科技的发展,与单片机相关的嵌入式电子产品的生命周期也越来越短,如何让自己的产品缩短开发周期,加速上市时间,已成为众多商家及工程师不得不思考的问题。真正的创新或高效,不只是来自于大自然对人类的启发,更多的是来自于学习,只有善于学习的人,才有进步,日常生活如此,搞技术更是如此。
理论上,任何单片机系统都可以被解密,只是解密成本与时间问题。单片机软件加解密,没什么深奥的,但不夸张的说,它也是一门艺术,是工程师长期含辛茹苦智慧的结晶,如果应用得好,可以快速学习他人的先进技术,也可以防止自己的技术成果轻易被他人取用。如果软件加密做得好,要完全进行软件解密,要分析数天,甚至花几个月,还不一定能完全分析得出来(这与分析人员的这与分析人员的经验及知识结构关系很大)。
单片机几种硬件加密方法
我们知道,研究一套可行实用的单片机系统肯定要花大量的人力和物力。为了使所研制的系统不被别人所剽窃,保护知识产权,通常在单片机系统设计时,都要进行加密设计。加密设计一般有硬件加密和软件加密。而硬件加密的方法很多,可以采用PAL、GAL等芯片将CPU与ROM之间的地址线或数据线按一定密钥规律进行交换,这样就把原程序页号打乱,起到加密作用。但这里探讨的是几种简单的硬件加密技术。
1.硬件加密设计步骤
1.1 根据具体项目和任务,设计目标程序并在未加密情况下调试成功。
1.2 设计硬件加密电路。
1.3 对调试好的软件按硬件电路进行加密翻译,不同的硬件加密电路翻译出来的软件不同。
1.4 将加密翻译后的软件写进EPROM.
这样,剽窃者将得到的EPROM里的程序进行反汇编后,不在是原来的程序,甚至是逻辑关系混乱毫无价值的代码。从而保护了原设计者的利益.
2. 硬件加密电路的设计
为方便说明硬件加密原理和软件加密翻译方法,先列举一例题,以下论述均以该例子为研究对象。
例1 比较两个无符号数的大小,设两个无符号数事先分别存在RAM里的30H和31H单元,若(30H)里的数大,则累加器的A.0~A.3为高电平;若(31H)里的数大,则累加器的A.4~A.7为高电平;若两数相等,则累加器的A.2~A.5为高电平。试设计汇编程序实现。
该例题所设计的原程序、机器代码和存储单元如下:
2.1 硬件加密方法一
将数据线中某几根线换位,如图1所示。将图中数据线D1、D2交叉,这样单片机系统执行的实际代码就与EPROM中存储的代码完全不同了。若将例1的程序存入EPROM ,那么存入的实际代码就要做相应的加密翻译,以使单片机从EPROM中所取的代码正确。加密翻译后在EPROM中实际存的代码和反汇编的结果如下:
P2.0~P2.4P0.3~P0.7P0.2P0.1P0.0ALEPSENCPU8031
74LS373
A8~A12A3~A7A2A1A0 2764OE CED3~D7D2D1
2.2 硬件加密方法二:
将CPU和EPROM间的地址换位,如图2所示,将地址线A0、A1换位交叉,这样单片机系统程序存在EPROM中的代码不变,但存储顺序完全打乱。若将例1的程序存入EPROM时,为保证单片机的正常工作,要将存储代码的顺序按硬件电路要求做相应的改变,即进行加密翻译,加密翻译后EPROM中存储的实际代码和反汇编的结果如下:
从反汇编的结果看,既是剽窃者取出EPROM里的程序代码,反汇编后也得不到原来的程序了,
2.3 硬件加密方法三
将CPU和EPROM间的数据线某些位经过三态反相器求反。如图3所示,将数据线D0、D1分别求反后送CPU,这样存在EPROM里的程序和原来的程序就不同了。若将例1的程序按硬件加密电路进行软件加密翻译后,存在EPROM里的实际代码和反汇编后结果如下:
P2.0~P2.4P0.2~P0.7P0.1P0.0 ALEPSENCPU8031
74LS373
A8~A12A2~A7A1A0 2764OE CE D2~D7D1D0
可见经硬件加密后,存在EPROM里的代码与原来代码完全不同。
2.4 硬件加密方法四
将CPU和EPROM间的地址线的某些位求反。如图4所示,将地址线A0、A1求反,这样存在EPROM里的代码内容不变,但代码的存储顺序要按硬件电路相应改变。若仍以例1为例,将该程序代码加密后,存在EPROM里的代码和反汇编后的结果如下:
A8~A12A2~A7A1A0OE CE2764D2~D7D1D0
P2.0~P2.4P0.2~P0.7P0.1P0.0 ALEPSENCPU8031
74LS373
可见将EPROM里的代码反汇编后,仍得不到原程序。
总结
坚持不懈的尝试突破保护机制的破解团体和不断引入新的安全防范方案的制造商之间的斗争是没有尽头的。 “道高一尺,魔高一丈”,又或是“邪不压正”,将不停的在两派之间上演。其实软件加密原理很简单,就是利用单片机IC厂商,为每片出厂芯片的某一特殊全球唯一识别参数,即ID号做为密钥,对程序进行加密。如果以本ID号的程序烧到另一ID号的芯片中,程序中经软件加密过的部分的功能将完全失效。
要解密上述经软件加密过的程序,唯一的途径,就是反汇编程序,分析单片机反汇编后的汇编程序,将程序中软件加密相关的密钥去掉,然后编译得到新的程序。这项工作需要的不只是耐心,更多的是专业知识与经验。
-
芯片
+关注
关注
452文章
50185浏览量
420689 -
单片机
+关注
关注
6030文章
44487浏览量
631867
发布评论请先 登录
相关推荐
评论