程序安全问题
我想咨询一下STC官方,数据手册上说的都是程序下载过程中进行加密传输,如果我给单片机下载的是未加密的HEX程序,那么客户拿到我的产品他可以通过手段拿到我的hex程序么,就是说通过成品产品读出我的程序,如果能,我该怎么防范,如果读不出来那就无所谓了,感谢。如果是怕产品里的程序被读出来,增加ID号加密功能就行。我们STC的芯片只有写入接口,没有读取接口,烧录到芯片里的程序正常是无法读取的。增加ID号加密可以加一道保险。STC32G系列单片机内部的只读特殊功能寄存器CHIPID中保存有与芯片相关的一些特殊参数,包括:全球唯一ID号、32K掉电唤醒定时器的频率、内部1.19V参考信号源值(BGV)以及IRC参数。在用户程序中只能读取CHIPID中的内容,不可修改。使用CHIPID中的数据对用户程序进行加密是STC官方推荐的最优方案。
【新提醒】CHIPID应用,STC32只读特殊功能寄存器中存储的十种高速时钟和唯一ID号等重要参数 - 电源/复位/省电模式/外部晶振/内部时钟/对外时钟输出/PLL-144MHz时钟 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区https://www.stcaimcu.com/forum.php?mod=viewthread&tid=1909&highlight=chipid
STCAI-32位8051 发表于 2023-12-13 16:22
如果是怕产品里的程序被读出来,增加ID号加密功能就行。我们STC的芯片只有写入接口,没有读取接口,烧录到 ...
我昨天也查看了手册没有找到相关的接口说明,如果是这样子那就很好了。 Mr.Yan 发表于 2023-12-14 09:23
我昨天也查看了手册没有找到相关的接口说明,如果是这样子那就很好了。 ...
手册搜唯 一ID,就能找到相关的材料,不过得看型 号,一些旧型号没有这功能。 通过唯一的芯片ID号来判断是否正常执行程序,一个HEX文件只能针对一个芯片,在批量上升级程序就无法一一实现,所以只能另找加密方案。 xxkj2010 发表于 2023-12-16 11:53
通过唯一的芯片ID号来判断是否正常执行程序,一个HEX文件只能针对一个芯片,在批量上升级程序就无法一一实 ...
你这个对生产的理解是错误的 !!!
传统加密的笑话, STC对加密的延申发展,放心的【远程升级】,视频讲解 - 程序加密后传输/发布项目程序/USB-ISP下载/远程升级/ID号加密 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
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号使用两种不同的方式加密后写入到不同的地址中每种加密方式
中可进行4步运算,每一步运算可选择下面的7种运算方法:
+ : 加法运算- : 减法运算* : 乘法运算/ : 除法运算
<<: 左移运算>>: 右移运算^ : 异或运算
对于运算操作数,只接受10进制数的输入,有效的数据为0~255,超出范围的数,高位会被自动舍弃.
例如输入257(102H),则实际参加运算的术为2(02H)
所有的运算都是基于单字节的,高低字节之间不会产生进位和借位,即低字节运算后如果产生进位
或借位将直接舍弃,而不参与高字节的运算
例如:
如果ID号为 : 01 02 03 04 ff fe fd
加密方式为 : "+255, +0, +0, +0"
则加密后的数据为 : 00 01 02 03 fe fd fc
注意事项:
若是将ID号加密和程序加密后传输这两种功能结合起来同时使用时,则必须在原代码加密前,将需
要写入加密ID号的地址空间预留为FF,然后在对程序文件进行加密(若下载时需要将HEX空白区域
填充为00时,也需要执行此操作将区域保留)
例如:
我现在需要将ID号加密后写入到程序空间1000H开始的地址,那么我必须在我的源代码中,
将1000H~1006H这7个字节保留,并定义为FFH(不能为00H)
神农鼎 发表于 2023-12-16 12:22
你这个对生产的理解是错误的 !!!
这种思路的加密没有弄过,有时间研究一下。 神农鼎 发表于 2023-12-16 12:24
ID号加密是根据用户所设定的算法对ID号的7个字节进行分别运算,每种加密算法最多可以进行4次
不同的运算, ...
这个值得我深入了解一下。 神农鼎 发表于 2023-12-16 12:24
ID号加密是根据用户所设定的算法对ID号的7个字节进行分别运算,每种加密算法最多可以进行4次
不同的运算, ...
请问如何将1000H~1006H这7个字节保留,并定义为FFH?