MCU非唯一ID加密

以下介绍一种不增加成本,在软件方面下功夫,适用于防止其他人去读取代码,以下为具体代码:

#define GD32_ID_D 352520 // 任意的一个数
volatile u32 GD32_ID_addr[3]={0x1ffff7e8 - GD32_ID_D,0x1ffff7ec + GD32_ID_D,0x1ffff7f0 - GD32_ID_D};
/********************************************************************
函数功能:读出ID
入口参数:para
返 回:
备 注:
********************************************************************/
volatile void GD32_Read_ID(volatile u32 *para)
{
volatile u32 Addr; //防止代码反汇编,所以此地址需要重新计算出来

Addr = GD32_ID_addr[0] + GD32_ID_D;
para[0] = (vu32)(Addr);
Addr = GD32_ID_addr[1] - GD32_ID_D;
para[1] = (vu32)(Addr);
Addr = GD32_ID_addr[2] + GD32_ID_D;
para[2] = (vu32)(Addr);
}
/********************************************************************
函数功能:加密ID并保存 加密和解密算法要一样
入口参数:
返 回:
备 注:
********************************************************************/
void GD32_Encrypted_ID(void)
{
u32 GD32ID[4],dat;
GD32_Read_ID(GD32ID);

GD32ID[3] = GD32_ID_D;
dat = GD32ID[0] + GD32ID[1] - (GD32ID[2]/GD32ID[3]);

FLASH_Unlock();
FLASH_ErasePage (GD32FLASH_EN_ID_START_ADDR); //
FLASH_ProgramWord(GD32FLASH_EN_ID_START_ADDR,dat); // 保存这个数,写进32位
FLASH_Lock();
}

/********************************************************************
函数功能:比较加密ID,正确返回0
入口参数:
返 回:1:错误,0:正确
备 注:
********************************************************************/
u32 GD32_COMPARE_KEY_ID(void)
{
u32 GD32ID[4],dat,dat2;
STM32_Read_ID(GD32ID);

GD32ID[3] = GD32_ID_D;
dat = GD32ID[0] + GD32ID[1] - (GD32ID[2]/GD32ID[3]);

dat2 = (u32)(GD32FLASH_EN_ID_START_ADDR);

if(dat == dat2){return 0;}
else {return 1;}
}

//=代码加密================//
if(GD32_COMPARE_KEY_ID())
{
//代码出厂设置对代码加密
if(初始化)
{
STM32_Encrypted_ID(); // 加密ID
}

//=正常运行时=============//

//平时代码重上电进行ID校验,可设置校验不正确后让设备的部分功能不正常
if(GD32_COMPARE_KEY_ID())
{

}else{ //校验正确

}

以上代码可以参照设计成两个bin,第一个bin用于加密文件,第二个用于解密,即第二个下载后可以将第一个覆盖,以上仅供参考;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值