STM32/GD32 96位唯一ID自动加密(无须任何软件)

2020-01-07 19:25发布

本帖最后由 Jacy 于 2014-11-19 15:09 编辑

规定三个月不发帖帐号被冻结,刚解冻,发个贴子。

大神跳过。

我们都知道,STM32/GD32在加密上都是可以使用96位唯一ID号进行加密,常规的做法都是回读UID号,再经过相应算法把结果写进芯片内部指定FLASH中,如我之前的帖子(        STM32/GD32 JLINK在线编程及唯一ID自动加密软件),做了一个上位机,使用JLINK读取ID号,再经过算法,把算法结果写到指定的FLASH地址,程序运行时,使用与上位机相同的算法,得出结果,与保存JLINK写进的FLASH地址的值进行对比,一致则运行,否则不继续运行。

在这个加密过程中,需要使用JLINK,需要电脑,需要上位机读取ID号再回写数据,当你只知道这种流程时,觉得没什么,但是下面这个方法,会让你知道,原来加密是如此的简单,具体步骤如下:

编译软件:KEIL

1、在指定FLASH地址中写入0xFFFFFFFF,以保证该地址内容在第一次烧写时为0xFFFFFFFF
const uint32_t Test_Addr __attribute__((at(0x08000800)))=0xFFFFFFFF;//在该地址写入0xFFFFFFFF
                                                                   //保证第一次上电能够直接写入数据

2、读取UID号,判断Test_Addr内容是否为0xFFFFFFFF,即判断程序是否第一次运行,如果是,那么,把ID号写入该地址,当然,要想达到更好的加密效果,自己可以做一些算法,把算法结果写到该地址。

3、当程序运行过一次后,即在指定地址已经写下了UID或者加密算法结果,那么,如果第二步中Test_Addr地址内容不为0xFFFFFFFF时,就判断Test_Addr地址内容是否为UID号(如果有使用算法,就判断算法结果是否与该地址内容一致),是则运行,否则不运行。

如果有人使用工具读出FLASH内容时,因为Test_Addr,已经在第一次上电已被写入自身UID号或者经过算法的结果,所以如果把读出的文件再烧到其他芯片,其他芯片会直接执行第3步,这样Test_Addr内容为上一个芯片的UID号或者算法结果,与烧进来的这个芯片不一致,所以就不运行。

到此为止,只需要三步,就可以实现程序自动加密,无须任何软件工具干预。

下面链接为测试工程,仅供参考。

STM32/GD32 UID自动加密
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
99条回答
pow270345524
1楼-- · 2020-01-14 20:02
来学习学习
pow270345524
2楼-- · 2020-01-14 21:35
谢谢楼主
sjh18256
3楼-- · 2020-01-15 02:36
顶一个,谢谢分享。
1a2b3c
4楼-- · 2020-01-15 07:48
 精彩回答 2  元偷偷看……
loveavr999
5楼-- · 2020-01-15 10:58
1a2b3c 发表于 2014-11-21 22:08
我在想,解密攻击者肯定首先会想到都是用唯一ID这个最基本的方式,所以会不会最简单的方法就是前面有个楼层 ...

完全正确

还有就是直接改id

如果id不是固化的,是可以通过某种手段修改,这个方法最简单
1a2b3c
6楼-- · 2020-01-15 11:20
loveavr999 发表于 2014-11-21 22:28
完全正确

还有就是直接改id

恩,改ID的话这个是属于芯片厂作假或者欺骗消费者,没有直接以工艺方"'雕刻"出来ID,

但是我说的那个方法,是采用ID加密的任何方法都没办法避免的啊
应该比反汇编跟踪if等等调价跳转还容易无数倍,但是前提是必须知道加密者使用ID作为种子,不过没有第三方的输入的话,这个也是99%的自我加密的唯一方法了

一周热门 更多>