热度 1|||
去年给一个客户做了个控制器,使用的是STC15F2K60S2,当时没有考虑到加密的问题,但是代码里面有一些核心的业务算法,客户担心被别人窃取和仿制。我一开始认为这款单片机还没被破解,但这款单片机被破解也是迟早的事,因此有必要研究一下加密的方法。
STC15F2K60S2单片机程序,是无法通过仿真器将其二进制源码读出的(非侵入式);但是,侵入式破解单片机还是可行的(百度贴吧已经有人声称破解成功)。因此,通过程序自身的加密还是必须的,能够大大增大破解的难度(即使成功获取bin源码,也无法有效使用)。
以下方法均基于MCU的ID,参考STC官网的方法。
方法1:使用两个程序,先下载和运行第一个程序(下一次不擦出EEPROM),通过对ID号进行数学校验(使用自己的加密算法),生成相应的秘钥并写入到EEPROM。第二次下载正式的程序(下一次擦出EEPROM),对比计算出来的秘钥与EEPROM中保存的秘钥是否相等,否则显示异常。
方法2:使用STC的ISP提供的功能,使用STC-ISP的ID加密功能
ID号加密是根据用户所设定的算法对ID号的7个字节进行分别运算,每种加密算法最多可以进行4次不同的运算,运算符不分优先级,从前到后依次进行4次运算,对于同一个加密算法,ID号的7个字节是分别使用此算法进行运算,运算完成后会得到加密后的7个字节,在下载用户代码时,加密后的7个字节会自动写入到用户所指定的FLASH中
例如:
当前芯片内部的ID号为 : 01H 02H 03H 04H 05H 06H 07H
选择的加密算法为 : <<1, +2, *3, ^4
设定的存储地址为 : 0x1000
经加密运算后的ID号为
08H 16H 1CH 1AH 20H 2EH 34H
下载程序过程中,加密的ID号会被写入到 FLASH的0x1000~0x1006地址中
08H写入到0x1000
16H写入到0x1001
1CH写入到0x1002
1AH写入到0x1003
20H写入到0x1004
2EH写入到0x1005
34H写入到0x1006
以上两种方法都是基于单片机的“全球唯一ID”,解密者即使获得了二进制源码,也无法使用程序(程序与ID号绑定了)。这种方法也不是无懈可击,只要使解密成本大于开发成本,即可让解密者无利可图。另外可以在程序中留下相应的LOGO或者标志,如果遇到二进制源码被窃取,可以以此作为法律证据。