×
单片机 > 单片机程序设计 > 详情

stm32芯片利用唯一ID对程序进行加密的一种方法

发布时间:2020-12-28 发布时间:
|

#define STM32_ID_D  352525   //任意的一个数 

//stm32芯片的ID地址,把地址减去一个数,避免汇编里面直接出现ID的地址,不然很容易暴露加密与ID号有关

volatile u32 STM32_ID_addr[3]={0x1ffff7e8 - STM32_ID_D,0x1ffff7ec + STM32_ID_D,0x1ffff7f0 - STM32_ID_D};

 

/********************************************************************

函数功能:读出stm32的ID,12字节

入口参数:p

返    回:

备    注:把ID的地址做一下处理,加密性更好

********************************************************************/

volatile void STM32_Read_ID(volatile u32 *p)

{

   volatile u32 Addr;

// 因为不想让程序在反汇编后直接找到这个地址,所以这个地址是运算出来的,

// 跟STM32_ID_addr反运算,当然了也可以用高级的算法,注意不能让编译器优化这个地址

   Addr = STM32_ID_addr[0] + STM32_ID_D;

   p[0] = *(vu32*)(Addr);

   Addr = STM32_ID_addr[1] - STM32_ID_D;

   p[1] = *(vu32*)(Addr);

   Addr = STM32_ID_addr[2] + STM32_ID_D;

   p[2] = *(vu32*)(Addr);

}

/********************************************************************

函数功能:加密ID并保存

入口参数:

返    回:

备    注:

********************************************************************/

void STM32_Encrypted_ID(void)

{

   u32 stm32ID[4],dat;   

   STM32_Read_ID(stm32ID);

   

   //这里可以用其它一些高级的算法,但解和加要一样

   //把ID号处理成一个32位数,也可以用自己的算法,处理成其他数据,多少位都行

   stm32ID[3] = STM32_ID_D;        

   dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]); //处理成一个32位数

   

   FLASH_Unlock();

   FLASH_ErasePage  (STM32FLASH_EN_ID_START_ADDR);     // 

   FLASH_ProgramWord(STM32FLASH_EN_ID_START_ADDR,dat); //保存这个数,写进32位 

   FLASH_Lock();

}

 

/********************************************************************

函数功能:比较加密ID,正确返回0

入口参数:

返    回:1:不正确,0:正确

备    注:

********************************************************************/

u32 STM32_CMP_Encrypted_ID(void)

{

   u32 stm32ID[4],dat,dat2;   

   STM32_Read_ID(stm32ID);

   

   // 这里可以用其它一些高级的算法,但解和加要一样   

   stm32ID[3] = STM32_ID_D;      

   dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]); 

   

   dat2 = *(u32*)(STM32FLASH_EN_ID_START_ADDR);  //读出加密时,保存在flash中的数

   

   if(dat == dat2){return 0;} // 相同

   else           {return 1;} // 不同

}

 

 

//好了,有了上面那个程序,那下再继续

 

 

//===================ID加密控制=====================================================================

   if(STM32_CMP_Encrypted_ID())

   {

      //量产时给一些条件,条件满足就对ID加密,然后把加密结果保存到flash中,把该程序与芯片的ID,唯一对应起来,加密完后,你也可以让它自宫。   

      if(XXXXXX)

      { 

         STM32_Encrypted_ID();   //加密ID

         自宫                    //即把加密这段代码从flash里面擦除,直接跳出去继续执行

      }

   }

 

 

//===================正常运行时==================================  

 

// 校验一下ID是否正确, 

   if(STM32_CMP_Encrypted_ID())

   {

    /*

来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,

    那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统

    有时正常有时不正常,,呵呵,要查也不是那么容易的事了

*/

   }

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP432学习笔记:ADC14