找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2025|回复: 13
收起左侧

STM32单片机利用唯一ID加密代码的量产方案思路

  [复制链接]
ID:997026 发表于 2023-6-6 19:57 | 显示全部楼层 |阅读模式
大家好,

看到网上很多利用唯一ID加密代码的方案,大部分都是要先知道芯片的ID,然后在代码中与读出的ID对比,如果一致就往下执行,不一致则不执行。
如果是单个芯片自己玩玩还可以,如果涉及到大批量量产,比如有1万片需要生产,我不可能提前去读出每一片的ID吧,工作量太大了。

有没有一种方法,可以通过软件实现,量产时直接烧录代码就行了,然后由代码去自动完成内部ID的读取和比对,并且可以实现被人复制代码到其他芯片上无法使用的方案?

希望大神提供思路。

提前感谢
回复

使用道具 举报

ID:879348 发表于 2023-6-7 09:39 | 显示全部楼层
在烧录文件中没有使用的区域加入一个密码,第一次开机读取正确密码,读取ID重新加密数组保存,然后清除密码以后只能读ID和加密数组对比,不正确就不执行,不要直接用ID比对,不加密作用不大
回复

使用道具 举报

ID:123289 发表于 2023-6-7 10:50 | 显示全部楼层
将合法的ID做个结合A,将结合告知STM32单片机。这是唯一的方式!
你只能在【A如何做?如何告知于STM32单片机】上想办法。不要有其它幻想,不会出奇迹的。
通常的做法,不用ID码!改用EPC码!
道理很简单,ID不可改动,也即A是既定的,STM32没有机动权!
而EPC是可能改动的,只要EPC码符合某种约定就可以达成楼主的目的。至于如何约定涉及机密,需要技术咨询。
回复

使用道具 举报

ID:68189 发表于 2023-6-7 10:59 | 显示全部楼层
wufa1986 发表于 2023-6-7 09:39
在烧录文件中没有使用的区域加入一个密码,第一次开机读取正确密码,读取ID重新加密数组保存,然后清除密码 ...

这个烧录文件,,,随便用,,,,没有意义。
回复

使用道具 举报

ID:1082543 发表于 2023-6-7 11:35 | 显示全部楼层
wpppmlah 发表于 2023-6-7 10:59
这个烧录文件,,,随便用,,,,没有意义。

那这一段可以留着它,还是去掉啊哥
回复

使用道具 举报

ID:68189 发表于 2023-6-7 13:42 | 显示全部楼层
烧录器读取芯片ID,计算出密码,存储到固件一个特定的区。再烧录。这样烧录器是关键。。。有这样的烧录器吗,肯定有的。
回复

使用道具 举报

ID:883242 发表于 2023-6-7 23:08 | 显示全部楼层
如果你能控制烧录时代码不会被泄露,那么沙发的办法是最理想的。
回复

使用道具 举报

ID:879348 发表于 2023-6-8 08:19 | 显示全部楼层
wpppmlah 发表于 2023-6-7 10:59
这个烧录文件,,,随便用,,,,没有意义。

那你想烧录的人都没权限,那只能从其他方面下手了,反正道理都是一样的,就是要有一个步骤激活读取ID的程序,这个东西可以在烧录时加入标记,可以按键输入密码,可以U盘激活,可以无线激活,甚至联网激活,这些原理都是一样的
回复

使用道具 举报

ID:962286 发表于 2023-6-8 10:07 | 显示全部楼层
成熟的批量烧录器是有UID加密功能的。通常它要填这几个参数:
1. 存放加密值地址,暂时把这个地址叫做Addr;
2. 加密的一个系数,暂时把它叫做Val;
3. UID的排列号。通常UID是12个字节,将这个原生的12个字节进行打乱,得到一个新的d_UID;
4. 公式号,烧录器提供有几百种公式。它就是将:Val,d_UID(UID经过自定义打乱)带入然后算出加密值X,最后烧录器再Addr;

程序的操作:
1. 读出UID,按照自己的定义打乱UID,得到d_UID;
2. 自己定义一个常数Val;
3. 选一个烧录器厂家提供的公式(要记住公式号),然后将d_UID和Val带入,得出加密值Y;
4. 读取烧录器设置的存加密值X的地址Addr的值,对比加密值X和自己算出来的加密值Y是否相等,如果相等,就执行程序,如果不相等就直接while(1);

这种加密方式要破解,太难还是挺大的。
回复

使用道具 举报

ID:962286 发表于 2023-6-8 10:12 | 显示全部楼层
wpppmlah 发表于 2023-6-7 13:42
烧录器读取芯片ID,计算出密码,存储到固件一个特定的区。再烧录。这样烧录器是关键。。。有这样的烧录器吗 ...

你说的就是正解!有这个功能的烧录器。
回复

使用道具 举报

ID:74687 发表于 2023-12-15 10:09 | 显示全部楼层
一种思路,定义个static const 变量,比如值为0xffeeaaCC,烧录后第一次运行,初始化的时候进行这个值的判断,如果是这个值,那么读取芯片ID并加密,通过修改flash区域将这个值改为ID加密后的数据。

后面运行的时候,初始化的时候对这个值进行判断,是否是芯片ID加密后的数据,如果不是清空FLASH区域,或者进行其他操作。
回复

使用道具 举报

ID:883242 发表于 2023-12-15 14:17 | 显示全部楼层
MCU_FANS 发表于 2023-6-8 10:07
成熟的批量烧录器是有UID加密功能的。通常它要填这几个参数:
1. 存放加密值地址,暂时把这个地址叫做Addr ...

你这办法跟沙发的说法没有任何不同之处。关键是烧录器无法读UID并修改烧写文件那么只能用沙发的办法。
回复

使用道具 举报

ID:382632 发表于 2024-2-16 18:11 | 显示全部楼层
请问你后面怎么做到
回复

使用道具 举报

ID:1093268 发表于 2024-2-18 16:07 | 显示全部楼层
Hephaestus 发表于 2023-12-15 14:17
你这办法跟沙发的说法没有任何不同之处。关键是烧录器无法读UID并修改烧写文件那么只能用沙发的办法。

比如创芯工坊、轩微这种专门做第三方烧录器的,都有这个功能,用了好多年了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表