网站的建设心得,怎么做网站淘宝转换工具,wordpress 仿envato,沈阳市建设监理协会网站0、前言
STM32编译后的代码存在FLASH中#xff0c;通过外部工具可以读出来全部数据#xff0c;一旦硬件抄板一样#xff0c;再将FLASH数据全部拷贝至抄板单片机中#xff0c;既可以完全实现硬件和软件功能抄袭。因此#xff0c;需要对自己的应用程序加密#xff0c;即使…0、前言
STM32编译后的代码存在FLASH中通过外部工具可以读出来全部数据一旦硬件抄板一样再将FLASH数据全部拷贝至抄板单片机中既可以完全实现硬件和软件功能抄袭。因此需要对自己的应用程序加密即使被抄板和读取FLASH数据拷贝过后仍然无法执行相应的功能。【ps:没有解不开的单片机主要看解密的经济效益】
主要思路利用每个芯片的96位唯一ID进行一定的计算和单向加密得到唯一的应用AppKey并保存至FLASH运行APP时读取该FLASH位置的AppKey并与计算得到的AppKey比较是否相同如果相同则正常运行不相同则退出。
因此在正确运行APP之前需要保证FLASH保存有AppKey可以在设备出厂前提前通过代码方式写入FLASH再烧写正常的APP代码。为了减小代码烧写的工作量采用IAP的方式实现自动出厂配置方案包括三个工程BootLoaderEncryptAPP。三个工程在FLASH中的内存分配与OTA-IAP相同。
一、计算AppKey
step1 :为避免出现UID_BASE的明文在读取UID时对其地址进行一定的简单运算再读取UID。
#define ADDRSEED (0x20170620)
#define METHORDADDR (ADDRSEED^11)
#define METHORDEUID (ADDRSEED|0x12345678)volatile const uint32_t uidaddr[3] {UID_BASEMETHORDADDR,UID_BASE4-METHORDADDR,UID_BASE8METHORDADDR};//get uid, by calc uidbase
//uid: ptr, 96byte length
static void Getuid(volatile uint32_t *uid)
{volatile uint32_t addrtemp;addrtemp uidaddr[0] - METHORDADDR;uid[0] *(volatile uint32_t*)(addrtemp);addrtemp uidaddr[1] METHORDADDR;uid[1] *(volatile uint32_t*)(addrtemp);addrtemp uidaddr[2] - METHORDADDR;uid[2] *(volatile uint32_t*)(addrtemp);
}step2 :对UID进一步简单加密。
//encrypt uid
//euid: ptr, 96byte length
static void Encryptuid(volatile uint32_t *euid)
{uint32_t uid[3];Getuid(uid);euid[0] uid[0] METHORDEUID;euid[0] ^ ADDRSEED;euid[1] uid[1] METHORDEUID;euid[1] ^ ADDRSEED;euid[2] uid[2] METHORDEUID;euid[2] ^ ADDRSEED;
}step3 :对EncryptUID计算MD5计算128bit单向散列值。
//generate md5 by euid
//key: ptr, 16byte length
void GenerateMD5(uint8_t *md5)
{uint32_t *euid;Encryptuid(euid);MD5_Init(Context);MD5_Update(Context,(uint8_t *)euid,96);MD5_Final(Context,md5);
}step4 :根据FLASH页容量大小将MD5扩充至1024Byte采用随机数扩充。
//generate key
//key: ptr, 1024 length, md5 extend to 1024
void GenerateKey(uint8_t *key)
{uint16_t i,j;uint8_t md5val[16];GenerateMD5(md5val);j 0;for(i 0; i 1024; i){if(i%64 0){key[i] md5val[j];}else{srand1(HAL_GetTick());key[i] randr(0,0xFF);}}
}二、自动配置流程
Encrypt工程代码只在出厂时运行一次目的是利用UID产生AppKey并将其提前写入指定FLASH中因此该段代码执行一次后将擦除。可设置Encrypt在APPA区中运行利用IAP功能将APPB区的APP固件在执行完Encrypt固件后搬移至APPA区。
具体地出厂自动配置密钥流程如下
Step1上电启动单片机首先执行BootLoader程序。 Step2BootLoader读取Parameter参数区此时参数区设置为无升级任务BootLoader执行APPA区的代码进入 Step3 。存在升级任务时执行 Step6 Step7 。 Step3BootLoader跳转至APPA执行Encrypt代码根据UID计算AppKey执行 Step4 和 Step5 。 Step4将计算的AppKey存入Parameter区指定的位置并写入升级标志和APPB区相关固件参数。 Step5重启单片机进入BootLoader。 Step6清除升级任务标志。 Step7拷贝APPB代码至APPA区即擦除Encrypt代码最后执行重启进入 Step5 重启后运行真正的APP代码。
三、出厂固件合并
出厂前需要在STM32中烧写BootLoader、Encrypt和APP三份Hex固件加大了时间开销三份Hex固件存在FlASH的不同位置地址容易出错。因此可将三份Hex进行合并成一个Hex进行一次烧写按照自动配置流程完成加密和代码搬运工作。
BootLoader工程在程序一开始运行其地址和空间大小分配仍然按照0x08000000和20kB分配编译生成boot.hex。Encrypt工程和APP都在APPA区运行因此两者地址和空间大小分配为相同的0x08005000和50kB。APP.Hex只是保存在APPB区带加密执行完成后通知Bootloader进行搬移。
出厂固件按照boot.Hexencrypt.Hexapp.Hex的顺序合并打开Hex文件分别用后一个文件的全部内容替换前一个文件的最后一行保存为hex格式就可以。