OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 基于唯一ID号的STM32/STM8加密方法和思路

共9条 1/1 1 跳转至

基于唯一ID号的STM32/STM8加密方法和思路

助工
2019-12-13 22:50:37    评分

基于唯一ID号的STM32/STM8加密方法和思路,下面以STM8S103或105为例,希望对大家有用。 以免自己的知识产权被他人盗版了~  


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;}//错误写入       
        }        
        /////////////////////////////////////////////////////////////////////////
              其他任务...............
    }



        /////////////////////////////////////////////////////////////////////////
总结:
这样做还是能被破解的。但对方已经很难跟踪了.
如果破解者对芯片熟悉.他会根据ID号的地址!----毕竟芯片ID号的地址是固定的.找到对应的调用程序.加密时用到芯片ID号的地址。解密时也有用到芯片ID号的地址
所以只有对方熟.是能很快跟踪到加密/解密程序.而在解密程序入口就return出去!


这种方法已经很实用了.毕竟不是太专业的很难破.






关键词: 加密     解密     UID     ID     知识产权     盗版    

工程师
2019-12-13 23:06:39    评分
2楼

STM8在烧写程序时,用那种方法把KEY写到EEPROM比较好!


助工
2019-12-13 23:14:20    评分
3楼

回2楼:

是否可以准备两个程序?

一个用于生成加密后的数据并保存
另一个时包含解密函数的应用程序
这样第一个程序烧完后,等0.5s再烧主程序即可
(貌似以前还听说用串口之类的来完成类似操作)


助工
2019-12-13 23:24:08    评分
4楼

我的STM8系列中用到了自毁方式,不用两个程序就行,程序写入后调用该函数,前面部分是加密算法,执行后得到加密数据,后面是自毁代码,将加密部分改和本身写为NOP,最后是解密部分,就是除了第一次以外调用这个函数都是执行的解密部分,加密部分首次上电后n毫秒就不见了。


助工
2019-12-13 23:28:08    评分
5楼

基本没用! 

听说人家有种烧录器,你想要什么ID都可以做成一样.
所以,只要把你的代码和ID号读出来,他们照考进去就行了.


菜鸟
2020-05-20 08:55:27    评分
6楼

1,如果板子上有外部存储器,可以先编写一个程序,利用算法把id计算得到一些值存入外部存储器,然后再烧写真正的程序,真正的程序去校验外部存储器的数据是否合法即可

 

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

 

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

 

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

 

四、做软件加密时注意

1,不要在程序中直接出现id地址,例如STM32:1FFFF7E8 1FFFF7EC 1FFFF7F0   STM8: 0x4865~0x4870

2, 利用校验和或是crc对程序区进行校验,防止改程序



助工
2020-05-23 16:27:29    评分
7楼

这个解说很到位


助工
2020-05-26 22:47:59    评分
8楼

大概明白你的思路了


助工
2020-05-31 22:46:54    评分
9楼

思路这个东西很难学懂哦


共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]