打印

STM32F103系列芯片怎么加密?

[复制链接]
16907|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 forrest11 于 2012-11-9 19:24 编辑

我想用STM32F103RC或C8,但不知芯片保密怎么处理。芯片有唯一ID号吗?如果没有,怎么保护程序呢?
沙发
forrest11|  楼主 | 2012-11-9 19:09 | 只看该作者
怎么没有人回答啊?顶一下。

使用特权

评论回复
板凳
forrest11|  楼主 | 2012-11-13 00:52 | 只看该作者
没有人回答我,自己找:
STM32F10X内含96位的唯一的只读性序列号Unique device ID register (96 bits)
这样做有戏。
难怪STM32F103火。

使用特权

评论回复
地板
cy757| | 2012-11-13 10:50 | 只看该作者
我是这样做的。
STM32产品出厂时:
预留串口或其他端口通过内部的软件读出96位的唯一ID,在外面通过软件对96位的ID加密(如AES)后得到一串数据写入STM32的flash或者Eeprom中。
STM32启动时读取flash或者Eeprom中的加密数据,然后解密看看是否和本身的96位的ID一致,如果不一致就不执行重要的程序。

使用特权

评论回复
5
forrest11|  楼主 | 2012-11-13 12:09 | 只看该作者
我是这样做的。
STM32产品出厂时:
预留串口或其他端口通过内部的软件读出96位的唯一ID,在外面通过软件对96位的ID加密(如AES)后得到一串数据写入STM32的flash或者Eeprom中。
STM32启动时读取flash或者Eeprom中的 ...
cy757 发表于 2012-11-13 10:50

这个办法就多了,你这个办法可以的,但这样的风险是大部分程序不变,只有部分data区变化,这样只要改动启动后读取加密数据部分的跳转命令就行了。这个风险很大的,能防菜鸟小偷,不能防稍微厉害的大盗。
要想学加密,还得老老实实向菜农学习两招。

使用特权

评论回复
6
cuilincuilin| | 2013-10-10 14:46 | 只看该作者
这个ID号是在手册里哪里提到的呢?能告诉我吗?

使用特权

评论回复
7
wenshijian| | 2013-10-10 15:16 | 只看该作者
给你一个连接,看看你有什么想法,其实这个序列号理论上还是有很大作用的。
https://bbs.21ic.com/icview-624463-1-1.html

使用特权

评论回复
8
香水城| | 2013-10-10 17:13 | 只看该作者
cuilincuilin 发表于 2013-10-10 14:46
这个ID号是在手册里哪里提到的呢?能告诉我吗?

在芯片的参考手册(Reference Manual)中有描述,该款芯片的ChipID从哪个地址可以读出。

置于哪个章节,请自己发挥search功能。

使用特权

评论回复
9
meijc119| | 2019-9-9 12:04 | 只看该作者
//STM32F10X软加密方法及实例代码

#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x0800F000)
#define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x0800F004)
volatile uint32 gU32IdAdressVar;//这里一定要定义此变量,否则会被优化器优化掉
void Stm32F10xEncryptDemo(void)
{
        uint32 *u32IdAddress;
  uint32 u32EorRslt, u32AddRslt;
        #IF 0
        //如果直接赋值0X1FFFF7E8,则程序编译结果里会有0X1FFFF7E8,这样**人员会很轻松
        //的找到这个内容,然后非常容易进行修改,去掉软加密
        u32IdAddress = (uint32*)0x1ffff7e8;
        #else
        //千万别显式的读取ID,即要把0X1FFFF7E8运算成隐式的,例如此例中0x1FFFF7E8 = (0x455873a * 4) + 0xEA9DB00;
        //这样,别人就算**出了你的程序,也查找不到0X1FFFF7E8,这样就不能轻易的软解密,这样处理后如果要软解密,
        //一定要反汇编出来进行复杂逆向分析,难度极大,代价极高,很难搞定软加密了,达到保护产品的目的。
        gU32IdAdressVar = 0x455873a;
        gU32IdAdressVar <<= 2;//0x11561CE8
        u32IdAddress = (uint32*)(gU32IdAdressVar + 0xEA9DB00);//0x1ffff7e8
        #endif
        //读取单片机的ID,并进行运算,具体算法可以自己定,这里只用到简单的异或及和运算
        u32EorRslt = (*u32IdAddress) ^ (*(u32IdAddress + 1)) ^ (*(u32IdAddress + 2));
        u32AddRslt = (*u32IdAddress) + (*(u32IdAddress + 1)) + (*(u32IdAddress + 2));
        //进行对比,如果运算结果与FLASH保存的结果不一样,说明非法,运行错误代码
        if(u32EorRslt != *((uint32*)ID_ENCRYPT_EOR_RESULT_ADDRESS))
        {
                while(1);//异或算法结果不正确,进行错误分支
        }
        if(u32AddRslt != *((uint32*)ID_ENCRYPT_ADD_RESULT_ADDRESS))
        {
                while(1);//和算法结果不正确,进行错误分支
        }
}
//QQ9272078

使用特权

评论回复
10
meijc119| | 2020-4-15 09:57 | 只看该作者
不要在程序中直接出现id地址,**的人只要把0x1ffff7e8改成0x8000020,并且0x8000020程序区域填上母片的id,不管你的算法有多复杂,这时你的程序就被**了,改这种软件加密一分钟就改好了

使用特权

评论回复
11
Globalizex| | 2020-4-15 23:08 | 只看该作者
外挂一个IDKT-AES 加密芯片,AES256算法,2KB EEPROM,并且支持硬件唯一性

使用特权

评论回复
12
meijc119| | 2021-8-30 11:58 | 只看该作者
如果你觉得你的id软件加密做得还可以,我可以免费帮你**一下试试,扣5225016

使用特权

评论回复
13
呐咯密密| | 2021-8-30 12:06 | 只看该作者
ID的加密不是很可靠,如果产品需要更好的保护,还是用其他加密方式,现在很多烧录器都带加密功能

使用特权

评论回复
14
sadicy| | 2021-8-30 14:00 | 只看该作者
之前单位多加密,是外置一个FLASH,
程序从外置的flash启动,
初始化的时候,
读flashID,做个简单的算法,比如+2之类的。
然后对比结果。
这样做了之后
就是一旦换了flash再下程序,程序判断过不去,就跑不起来了

使用特权

评论回复
15
Charlotte夏| | 2021-8-30 21:57 | 只看该作者
读取MCU的UID,然后MD5加密之类的,再写到MCU中,这都可以的,毕竟UID是唯一的

使用特权

评论回复
16
Emily999| | 2021-8-30 21:58 | 只看该作者
可以考虑JLINK烧录,带SN号的,而且烧录之后可以房读取,这样**你的固件就很难喽

使用特权

评论回复
17
Carmen7| | 2021-8-30 21:59 | 只看该作者
哇,一看是2012年的帖子,说真的,那时候回答你可能回答不了,现在加密的方法就多了,可以自己随机几个字节写在MCU的flash中,然后程序中有解码程序,先读再解,对了在运行正常程序,这样就挺好

使用特权

评论回复
18
Betty996| | 2021-8-30 22:01 | 只看该作者
通过对UID获取后进行加密存在flash中,每次启动程序进行读UID,然后解密,再与flash对比,成功就可以运行正确程序

使用特权

评论回复
19
meijc119| | 2021-10-20 15:23 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:个人博客:http://blog.**/forrest11

37

主题

1093

帖子

14

粉丝