宁教我负天下人,休叫天下人负我。
大家都知道枭雄曹操,错杀了吕伯奢之后的这句名言 - 宁教我负天下人,休叫天下人负我。把这句话写在这里,并不表示我们同意他的观点,而是这种人从古至今,由中而外,大有人在。看看周围,不法侵占别人劳动成果的事情,比比皆是。所以我们能做的,可能就是以小人之心,度小人之腹,尽可能多加防范。
就拿工程师们来说,干一个项目,画板子调程序,辛辛苦苦几个月,甚至一年半载的,产品终于上市大卖开始赚钱。这时候如果有人把程序读出来,然后复制出产品,卖得还更便宜,实在是一件让人吐血的事情。
把程序加密,无疑是一个防小人的好办法。我们这里介绍一种比较流行的加密方式,它利用芯片里的唯一识别码,为每一个MCU单独授权,这样即使程序被读出,也没有办法在其它的MCU上运行。我们讲一下它的工作原理,以及一款可以实现加密量产,可以授权烧写次数的工具。
一种流行的加密方法
如上图中所示,MCU中一般都有一个UDID(Unique Device IDentifier),这个唯一识别码,每一个MCU都是不一样的,烧写工具可以读出这个UDID,然后通过算法,计算出一个授权(License),烧写MCU程序(APP)时,连同这个授权码一起写入Flash。当MCU上电运行时,也读取自己的UDID,然后通过同一算法,计算出授权码,并和工具写入的授权码做对比,如果不相同就拒绝执行下面的程序。下面举个例子。
如图,三个MCU的UDID分别为1,3,5。通过一种算法计算出1和3的授权码分别为0和4。从1和3号读出的程序,写入5号是无法运行的。因为我们会发现,程序用5计算出的授权码,不等于0也不等于4,无法通过比对,程序无法继续运行。
那么我们能根据1和3的已知信息,反推出算法吗?可以试试看,经过一番猜测,我们发现一个算法,(UDID–1)*2 对于1号和3号MCU完全适用。我们不由得一阵兴奋!经过计算(5-1)*2=8,我们把8写入5号MCU的授权地址,然后发现程序并没有运行???
怎么回事?因为算法是猜测的。我们完全可以反推出另外一种算法:(UDID-1)*(UDID-1)。对于1和3也是适用的,但对于5,结果是16。
对于简单的数字尚且如此,而UDID一般长度有16个字节,用户再混入自己的密钥数字,用加减乘除,异或等运算计算出授权,想要逆向推测出算法还是很难的。如果想要进一步增加安全性,可以采用更高级别的加密算法。
为了增加逆向分析的难度,还可以在用户程序中综合采取一些措施。比如:不直接读取UDID和授权码,而是用两个地址运算生成读取地址;使用inline内联函数;多次校验并延时触发等。
加密算法
对称加密
加密和解密使用同一密钥。所以发送端和接收端都要对密钥严格保密。对称加密好处是运算速度快。常用的有DES,3DES,AES,以及我国的SM1。
非对称加密
它的密钥分为公钥和私钥,公钥是公开的,但是从公钥无法推导出私钥。非对称加密的好处是,只需要保密私钥就行了。其缺点是消耗资源比较多,运算速度慢。常用的有RSA,ECC以及我国的SM2。
反过来,我们也可以用私钥加密,然后用公钥解密,这种方式通常用来完成签名的验证。把MCU的UDID读出来,用私钥加密生成授权码,和应用程序一起写入MCU的Flash,然后MCU的应用程序就可以用公钥完成授权码的验证。采用非对称加密算法的好处是,即使算法是公开的,公钥也是公开的,别人只要没有获得私钥,就没办法为其它MCU生成授权码。
加密算法的安全性
首先想个问题,如果我们给家里装个防盗门,是越坚固的越好吗?好像没毛病。但仔细一想还真不是这样,我们大多数家里安装的,并不一定是市场上最好最贵的。
加密算法也没有绝对的安全。理论上只有一次一密,也就是采用跟明文长度一样密钥,而且只使用一次,才是绝对的安全。所以我们采用什么算法,要根据我们的实际需要。在一定时间长度内,如果破解的代价远大于所获得的价值,我们就认为是安全的。还有就是尽可能使用长一些的密钥,跟踪密码学的最新动态。
安全单片机和普通单片机
对于任何加密方式,密钥的存储是安全的关键。对于普通的单片机,现在一般在Flash区都会有保护字节,可以设置成编程后无法读出。密钥存储在里面,通过常规手段是无法读到的。但是对于非常规手段,这种安全性就不够了。
但是对于非常规手段,就无效了。比如把MCU的外壳溶解掉,然后暴露出内部的硅片,这样就可以直接观察,修改里面存储的内容。所以对于安全等级高的应用,比如金融等,也要求MCU具有更高级别的安全防范措施。这种MCU会把密钥存储在一小块儿RAM里,用电池供电。为了保证存储在RAM里的密钥不被非法读走,采取各种防范措施。比如芯片外部有探测引脚,一旦发现外部电路被破坏,马上销毁密钥。在芯片内部,用金属丝网包住关键区域,一旦被破坏,也会销毁密钥。同时这种MCU内部也会集成随机数生成,硬加密算法模块等,加速加解密的运算速度。
采用哪种单片机,也要根据实际需要来决定。
加密量产工具
创芯工坊的Power Writer,是一款挺实用的量产烧录工具。它可以通过MCU的唯一识别码,对每一个MCU生成单独的授权。加密算法有消耗资源特别少的向量矩阵加密,也有加密级别更高的ECDSA椭圆数字签名算法,还支持用户使用自己的算法。除此之外,他还能授权烧写的MCU个数,烧写MCU的UDID范围等。用户可以把程序上传到云端,客户联网在线获得授权,进行芯片烧录,也可以把程序加载进烧写器,用户采用离线烧录。
扫码加入嵌入式交流群: