基于唯一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出去! 这种方法已经很实用了.毕竟不是太专业的很难破. |