stm32加密方法:
flash加密
96位ID号加密
96位id号
id校验
反汇编
Id存到数组,程序执行之前与数组之中的ID比较,如果相同继续执行,不同则终止执行
加密步骤:
①设计一套加密算法,利用MCU内部的unique ID作为运算参数,计算结果通过第三方工具烧进MCU内部的FLASH的特定地址处。
②MCU软件采用相同的算法利用unique ID作为运算参数计算获得结果,然后读取FLASH中特定地址处的结果,两者进行对比,如果相同则继续执行,否则进入死循环。
③由于每一片MCU的unique ID都不一样,因此对于每一片MCU来说,软件利用加密算法计算得到的结果都不同。而由于盗版者不知道加密算法是什么,也不知道加密结果存放在FLASH的什么地方。因此软件从那个特定地址读到的数值始终是与当前计算的值不匹配,所以软件将始终进入死循环。
ID起始地址
加密程序
#include "sysid.h"
#include "stm32f10x.h"
#include "bsp_usart.h"
#define SYSID 0X1FFFF7E8 //stm32f1系列单片机id起始地址
//u8 idcode[]={0X31,0XFF,0XD4,0X5,0X42,0X48,0X30,0X39,0X27,0X52,0X22,0X57}; //原单片机id 12字节 96bit
u8 idcode[]={0X30,0XFE,0XD3,0X4,0X41,0X47,0X2F,0X38,0X26,0X51,0X21,0X56}; //原单片机id加密 12字节 96bit
uint8_t i = 0;
void Sysid_Read(void)
{
static u8 id[12]; //12*8 = 96
for(i =0;i < sizeof(id);i++) //读取ID
{
id[i] = *(u8*)(SYSID + i);
printf("%#X,",id[i]);
}
}
//系统ID校验
void SysidCheck(void)
{
for(i =0;i < 12;i++)
{
if(idcode[i] == *(u8*)(SYSID + i)) //比较单片机ID
{
printf("ok\r\n");
}
else
{
printf("eeor\r\n");
while(1) //ID校验失败死循环
{
;;
}
}
}
}
mian.c文章来源:https://www.toymoban.com/news/detail-589545.html
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "sysid.h"
uint16_t data = 65535;
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
USART_Config();
LED_GPIO_Config();
/* 发送一个字符串 */
Usart_SendString( DEBUG_USARTx,"这是一个串口中断接收回显实验\n");
//Usart_SendHalfWord(DEBUG_USARTx,data);
printf("欢迎使用野火STM32开发板\n\n\n\n");
printf("---------------------------\n");
Sysid_Read();//首次读取设备芯片ID打印显示之后再写入数组对比
SysidCheck();
while(1)
{
}
}
使用加密函数的时候将打印全部取消
加密在初始化中判断一次文章来源地址https://www.toymoban.com/news/detail-589545.html
到了这里,关于STM32芯片加密的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!