STM32的FLASH ID加密

#define FLASH_ID_OFFSET 30000    //任意定义一个数

//把地址直接减去或者加上一个数是不要程序中直接出现这个地址

volatile u32 Flash_ID_addr[3]={

0x1FFFF7E8 - FLASH_ID_OFFSET,

0x1FFFF7EC + FLASH_ID_OFFSET,

0x1FFFF7F0 - FLASH_ID_OFFSET

};

/**读取STM32 FLASH ID**/

void Flash_Read_ID(u32 *p)
{
  u32 Addr;
  //因为不想让程序在反汇编后直接找到这个地址,所以这个地址是运算出来

//的,跟STM_ID_addr反运算,当然也可以用其他高级算法,不能让编译器

//优化这个地址

Addr = Flash_ID_addr[0] + FLASH_ID_OFFSET;
  p[0] = *(u32*)(Addr);

Addr = Flash_ID_addr[1] - FLASH_ID_OFFSET;
  p[1] = *(u32*)(Addr);

Addr = Flash_ID_addr[2] + FLASH_ID_OFFSET;
  p[2] = *(u32*)(Addr);
}

/*加密ID并保存*/
void Encrypted_ID(void)
{
  u32 FlashID[3],data;
  Flash_Read_ID(FlashID);
  //这里可以用其他一些高级算法,但减和加要一样
  
  data=(FlashID[0]|FlashID[1]|FlashID[2])&(~FlashID[1])|(~FlashID[2]);

FLASH_Unlock();
  FLASH_ErasePage(FLSAH_EN_ID_START_ADDR);
  FLASH_ProgramWord(FLSAH_EN_ID_START_ADDR,dat);//保存这个数
  FLASH_Lock();
}

/*比较加密ID,正确返回0 不正确返回1*/
u32 CMP_Encrypted_ID(void)
{
  u32 FlashID[3],data1,dat2;
  Flash_Read_ID(FlashID);
  //这里可以用其他高级算法,但减和加要一样
  data1=(FlashID[0]|FlashID[1]|FlashID[2])&(~FlashID[1])|(~FlashID[2]);

data2 = *(u32*)(FLSAH_EN_ID_START_ADDR);

if(data1==data2) //相同
    return 0;
  else         //不同
    return 1;
}

//ID加密控制
if(CMP_Encrypted_ID())
{
  //生产时给一些条件,条件满足就对ID加密,加密完后,也可以让它自宫
  if(****)
  {
    Encrypted_ID();
    .....
    自宫
  }
}

//校验ID是否正确
if(CMP_Encrypted_ID())
{
  程序来到这里当然不正确了,不要让程序死在这里。一个系统肯定有

  一些参数才能运行的,你可以改变一些参数,可以让系统有时正常有

时不正常。

}

上一篇:CentOS7 安装 Mysql 服务


下一篇:scjp考试准备 - 4 - 关于数组