stm32f芯片唯一ID的加密

// 把地址直接减去一个数是不要在程序中直接出现这个地址
#define STM32_ID_D  352525   // 任意的一个数 
volatile u32 STM32_ID_addr[3]={0x1ffff7e8 - STM32_ID_D,0x1ffff7ec + STM32_ID_D,0x1ffff7f0 - STM32_ID_D};
/********************************************************************
函数功能:读出ID
入口参数:p
返    回:
备    注:
********************************************************************/
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);
   // 这里可以用其它一些高级的算法,但解和加要一样
   stm32ID[3] = STM32_ID_D;        
   dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]);
   
   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);
   
   if(dat == dat2){return 0;} // 相同
   else           {return 1;} // 不同
}



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


//===================ID加密控制=====================================================================
  //   
   if(STM32_CMP_Encrypted_ID())
   {
      // 量产时给一些条件,条件满足就对ID加密,加密完后,你也可以让它自宫。
      if(XXXXXX)
      { 
         STM32_Encrypted_ID();   // 加密ID
         自宫
    }


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

// 校验一下ID是否正确, 
   if(STM32_CMP_Encrypted_ID())
   {
      来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,
    那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统
    有时正常有时不正常,,呵呵,要查也不是那么容易的事了

}

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值