首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM8唯一ID号加密方法

STM8唯一ID号加密方法

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



        /////////////////////////////////////////////////////////////////////////
返回列表