#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())
{
/*
来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,
那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统
有时正常有时不正常,,呵呵,要查也不是那么容易的事了
*/
}
}
设计资源 培训 开发板 精华推荐
- 用于 Intel 486TM DX4TM Overdrive 微处理器的 LT1585CT-3.3 3.3V/4.6A 低压差稳压器的典型应用
- CW32-48F大学计划板
- MC34072DR2G高速低压比较器典型应用
- W487304AS1C1_车库板
- 具有 400mA 突发钳位、fSW = 1MHz 同步降压型稳压器的 LTC3621IMS8E-3.3 2.5V Vout 的典型应用
- DER-949 - 使用 InnoSwitch4-CZ PowiGaN 和 ClampZero 的 70 W 墙壁插座电源,具有 USB Type-C/A 端口
- 使用 Analog Devices 的 LT124XIS8 的参考设计
- 用于简单时钟振荡器的 NCP301LSN09T1 0.9V 电压检测器的典型应用
- 具有 SCSI-2 有源端接的 LT1086CT 低压差稳压器的典型应用
- MC34071ADR2G 高阻抗差分放大器的典型应用