STM32 应用程序加密的一种设计方案

0、前言

STM32编译后的代码存在FLASH中,通过外部工具可以读出来全部数据,一旦硬件抄板一样,再将FLASH数据全部拷贝至抄板单片机中,既可以完全实现硬件和软件功能抄袭。因此,需要对自己的应用程序加密,即使被抄板和读取FLASH数据,拷贝过后仍然无法执行相应的功能。【ps:没有解不开的单片机,主要看解密的经济效益】

主要思路:利用每个芯片的96位唯一ID,进行一定的计算和单向加密,得到唯一的应用AppKey并保存至FLASH,运行APP时读取该FLASH位置的AppKey,并与计算得到的AppKey比较是否相同,如果相同则正常运行,不相同则退出。

因此,在正确运行APP之前,需要保证FLASH保存有AppKey,可以在设备出厂前提前通过代码方式写入FLASH,再烧写正常的APP代码。为了减小代码烧写的工作量,采用IAP的方式实现自动出厂配置,方案包括三个工程:BootLoader,Encrypt,APP。三个工程在FLASH中的内存分配与OTA-IAP相同。

一、计算AppKey

step1 :为避免出现UID_BASE的明文,在读取UID时,对其地址进行一定的简单运算,再读取UID。

#define    ADDRSEED      (0x20170620)
#define    METHORDADDR   (ADDRSEED^1+1)
#define    METHORDEUID   (ADDRSEED|0x12345678)volatile const uint32_t uidaddr[3] = {UID_BASE+METHORDADDR,UID_BASE+4-METHORDADDR,UID_BASE+8+METHORDADDR};//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程序。
Step2:BootLoader读取Parameter参数区,此时参数区设置为无升级任务,BootLoader执行APPA区的代码,进入 Step3 。存在升级任务时,执行 Step6Step7
Step3:BootLoader跳转至APPA,执行Encrypt代码,根据UID计算AppKey,执行 Step4Step5
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.Hex,encrypt.Hex,app.Hex的顺序合并,打开Hex文件,分别用后一个文件的全部内容替换前一个文件的最后一行,保存为hex格式就可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用HTML5实现刮刮卡效果

http://www.helloweba.com/view-blog-270.html转载于:https://www.cnblogs.com/wln3344/p/4618226.html

两块网卡实现多台机器共享上网

组建局域网内部网络&#xff0c;遇到的问题&#xff1a;购买电信的宽带&#xff0c;多人拨号肯定是不行的(貌似同时超过4台机器拨一个号就自动被断开网络了)。 使用一些软件共享上网觉得既然是人家开发的软件&#xff0c;不太放心里面加了什么代码会监控这边的网络&#xff0c;…

mount: unknown filesystem type 'LVM2_member'解决方案

From: http://hi.baidu.com/williwill/item/7a36fdd92340b2ee55347f13 系统启动到request_module: runaway loop modprobe binfmt-464c挂起 利用U盘系统&#xff0c;挂载硬盘出现&#xff1a;mount: unknown filesystem type LVM2_member 解决办法&#xff1a; 需要安装 lvm2:…

计算机专业英语的题目,计算机专业英语题目

比较题1.SRAM and DRAM*RAM is short for random access memory.Static RAM(SRAM) keeps data in the main memory,without frequent refreshing,for as long as power is supplied to the cicuit. SRAM is very fast but it is much more expensive than DRAM and takes more …

HC-05蓝牙模块的配置和使用方法

一、说明 蓝牙传输模块一般通过串口进行通信&#xff0c;即RS232&#xff08;设备1&#xff09;<—>蓝牙模块<—>蓝牙模块<—>RS232&#xff08;设备2&#xff09;。因此&#xff0c;使用蓝牙模块需要配置的参数有串口通信参数和蓝牙通信参数。HC05蓝牙模块…

Anton Chuvakin:关于日志管理产品的十个注意事项

SecurityWarrior Consulting的Anton Chuvakin博士在去年底的时候写过一篇文章&#xff1a;Top 10 Things Your Log Management Vendor Won’t Tell You&#xff0c;很有意思。实际上&#xff0c;他提醒用户在选择日志审计产品&#xff0c;尤其是用它来做内控的目的的时候应该注…

zlib库compress和uncompress函数的使用方法

From: http://blog.csdn.net/turingo/article/details/8148264 zlib(http://zlib.net/)提供了简洁高效的In-Memory数据压缩和解压缩系列API函数&#xff0c;很多应用都会用到这个库&#xff0c;其中compress和uncompress函数是最基本也是最常用的。不过很奇怪的是&#xff0c;…

Python字符串的encode与decode研究心得乱码问题解决方法

Python字符串的encode与decode研究心得乱码问题解决方法 为什么Python使用过程中会出现各式各样的乱码问题&#xff0c;明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式&#xff1f; 为什么会报错“UnicodeEncodeError: ascii codec cant encode characters in posi…

嵌入式开发中关键字_IO 和 volatile的用法

一、描述 在开发嵌入式过程中&#xff0c;常会看到_IO 修饰符&#xff0c;这两个修饰符是在Core_cm3.h中被重定义&#xff1a; /* IO definitions (access restrictions to peripheral registers) */ #ifdef __cplusplus#define __I volatile /*!< defi…

table简单排序

早些时候基于jQuery写的一个table排序&#xff0c;暂时只支持简单的数据类型排序。以后有时间改写成原生js的 直接上代码了&#xff0c;写的不好&#xff0c;纯属记录 tabletable 浏览评论主题作者最后评论 共有精品数200个10023232北京的天气真是干燥&#xff0c;让人觉得不舒…

html循环c for,两层c:forEach循环嵌套

jsp中两级菜单如何用c:forEach输出items要被循环的信息否无begin开始的元素(0第一个元素&#xff0c;1第二个元素)否0end最后一个元素(0第一个元素&#xff0c;1第二个元素)否Last elementstep每一次迭代的步长否1var代表当前条目的变量名称否无varStatus代表循环状态的变量名称…

Gvim 字体大小设置和FencView插件安装

1. GVim更改字体及大小 在命令模式下输入: set guifontlucida\ console:h14 其中&#xff0c;字体名有空格的话&#xff0c;要转义下. 2. FencView插件(Ver4.8)下载位置&#xff1a; http://vim.sourceforge.net/scripts/download_script.php?src_id17381 解压出来后&am…

【原创】俄罗斯方块Tetris version2.1 by yuanfeng1129

#include<windows.h>#include<time.h>#include<stdlib.h>#include"resource.h"#define W 14 //游戏区域宽度#define H 26 //游戏区域高度#define W1 6 //右边状态栏宽度#define BSIZE 25 //游戏方格边长#define Y1 6 //放置照片的纵坐标#define Y2…

怎没用计算机算e的,小E教你们如何用计算机算虚数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先打开计算器电源(ON)注&#xff1a;()代表注释 ( )代表第二功能键1.shift2.(Pol)3.14.shift5.(,)6.07.)8.9.狂按分数线&#xff0c;直到按到顶不动为止(似乎是6个)10.按 (显示Syntax ERROR 不要管它)&#xff0c; AC&#xff0c…

物联网IoT接入技术分类以及华为OC平台特性

一、主流物联网接入技术应用场景划分 4G/5GLTE-V&#xff1a; 传输速率>10Mbps&#xff1b;功耗较高 应用业务&#xff1a;车联网、视频监控、智能机器eMTC/GPRS 传输速率<1Mbps&#xff1b;成本较低&#xff0c;功耗较低 应用业务&#xff1a;穿戴、车辆调度、电子广…

AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17

AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17 手上板子原来自带的是2.4.19的内核&#xff0c; 打算移植新的2.6的内核&#xff0c;从网上下了2.6.17的kernel&#xff0c;下载地址为&#xff1a;http://www.kernel.org/pub/linux/kernel/v2.6/修改PATH环境变量或者Mak…