-
-
[求助]ARM系统加密防山寨,希望听听诸位的看法
-
发表于:
2011-7-6 01:55
9333
-
我用的IC是STM32,是一款主频只有72MHz的32位定点处理器。需要对产品升级过程中的数据流进行加密。只是不知道什么加密算法速度比较快,且能把解密门槛设置得足够高,下文会详细介绍。
大学读的机械设计专业,没学过离散数学,高等数学和概率论之类也不是很熟悉,死命复习或许能捡起来一些。不过是在确实有必要的前提下。我对密码学了解甚少,刚刚才看过DES的文章,算法还没彻底消化。先简单介绍一下我系统的结构。
整个系统包含一套PC端软件(VC++编写),一个USB外设,以及连接在这个USB外设上的一些子外设。所有外设都是芯片,程序(也就是固件)都存储在内置flash里并通过芯片内置的硬件加密机制进行了第一道加密。如果硬件出售之后不需要升级的话我就不用发帖子了。现在的问题是我需要升级部分外设。
升级分两类,一类是给直接插入电脑的USB外设升级,另一类是通过前者给它的子外设升级。升级过程基本相同:
- 用户插入USB外设,在PC端软件上点击升级固件的按钮。
- PC端软件收集硬件信息,自动连接产品网站的服务器,将硬件信息发送回服务器,请求下载对应的固件。
- PC端软件下载固件后向用户提示固件版本列表,由用户选择希望安装的版本,确定要升级后PC端软件与外设握手并启动升级过程。
- PC端以特定大小的包为单位一次次向外设发送新的固件。每包发完后外设做应答,如果接收成功则继续发送,如果不成功则终止升级并报错。外设回滚至最近版本的完整固件。
- PC透过USB外设对子外设升级固件时,USB外设本身只做数据中继,交接底层数据包并做物理层的错误侦测,不干预逻辑层的事务。
先说这里面容易被山寨盯上的细节:
一方面最直接的是芯片本身。如果没有硬件加密,用一个编程器就可以读出存储器里的所有内容,如果代码不做任何防范措施则可以原封不动拿去写进同型号的空白芯片里,电路板其余部分照抄即可轻易仿制产品。而硬件加密也并非完全可靠,但是破解需要成本。我用的芯片目前用纯软件手段解密成本还是比较高的,用机械手段的话则需要动用精密磨床去掉塑料外壳将flash硅片染色暴露在高倍率显微镜下用光学方式逐bit读取,这个成本也是不低的。
另一方面是升级过程的数据。从服务器到PC机的环节可以侦测TCP数据流,也可以去内存里挖缓存文件,从PC机到第一级外设可以抓USB通讯包,从第一级外设到第二级外设可以监听我的硬件总线。这几种技术都是存在的而且成本不高。因此我根本不怀疑有人会拦截我用来升级的文件拿去逆向。
我的对策主要分两部分分别与两类威胁对应,一部分是让同一型号的每个产品固件都不一样,也就是说一块芯片里的固件拷出来,直接写进同型号的另一个芯片是不能工作的。这个要借助芯片内部的硬件UID机制。每个芯片出厂时由厂家在存储区的特定地址固化了32位唯一ID值。这个系列没有任何两个芯片的UID是相同的。利用UID进行加密的机制通常是需要软件干预的,也就是说我可以在UID与特定变量的值/地址之间建立关联,让山寨系统的程序在读写相应变量时走入错误的分支。但不可以改变指令集中每个指令存储在flash中的机器码。
另一部分就是通讯协议中的加密算法了,上位机通过USB发给外设的固件数据包是密文,截下来也没用。我觉得应该使用对称加密算法,因为我的数据完全不需要对用户透明,用户只须关心硬件操作。我看了DES的密钥是64bit,或许可以用UID做其中一部分,用自己的固定密钥做另一部分。用户的PC端软件在请求升级的时候发回UID,我在服务器上做一个实时加密服务即时生成密文。
对加密算法的速度要求可以这样量化:我的USB外设程序存储区有128KB,最大的可能有256KB。子外设规模相对较小,程序小的只有16KB左右,大的也不超过128KB。USB连接是全速12Mbps,使用interrupt传输,每个包64字节。经我实测13KB的数据用官方未加密的USB协议升级大概需要3秒钟。目前还没有太大的程序去测试满片升级的速度,但如果真要写满256KB,估计不会很快。子系统与USB系统之间的传输速度可能会成为下一级外设升级的瓶颈。速率满打满算最高可能只有2Mbps。我要在这个基础上加入解密算法,因此速度要求不容忽略。毕竟是72MHz主频的系统。
值得注意的一点是如果山贼使用机械手段读到了我的flash内容,那么首先不管通讯上做了神马加密,都统统玩儿蛋去了,因为我的解密机制都在flash里面。这时候最后一道防线就是上面说的UID了,而用UID去影响程序行为也是有讲究的。最简单最原始的例子是在程序中定义一个const long,程序启动后首先读取这个常量,然后读取UID,二者若相同则走正常分支,若不同则走邪门歪道。我编译好这套程序之后,用其HEX作为模板并查询到这个常量在文件中的偏移量。然后再专门写一个软件挂在服务器上。当用户的PC端软件发来它所购买产品上所用IC的UID之后,软件自动用这个UID替换模板HEX文件里相应偏移量的数据,然后将替换后的文件加密发过去。这样的原始方式如果被山贼抄了flash,他第一个找的就是flash里和芯片UID完全相同的数字组合。因此基于UID的加密也需要提高山寨的成本,这个速度不做太多要求。因为UID验证不一定要贯穿全程,仅在系统初始化的时候验证一下即可。
我写的应该够详细了,术业有专攻,机械、电子、软件全是我一个人开发的,已经耗费大量精力了,实在无力从头攻克密码学了。希望诸位高手指一个方向,我好有针对性地选择一些资料去学习。多谢诸位。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!