[KungFu8位 MCU]

基于Unique ID的单片机程序加密系统 单片机唯一ID程序加密

[复制链接]
836|11
手机看帖
扫描二维码
随时随地手机跟帖
HuangHongLun|  楼主 | 2019-2-26 10:43 | 显示全部楼层 |阅读模式
单片机一般作为一个产品的逻辑中心,工作时一直在进行着逻辑判断与执行操作,相当于人类的大脑。单片机可以通过修改程序来控制外围电路的工作状态,从而改变产品的功能。如果一个产品具有单片机,那么它往往是这个产品的核心。而开发一款功能复杂且成熟的产品所需要的费用不低并且研发周期较长,一些个人为了某些原因,为了快速仿造竞争对手的产品,一般就原样照抄对方的硬件电路,但由于单片机内部有针对产品功能单独设计的程序,不能直接再市面上购买,所以就只能想办法通过特殊的解密方法将单片机内部的程序读取出来。将解密后读取出来的程序烧录在新的芯片中从而完成产品功能的抄袭。通过专用的设备和工具,利用单片机芯片设计上的硬件漏洞或软件缺陷,通过多种技术手段获取单片机内程序这叫做单片机解密或单片机**。以不正当方式获得其他公司或个人的商业秘密,是一种常见的不正当竞争行为。单片机加密技术是对产品知识产权保护的一种技术手段。
HuangHongLun|  楼主 | 2019-2-26 10:43 | 显示全部楼层
Unique ID加密原理

当前市面上的单片机资源中大多数具有Unique ID,即每一个芯片内部均具有唯一的芯片ID号。不同的芯片厂家实现该功能的方式不同,一些用生产线的流水号,另一些是用晶圆的特性来生成ID。 利用Unique ID加密的方法流程如下:

单片机一般作为一个产品的逻辑中心,工作时一直在进行着逻辑判断与执行操作,相当于人类的大脑。单片机可以通过修改程序来控制外围电路的工作状态,从而改变产品的功能。如果一个产品具有单片机,那么它往往是这个产品的核心。而开发一款功能复杂且成熟的产品所需要的费用不低并且研发周期较长,一些个人为了某些原因,为了快速仿造竞争对手的产品,一般就原样照抄对方的硬件电路,但由于单片机内部有针对产品功能单独设计的程序,不能直接再市面上购买,所以就只能想办法通过特殊的解密方法将单片机内部的程序读取出来。将解密后读取出来的程序烧录在新的芯片中从而完成产品功能的抄袭。通过专用的设备和工具,利用单片机芯片设计上的硬件漏洞或软件缺陷,通过多种技术手段获取单片机内程序这叫做单片机解密或单片机**。以不正当方式获得其他公司或个人的商业秘密,是一种常见的不正当竞争行为。单片机加密技术是对产品知识产权保护的一种技术手段。

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:44 | 显示全部楼层
Unique ID加密原理
当前市面上的单片机资源中大多数具有Unique ID,即每一个芯片内部均具有唯一的芯片ID号。不同的芯片厂家实现该功能的方式不同,一些用生产线的流水号,另一些是用晶圆的特性来生成ID。 利用Unique ID加密的方法流程如下:

A. 将单片机烧录程序A后上电运行程序,完成加密操作。

B. 将单片机烧录程序最终程序B,该程序包含ID识别部分。 加密流程图如下:

329385c74a7f15276c.png

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:44 | 显示全部楼层
加密算法

为了防止**者通过仿真的方式找到芯片ID信息,一般不宜直接存放ID号。而是经过相应的加密处理后写入存储器中。校验方式也不宜采用常见、简单的校验规则,应尽可能采用某些特殊的检验方式,使**者不能迅速确定校验算法。
加密的算法类似数学公式 Y=F(X)
其中Y为加密以后的数据,X为原始数据,而F则为加密算法。
加密算法有很多种,本实验中采用简单的位移后取反的方式来进行数据加密。

466505c74a80c83002.png

最后将加密的数据存入EEPROM中,由于芯片的ID厂家不允许更改,这大大增加了**难度,加强了对产品的保护。

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:45 | 显示全部楼层
详细设计过程
使用Unique ID对单片机程序加密功能的实现需要以下几点功能:
① 实验板1用于对程序加密实验。
② 将从实验板1中读取到的数据烧录到实验板2中,通过实验板上的LED状态验证程序加密是否成功。
基于Unique ID的单片机程序加密分为2个程序,这2个程序是不同的。
程序A:用于读取芯片硬件ID并进行算法处理,将处理后的数据保存到EEPROM中。
程序B:用于将EEPROM中的数据读取出来并使用与加密相同的算法进行解密获得芯片ID,将解密后获得的ID与芯片本身的ID进行比较。比较结果只有2种可能,即为相同与不同,程序根据结果从而执行不同的操作如图所示;
327835c74a82e3bb79.png

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:45 | 显示全部楼层
实验中使用STM8S单片机作为硬件载体

软件设计

系统初始化函数选择了内部16MHz时钟源,1分频后系统总线时钟频率为16MHz。
将GPIO与EEPROM擦写均进行了初始化配置。 函数代码如下:

void SystemInit(void)
{   
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //总时钟源 使用内部时钟源1分频 16M/1分频 =16MHz
    Gpio_Init();                                   //单片机系统GPIO初始化
    FLASH_DeInit();                                //存储数据的EEPROM初始化
    FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);     //默认的EEPROM写入时间
}

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:46 | 显示全部楼层
LED驱动程序

根据硬件的电路原理图可以看出,LED连接到PE5引脚。采用灌电流驱动,当引脚为低电平时LED点亮,引脚为高电平时LED熄灭。上电后LED默认为熄灭状态,所以引脚初始化配置为高速输出模式高电平。函数代码如下:

/*描述:MCU外围GPIO初始化*/
/*输入:无*/
void Gpio_Init(vod)
{   
    //功能引脚上电初始化,引脚初始化状态根据外部功能而定义//
    GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); //LED
}

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:46 | 显示全部楼层
LED的状态采用宏定义方式,直接控制IO管脚电平状态。 操作代码如下:
/*LED操作宏定义*/
#define LED_ON GPIO_WriteLow(GPIOE, GPIO_PIN_5); //点亮LED
#define LED_OFF GPIO_WriteHigh(GPIOE, GPIO_PIN_5); //熄灭LED

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:47 | 显示全部楼层
获取Unique ID程序

STM8S105K4T6数据手册显示该芯片具有96bit Unique ID,96bit/8=12byte。存放ID的起始地址为0x48CD,从该地址读取12次,将芯片ID获取并存入数组。 函数代码如下:

/*描述:获取芯片ID*/
/*输入:存放芯片ID的数组*/
/*输出:无*/
/*参数:无*/
void Get_ChipID(unsigned char *p)//Get chip ID
{   
  unsigned char i=0; for(i=0; i<12; i++) //读取12次
    {
        *p = *(u8*)(0X48CD+i); //将数据读出后进行存放
        p++;
    }
}

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:47 | 显示全部楼层
获取Unique ID程序

STM8S105K4T6数据手册显示该芯片具有96bit Unique ID,96bit/8=12byte。存放ID的起始地址为0x48CD,从该地址读取12次,将芯片ID获取并存入数组。
函数代码如下:

/*描述:获取芯片ID*/
/*输入:存放芯片ID的数组*/
/*输出:无*/
/*参数:无*/
void Get_ChipID(unsigned char *p)//Get chip ID
{   
    unsigned char i=0;   
    for(i=0; i<12; i++) //读取12次
    {
        *p = *(u8*)(0X48CD+i); //将数据读出后进行存放
        p++;
    }
}

使用特权

评论回复
HuangHongLun|  楼主 | 2019-2-26 10:48 | 显示全部楼层
加密算法程序

编码函数执行对Unique ID进行数据算法处理。实验中采用的算法为将存放Unique ID的数组进行左移三个元素后逐位取反。将编码后的数据存入另一个数组。
编码函数代码如下:

/*描述:对芯片ID进行编码处理*/
/*输入:存放芯片ID的数组;存放芯片ID编码后的数组*/
/*输出:无*/ /*参数:对输入数组左移三次后逐位取反*/
void Encode(unsigned char *DataIn,unsigned char *DataOut)//对数据进行编码加密
{
    unsigned char i;//数组数据左移次数 unsigned char j;//数据位移临时局部变量
    unsigned char DataSwap;//搬运数据用的临时变量
    unsigned char TempData[12];//数据处理交换变量数组
    for(i=0;i<12;i++)//数据数组交换
    {
        TempData[i] = *DataIn; DataIn++;
    }
    for(i=0;i<3;i++)
    {
        //数组元素左移操作
        DataSwap = TempData[0];
        for(j=0;j<11;j++) //数组左移搬运
        {
            TempData[j] = TempData[j+1]; } TempData[11] = DataSwap;
        }
    for(i=0;i<12;i++)
    {
        TempData[i] = ~ TempData[i] ; //对数组数据进行按位取反
        *DataOut = TempData[i] ; DataOut++;
    }
}

使用特权

评论回复
vcvfvgvb| | 2019-3-29 16:27 | 显示全部楼层
现在的嵌入式产品越来越关注保密性了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

438

帖子

2

粉丝