单片机程序加密思路

实际产品中MCU软件涉及到机密信息,因此需要保护已上市的产品中MCU固件不被窃取,梳理了一下,具体思路有以下几种:

1、将MCU的FLASH锁死以防止固件被非法读取。

2、软件中增加自毁机制

3、在软件中增加加密算法

第一道防范是针对那种毫无研发能力的厂商,这种厂商一般直接把MCU拿给专业**机构进行**获取MCU的固件,然后批量烧录到他们自己的MCU中完成赤裸裸的盗版。如果把读取FLASH固件的大门给堵住了,那么他们就无能为力了。

第二道防范依然是针对那种毫无研发能力的厂商,为什么还要第二道防范呢?因为第一道防范并不是绝对的,有些**机构有很强的**能力,他们可以直接掀开MCU外层封装然后用高倍率放大镜配合特殊技术直接烧断熔丝从而破坏读保护,于是第一道防范就这样被解除了。就是阻止真实数据被读出,MCU软件检测到外部有读FLASH操作后就执行特定的函数对FLASH数据进行擦除,最后盗版者读出来的全部是空值。

第三道防范依然是针对那种毫无研发能力的厂商,有了第二道防范,为什么还要第三道防范呢?因为软件自毁机制并一定总是有效,一旦软件设计有漏洞,那么盗版者还是可以侥幸得到固件的,因此第三道防范就出现了,目的就是即便他们千辛万苦获得了固件,如果他们自身不具备反汇编能力,无法对固件的软件逻辑进行分析,那么结果也是前功尽弃。那么第二道防范的思路是如何的呢?如下:
①设计一套加密算法,利用MCU内部的unique ID作为运算参数,计算结果通过第三方工具烧进MCU内部的FLASH的特定地址处。

②MCU软件采用相同的算法利用unique ID作为运算参数计算获得结果,然后读取FLASH中特定地址处的结果,两者进行对比,如果相同则继续执行,否则进入死循环。

③由于每一片MCU的unique ID都不一样,因此对于每一片MCU来说,软件利用加密算法计算得到的结果都不同。而由于盗版者不知道加密算法是什么,也不知道加密结果存放在FLASH的什么地方。因此软件从那个特定地址读到的数值始终是与当前计算的值不匹配,所以软件将始终进入死循环。

第三道防范的原型图如下:

单片机程序加密思路

第四道防范就是针对具备研发能力的厂商,这种厂商一般有能力对反汇编后的代码进行研究,因此对待这类盗版者就要增加逻辑上的误导了,这其实是很难的,毕竟通过调试和各种测试他们总能将软件噪声与有用信息分离开来。 

【总结】

加密没有一步到位的方法,需要设置多个关卡,将盗版者层层阻挡在外。 即便如此,最终也会有漏网之鱼,正如抗生素无法歼灭所有病菌一样,总有病菌能够适应这种抗生素,一旦他们活下来,当前的这种围剿措施就基本上毫无作用了。