#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())
{
/*
來到這里嘛,當然不正確咯,你別讓程序死在這哦,太明顯了,很容易找到是你干的,
那么,一個系統肯定有一些參數才能運行的,你可以改變一些參數,這可以讓系統
有時正常有時不正常,,呵呵,要查也不是那么容易的事了
*/
}
}
|