打印
[STM8]

stm8 唯一ID号加密方法.思路

[复制链接]
3093|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feiqi1|  楼主 | 2016-12-10 19:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.读出ID号

#if defined(STM8S103)
     #define     ID_BaseAddress         (0x4865)
#else//  defined(STM8S105)
     #define     ID_BaseAddress         (0x48CD)
#endif
void GetUniqueID(unsigned char *p)
{
     unsigned char i;
     unsigned char *pIDStart=(unsigned char *)(ID_BaseAddress);   
     for(i=0;i!=12;i++){*p++=*pIDStart++;}
}



2.把读出的ID号生成其他数据。不一定就是12字节的!并保存在内部EEPROM。在这个模块准备2个函数.一个用于加密.一个用于解密

void StmWriteUniqueID(unsigned char Addr)
{
     unsigned char i;
     FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
     while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET)FLASH_Unlock(FLASH_MEMTYPE_DATA);
     unsigned char *pEE=(unsigned char *)(FLASH_DATA_START_PHYSICAL_ADDRESS+(u32)Addr);
     unsigned char *pIDStart=(unsigned char *)(ID_BaseAddress);
     for(i=0;i!=6;i++)//由12字节生成12*N个字节
    {
         *pEE++=第1种算法,商业原因.我的算法就不公开了.大家可以准备一个数组查表
        while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);  
         *pEE++=第2种算法,商业原因.我的算法就不公开了。大家可以准备一个数组查表
        while(FLASH_GetFlagStatus(FLASH_FLAG_EOP)== RESET);  
         。。。。
        第N种算法
    }              
}
//解密函数
unsigned char StmCheckUniqueID(unsigned char Addr)
3.主函数里面设置一个时间最好设置长一点。半个钟或其他,让人家难跟踪
    while(1)
     {
         其他任务...............
         /////////////////////////////////////////////////////////////////////////
          if((Flag&FLAG_CHECK_ID)==FLAG_CHECK_ID)
         {
             Flag&=~FLAG_CHECK_ID;
             if(StmCheckUniqueID(UniqueIDAddress)==1){IsIDCorrect=0x01;}//正确写入
            else{IsIDCorrect=0x00;}//错误写入      
         }        
         /////////////////////////////////////////////////////////////////////////
               其他任务...............
     }
         /////////////////////////////////////////////////////////////////////////
沙发
androidbus| | 2016-12-10 19:54 | 只看该作者
这样做还是能被**的。但对方已经很难跟踪了.

使用特权

评论回复
板凳
litengg| | 2016-12-10 19:57 | 只看该作者
如果**者对芯片熟悉.他会根据ID号的地址

使用特权

评论回复
地板
qiangweii| | 2016-12-10 20:02 | 只看该作者
芯片ID号的地址是固定的.找到对应的调用程序.加密时用到芯片ID号的地址。

使用特权

评论回复
5
shashaa| | 2016-12-10 20:04 | 只看该作者
不管加密还是解密时也有用到芯片ID号的地址。

使用特权

评论回复
6
xia00| | 2016-12-10 20:08 | 只看该作者
所以只有对方熟.是能很快跟踪到加密/解密程序.

使用特权

评论回复
7
hfdy01| | 2016-12-10 20:10 | 只看该作者
在解密程序入口就return出去!

使用特权

评论回复
8
CallReceiver| | 2016-12-10 20:15 | 只看该作者
楼主总结的这种方法已经很实用了.毕竟不是太专业的很难破.

使用特权

评论回复
9
mintspring| | 2016-12-10 20:20 | 只看该作者
人家直接把你这段代码去掉,就**了

使用特权

评论回复
10
lanjackg2003| | 2016-12-12 12:56 | 只看该作者
之前好像有个**有讨论过这个东西,比如加入CRC对整个code进行校验,防止别人串改。然后,还有串改之后的处理。比如,要不要随即删除code,等等。
加解密这种东西都是相扶生长,道高一尺,魔高一丈。
总结一句话,“防君子,无法防小人”。

使用特权

评论回复
11
xmshao| | 2016-12-12 13:58 | 只看该作者
谢谢分享思路。
需要的话 可以各自拓展。

使用特权

评论回复
12
lyn3210| | 2016-12-12 16:16 | 只看该作者
作为工程师,要做好价格战的准备。

使用特权

评论回复
13
meijc119| | 2018-6-6 13:19 | 只看该作者
提供单片机id加密安全性测试,加密芯片应用服务
id加密是比较好的程序加密方式,但有些开发人员做软加密过程太简单了,
**软加密难度非常低,提供id加密安全性测试。各种id加密方式咨询,QQ:9272078

id加密方法咨询,id加密程序测试

使用特权

评论回复
14
huangcunxiake| | 2018-6-6 22:06 | 只看该作者
能起到一定的防护作用就行。

使用特权

评论回复
15
meijc119| | 2020-8-18 15:30 | 只看该作者
三、利用id做软件加密
1,如果板子上有外部存储器,可以先编写一个程序,利用算法把id计算得到一些值存入外部存储器,然后再烧写真正的程序,真正的程序去校验外部存储器的数据是否合法即可

2,利用板子上按键组合,或是上电按住某些键,程序在这个时候利用算法把id计算得到一些值存入程序区(stm8为EE区),程序运行时去验证程序区数据是否正确

3,轩微编程器有软件加密的功能,编程器会读芯片id,根据算法直接改写缓冲区,达到软件加密的作用

4,读出的id通过一定算法,例如异或加上一个数,得到的数据存入flash(只运行一次,运行后标志位也存入flash),下次读到这个标志位,就不运行这个程序。//Q9272078

四、做软件加密时注意
1,不要在程序中直接出现id地址,例如STM32:1FFFF7E8 1FFFF7EC 1FFFF7F0   STM8: 0x4865~0x4870
2, 利用校验和或是crc对程序区进行校验,防止改程序

使用特权

评论回复
16
huahuagg| | 2020-8-18 22:36 | 只看该作者
世上没有完全之策

使用特权

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

本版积分规则

424

主题

1616

帖子

1

粉丝