找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2102|回复: 1
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:346927 发表于 2021-5-27 15:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  #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())
     {
      /*
      来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,
      那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统
      有时正常有时不正常,,呵呵,要查也不是那么容易的事了
      */
     }
  }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:608322 发表于 2021-8-31 15:38 | 只看该作者
设计好的程序,如果担心被破解,最好id软件加密先给我免费破破看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表