【嵌入式】使用嵌入式芯片唯一ID进行程序加密实现

news2024/12/24 17:43:15

目录

一 背景说明

二 原理介绍

三 设计实现

四 参考资料


一 背景说明

        项目程序需要进行加密处理

        考虑利用嵌入式芯片的唯一UID,结合Flash读写来实现

        加密后的程序,可以使得从芯片Flash中读取出来的文件(一般为HEX格式)不能用于其他的芯片。

二 原理介绍

        【1】芯片唯一ID

        芯片提供了器件电子签名,即唯一身份标识。该信息存储在产品唯一身份标识寄存器中:

        UID寄存器描述如下:

        其中,UID1、UID2均为16位,UID3为32位,UID4为32位。        

        这样就可以从0x0x1FFFF7E8地址读取3个32bit的数据,获取它的唯一ID

        【2】程序加密逻辑说明

        在讲解简单的程序加密方法之前,先了解一下通常的MCU程序复制方法。

        通过烧写器(或者其他手段),将MCU内部程序存储区中的内容全部读出,就获取了烧写文件。如果烧写文件没有被加密,则可以直接将它烧写到别的MCU中运行,就完成了复制

        有没有办法可以使得对方即使获取了烧写文件,也不能直接烧写到别的MCU中运行呢?

        我们可以利用芯片的唯一ID来实现一种简单的程序加密方法。由于每个芯片的唯一ID是不同的,我们只要在程序中检查ID的合法性即可,主要的步骤如下:

        (i)程序首次运行时,读出芯片的唯一ID;

        (ii)将ID使用加密算法,计算出一个特殊值,写入到非易失存储区中(需要掉电能保存);

        (iii)以后每次运行时,读出芯片唯一ID,通过算法计算后,与非易失存储区中保存的值比对,如果一致,则正常运行;如果不对,停止运行。

        由于每个芯片中的ID是不同的,由加密算法算出的值也是不同的,所以,即使有人获取了我们的烧写文件,烧写到另一片MCU中,由于ID不同,最后也会比对出错,无法执行。

        

三 设计实现

        【1】编写获取并加密ID的接口:

#define UID_BASE (0x1FFFF7E8)

/**************************************************************************
* 函数名称: getEncryptID
* 功能描述: 获取并加密ID
**************************************************************************/
u32 getEncryptID(u32 *p_id)
{
    p_id[0] = *(vu32*)(UID_BASE);
    p_id[1] = *(vu32*)(UID_BASE + 4);
    p_id[2] = *(vu32*)(UID_BASE + 8);

    return ((p_id[0] >> 3) + (p_id[1] >> 1) + (p_id[2] >> 2));  //加密算法
}

        【2】编写判断加密ID的接口:

const u32 uid_save = 0xFFFFFFFF;    //CPUID保存

/**************************************************************************
* 函数名称: judgeEncryptID
* 功能描述: 判断加密ID
**************************************************************************/
u8 judgeEncryptID(void)
{
    u32 t_encid;
    u32 t_cpuid[3];
    u32 t_addr = 0;
    u32 t_flashid;
    
    t_encid = getEncryptID(t_cpuid);    //读本机UID
    
    t_addr = (u32)&uid_save;
    if(*(vu32 *)t_addr == 0xFFFFFFFF)   //第一次烧写将加密后的UID写入FLASH
    {
        FLASH_Unlock();
        FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
        FLASH_ProgramWord(t_addr, t_encid);
        FLASH_Lock();
    }
    t_flashid = *(vu32 *)t_addr;        //第一次上电存完了之后需要再读一遍
    
    return (t_flashid == t_encid);
}

        【3】主函数初始化中执行上面的判断:

void main(void)
{
    //...
    //判断加密UID(若不匹配,则报错并陷入死循环)
    if(! judgeEncryptID())
    {
        while(1);
    }

    while(1)
    {
        //主循环
    }
}

        【注意点】:

                (i)注意 const u32 uid_save 的类型定义,我使用的 keil 环境中不能加 volatile 修饰,如果加了会被定义到RAM区,而非Flash区,这样起不到加密的效果

                        如果用的是IAR环境,可能必须加 volatile 修饰,同时工程选项Options->Debugger->Download中选择: use flash loader。不这样做的后果是按速度优化编译,再判断加密值,不会重新读取加密值,导致判断出错

                (ii)注意 const u32 uid_save 的初始化值定义为全F,和擦除后的状态一致,所以程序中省略了擦除的操作,可以直接写入

                (iii)唯一ID存储地址 0x1FFFF7E8 应该尽量隐蔽,尽量避免在程序中直接出现该值

                更好的做法可以参考下面的方案:

/**************************************************************************
* 函数名称: getEncryptID
* 功能描述: 获取并加密ID
**************************************************************************/
u32 getEncryptID(u32 *p_id)
{
    volatile u32 UID_BASE;
    UID_BASE = 0x20000006;    //让逆向的人误以为是ram变量
    UID_BASE -= 0x800; 
    UID_BASE -= 0x1e;         //等于id的基地址0x1FFFF7E8
    
    p_id[0] = *(vu32*)(UID_BASE);
    p_id[1] = *(vu32*)(UID_BASE + 4);
    p_id[2] = *(vu32*)(UID_BASE + 8);

    return ((p_id[0] >> 3) + (p_id[1] >> 1) + (p_id[2] >> 2));  //加密算法
}

四 参考资料

        【1】STM32 的加密实现_stn32加密-CSDN博客

        【2】【STM32+cubemx】0025 HAL库开发:唯一ID获取和简单的程序加密_mcu唯一uid加密-CSDN博客

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

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

相关文章

C#WPF命令Command使用实例

本文实例演示C#WPF命令使用实例 定义: 命令(Command):命令表示一个任务单元,并且可跟踪该任务的状态,实际上是实现了ICommand接口的类。然而,命令实际上可以包括任务执行的逻辑代码,也可以不包括从而仅作为联系命令源与命令目标的媒介。比如,WPF 默认的接口实现类Ro…

el-collapse 嵌套中 el-checkbox作为标题,选中复选框与el-tree联动

<el-drawertitle"应用授权":visible.sync"menuDrawer"><el-collapse accordion style"padding: 15px"><el-collapse-item v-for"item in platList"><template slot"title"><el-checkbox v-model…

PostMan、ApiFox等工具Post请求中@RequestParam和@RequestBody的混合使用如何传参

方法签名 PostMapping("/mms/sendAudit")public R sendAudit(RequestParam("mmsId") Long mmsId,RequestParam("ecId") Long ecId,RequestBody(required false) SignMatchRule signMatchRule) {以ApiFox为例子 RequestParam的Params的参数正常…

基于51单片机0.001s精度秒表9.999s仿真设计(源码+仿真+原理图+PCB+报告+器件清单+讲解)

基于51单片机0.001s精度秒表9.999s仿真设计&#xff08;源码仿真原理图PCB报告器件清单讲解 讲解视频1 功能说明&#xff1a;2 仿真电路&#xff1a;3 原理图&#xff1a;4 PCB&#xff1a;5 程序&#xff1a;6 资料清单&&下载链接&#xff1a; 基于51单片机0.001s精度…

2023年【煤气】报名考试及煤气免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 煤气报名考试根据新煤气考试大纲要求&#xff0c;安全生产模拟考试一点通将煤气模拟考试试题进行汇编&#xff0c;组成一套煤气全真模拟考试试题&#xff0c;学员可通过煤气免费试题全真模拟&#xff0c;进行煤气自测…

什么是图像翻译

域(Domain)&#xff1a;一系列具有相同风格的图像集合。 图像翻译(Image Translation)&#xff1a;从一张图像到另一张图像的变换&#xff0c;也是域迁移。 &#xff08;风格迁移、图像上色、图像分割...&#xff09; 图像翻译GAN模型分类 根据作用区域&#xff1a;…

Qt学习_13_可执行文件.exe添加图标/logo

本文简单记录一下如何给Qt生成的exe&#xff08;可执行&#xff09;文件&#xff0c;添加图标/logo 第一步 去选一个你喜欢的图标&#xff0c;下载下来 ByteDance IconPark (oceanengine.com) iconfont-阿里巴巴矢量图标库 第二步 用第一步下载的图片&#xff0c;在线生成一…

python 绘制 graphviz

dot 绘图 python 绘制 graphviz 环境 上一节中在本地安装了 graphviz&#xff0c; python 要想使用还需安装 pip 包 pip install graphvizpython 使用 dot Digraph(comment"My Graph") # 添加一些节点 dot.node("A", "Node A") dot.node(&q…

杭州亚运会开幕式惊现数字人火炬手,动捕设备迸发动画制作新动能

在第十九届亚运会开幕式上&#xff0c;首次出现了“数字人”点火形式&#xff0c;打造了亚运史上首个数字点火仪式&#xff0c;这种点火方式是一种颠覆性创作的同时&#xff0c;这也是裸眼3D技术、现实增强和AI人工智能技术的完美结合。 此次数字火炬手的背后是采用了动捕设备&…

九、完整打印立方体贴图的一个面

从上一节可以看出&#xff0c;打印出来的图片是有背景色的&#xff0c;也就是摄像机位置不对。那应该放在哪里呢&#xff1f; 答案是&#xff1a;给定投影矩阵的 fov 为 90 度以捕捉整个面&#xff0c;且摄像机距离该面的距离是立方体边长的一半。 即、 这里我用的立方体是长度…

it运维监控运维方案主要应用在哪些场景

公司越来越依赖IT基础设施。为了保证业务的高效运行&#xff0c;IT运维监控已经成为公司不可或缺的一部分。本文将详细介绍IT运维监控方案&#xff0c;以及如何优化运维效率&#xff0c;并将其应用于各种场景。 IT运维监控方案 监视系统 监控系统是IT运维监控的基础&#xff…

代码随想录 Day6 哈希 LeetcodeT454 四数之和II T383赎金信 T15 三数之和 T18 四数之和

本文代码思路来源于: 代码随想录 前言 希望大家在刷这部分题的时候先熟悉熟悉哈希结构的基本常用api,比较方便理解. LeetCode T454 四数之和 题目链接:454. 四数相加 II - 力扣&#xff08;LeetCode&#xff09; 题目思路 暴力解法仍然是遍历四个数组解决此题, 哈希的思路有…

干货分享 | TSMaster—CCP/XCP标定功能详解

众所周知&#xff0c;CCP是CAN Calibration Protocol CAN 标定协议的缩写&#xff0c;XCP是Universal Measurement and Calibration Protocol 通用测量与标定协议的缩写。二者都普遍使用于开发、测试和车载标定&#xff0c;由ASAM&#xff08;自动化和测量系统标准化协会&#…

k8s--storageClass自动创建PV

文章目录 一、storageClass自动创建PV1.1 安装NFS1.2 创建nfs storageClass1.3 测试自动创建pv 一、storageClass自动创建PV 这里使用NFS实现 1.1 安装NFS 安装nfs-server&#xff1a; sh nfs_install.sh /mnt/data03 10.60.41.0/24nfs_install.sh #!/bin/bash### How to i…

STM32cubeIDE 更改Repository folder

使用STM32CubeIDE时&#xff0c;会调用STM32CubeMX&#xff0c;但是这两个软件下载的更新包都放在C:/user/目录下面&#xff0c;而且文件很大&#xff0c;用不了多久就会把C盘填满&#xff0c;所以刚开始安装的时候就要把更新目录更换掉。具体更换方法如下&#xff1a; Window…

为您的视频编辑应用添加动力,美摄视频剪辑SDK

在当今的数字化时代&#xff0c;视频已经成为了最受欢迎的媒体形式之一。无论是社交媒体平台&#xff0c;还是在线教学站点&#xff0c;甚至是商业广告&#xff0c;都离不开视频的支持。而在这个领域&#xff0c;美摄视频剪辑SDK无疑是您的最佳选择。它不仅功能强大&#xff0c…

基于SSM的学生作业管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

sqlserver创建新用户并指定数据库

1、打开MSSM&#xff0c;安全性-->登录名-->右键-->新建登录名 2、按照下面6个步骤操作 3、用户映射页面&#xff0c;勾选对应数据库&#xff0c;数据库角色&#xff0c;增加db_owner的勾选 4、退出账号&#xff0c;使用新建的账号进行登录 5、对刚才授权的数据库&…

河北吉力宝智能科技鞋:引领健康产业全面升级和互联网转型

随着时代的变迁和人们对健康关注的不断升级&#xff0c;健康产业正迎来一次全面的升级浪潮。在这个浪潮中&#xff0c;河北吉力宝智能科技鞋生态战略正全面启动&#xff0c;为消费者带来高品质智能康养产品和全新的生活方式。 河北吉力宝智能科技鞋有限公司是一家致力于高品质智…

vue点击按钮收缩菜单

问题描述 VUE菜单有一个BUG&#xff0c;当我们点击其它按钮或者首页的时候&#xff0c;已经展示的一级菜单是不会自动收缩的。这个问题也导致很多开发者把一级菜单都换成了二级菜单。 错误展示 错误的效果请看下图。 解决方法 1、寻找菜单文件 因为我使用的是ruoyi的前端框…