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())
{
  程序來到這里當然不正確了,不要讓程序死在這里。一個系統肯定有

  一些參數才能運行的,你可以改變一些參數,可以讓系統有時正常有

  時不正常。

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM