- // 把地址直接减去一个数是不要在程序中直接出现这个地址
- #define STM32_ID_D 352525 // 任意的一个数
- volatile u32 STM32_ID_addr[3]={0x1ffff7e8 - STM32_ID_D,0x1ffff7ec + STM32_ID_D,0x1ffff7f0 - STM32_ID_D};
- /********************************************************************
- 函数功能:读出ID
- 入口参数:p
- 返 回:
- 备 注:
- ********************************************************************/
- 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);
- // 这里可以用其它一些高级的算法,但解和加要一样
- stm32ID[3] = STM32_ID_D;
- dat = stm32ID[0] + stm32ID[1] - (stm32ID[2]/stm32ID[3]);
-
- 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);
-
- if(dat == dat2){return 0;} // 相同
- else {return 1;} // 不同
- }
- 好了,有了上面那个程序,那下再继续
- //===================ID加密控制=====================================================================
- //
- if(STM32_CMP_Encrypted_ID())
- {
- // 量产时给一些条件,条件满足就对ID加密,加密完后,你也可以让它自宫。
- if(XXXXXX)
- {
- STM32_Encrypted_ID(); // 加密ID
- 自宫
- }
- //===================正常运行时==================================
- // 校验一下ID是否正确,
- if(STM32_CMP_Encrypted_ID())
- {
- 来到这里嘛,当然不正确咯,你别让程序死在这哦,太明显了,很容易找到是你干的,
- 那么,一个系统肯定有一些参数才能运行的,你可以改变一些参数,这可以让系统
- 有时正常有时不正常,,呵呵,要查也不是那么容易的事了
- }
复制代码
0
|
|
|
|
本帖最后由 jfm365 于 2015-12-10 10:50 编辑
MEC98SP采用保密性能极高的智能卡芯片内核作为平台,用户可以将自己产品嵌入式软件中的部分关键算法、代码及数据,采用Keil C编译器编译后通过我司提供的开发套件将目标代码下载到SMEC98SP加密芯片上运行。由于SMEC98SP本身就是具有特定数据处理能力的MCU,产品加密系统使用SMEC98SP来实现整个嵌入式系统的部分核心算法、功能和关键数据存储来真真实现方案的保密及防破解。
特性:
l 采用高安全智能卡芯片内核
l 芯片内置DES/TDES硬件协处理器
l 内置CRC16硬件协处理器
l 内置真随机数发生器,符合FIPS140-2
l 提供硬件唯一芯片序列号(12Bytes)
l 增强80X51内核,30MHz内部主频,4T指令周期
l 提供24Kbytes程序空间
l 提供8 Kbytes Flash数据空间,256Bytes/Page,支持页擦字节写
l 支持高速I2C协议,最大支持3.4Mbit/s
l 工作电压:1.62V ~ 5.5V
l 工作温度:-25℃ ~ 85℃
懂行的人才知道这才是真正的高安全、高性能、高性价比 加密芯片!
QQ: 43678472(注明加密芯片)
|
|
|
|
|
1,不要在程序中直接出现id地址,例如1FFFF7E8 1FFFF7EC 1FFFF7F0 2, 利用校验和或是crc对程序区进行校验,防止改程序
|
|
|
|
|