Terrys的个人空间 https://bbs.21ic.com/?1404257 [收藏] [复制] [RSS]

日志

遇到的单片机加密问题

热度 1已有 490 次阅读2017-2-25 20:24 |个人分类:实用技术|系统分类:嵌入式系统| 单片机, 加密

去年给一个客户做了个控制器,使用的是STC15F2K60S2,当时没有考虑到加密的问题,但是代码里面有一些核心的业务算法,客户担心被别人窃取和仿制。我一开始认为这款单片机还没被破解,但这款单片机被破解也是迟早的事,因此有必要研究一下加密的方法。

STC15F2K60S2单片机程序,是无法通过仿真器将其二进制源码读出的(非侵入式);但是,侵入式破解单片机还是可行的(百度贴吧已经有人声称破解成功)。因此,通过程序自身的加密还是必须的,能够大大增大破解的难度(即使成功获取bin源码,也无法有效使用)。

以下方法均基于MCUID,参考STC官网的方法。

方法1:使用两个程序,先下载和运行第一个程序(下一次不擦出EEPROM),通过对ID号进行数学校验(使用自己的加密算法),生成相应的秘钥并写入到EEPROM。第二次下载正式的程序(下一次擦出EEPROM),对比计算出来的秘钥与EEPROM中保存的秘钥是否相等,否则显示异常。

 方法2:使用STCISP提供的功能,使用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或者标志,如果遇到二进制源码被窃取,可以以此作为法律证据。



路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 q2512262471 2017-3-9 22:33
变频伺服驱动及PLC&HMI产品生产企业技术方案提供商
深圳市伊瑞软件技术有限公司   
Shenzhen Erik Software Technology Co., Ltd