H7-TOOL脱机烧录的UID加密操作方法,支持一键生成目标板C代码,方便大家轻松操作(2024-08-20,已发布)

news2024/11/13 9:33:07

UID加密使用比较方便,对应的C代码模板已经做好,使用TOOL上位机生成后,直接复制粘贴到自己的工程即可使用。返回1表示解密成功,返回0表示失败。
 

【UID加密原理】

1、烧录器在烧录芯片时,按照指定的算法将UID码编码为一个加密数据,并写入FLASH指定区域。
2、用户的程序必须增加一段UID校验程序比较UID和加密数据是否满足算法规则,不满足则停止运行或呈现随机错误。
3、用户程序只要进行了UID加密,就可以防止初级盗版者直接复制程序到其他芯片。
4、用户可以自行修改加密算法,以增加保密性。

点击上位机这个按钮可以查看了解:


【UID界面功能介绍】


1、算法公式

当前做了三个
(1)encrypt_001.lua,  这个最安全,对UID做了各种加密,当前支持的一键C文件生成也是基于这个制作,大家配置的时候要选择这个选项
(2)encrypt_copy_uid.lua, 这个最简单,就是单纯的读取UID,未对UID做加密处理。
(3)encrypt_crc32_uid.lua, 这个是对UID做了简单的CRC32方式加密。

本贴的实现是基于第1中UID加密,实际应用也推荐用这种。


2、参数名A1 -A16,每个参数值范围1 - 16
 

这里默认即可,一般无需修改


3、选择算法随机数

这个的对应关系是这样的,  一个选项对应一个:


4、算法函数用的常量

这里是8bit的hex,推荐配置8个值即可,  每个值范围0x00 - 0xFF


5、随机数

随机数1,随机数2,随机数3,随机数4设置都是一样的

以随机数1为例进行说明,可以设置跟随那个分区一起写入

这里的分区是跟前面这里分区对应的:

长度推荐就设置为默认的4,而写入地址,可以根据自己的需要设置。


6、UID加密启用

可以设置跟随那个分区一起写入,与前面第5步的含义一样

长度推荐就设置为默认的4,而写入地址,可以根据自己的需要设置。


【实际操作举例】

使用H7-TOOL给我们的STM32H7开发板加密为例进行说明

1、选择脱机烧录的芯片型号,优先配置UID,生成UID加密算法的C实现


 

2、点击这里生成C算法:

#include <stdio.h>
#include <stdlib.h>
#include "stdint.h"
#include <string.h>
 
/*
*********************************************************************************************************
*                                           定义
*********************************************************************************************************
*/
typedef struct {
    uint32_t enable;  // 使能位
    uint32_t address; // 存储地址
    uint32_t length;  // 随机数长度
} RNG_TAB_t;
 
uint8_t UidArray[16] = {0};
uint8_t EncryptUidArray[16] = {0};
uint8_t ReEncryptUidArray[16] = {0};
 
/*
*********************************************************************************************************
*                                 通过上位机更新,与上位机保持一致
*********************************************************************************************************
*/
 
/*--PC_DEFINE_BEGIN--*/
 
#define A1   1
#define A2   2
#define A3   3
#define A4   4
#define A5   5
#define A6   6
#define A7   7
#define A8   8
#define A9   9
#define A10   10
#define A11   11
#define A12   12
#define A13   13
#define A14   14
#define A15   15
#define A16   16
 
#define ENCRYPT_ADDR     0x08100000  //UID加密数据存储地址
#define ENCRYPT_LEN      8 //加密结果长度
 
#define ENCRYPT_RND_IDX  0   //加密用初值选择 0:固定数,1-4是随机数
#define RNG_CONST_DATA = "11 22 33 44 55 66 77 88"   //常量值
#define RNG_TAB_t RNG_TAB = {     //使能位, 存储地址, 随机数长度
    {0, 0x08000000, 4},
    {0, 0x08000000, 4},
    {0, 0x08000000, 4},
    {0, 0x08000000, 4}
};
 
#define UID_ADDR  0x1FF1E800
#define UID_BYTES 12
 
 
/*--PC_DEFINE_END--*/
 
/*
*********************************************************************************************************
*                                             UID相关API
*********************************************************************************************************
*/
static uint8_t stringToHexArray(const char *str, uint8_t *hexArray) 
{
    uint32_t  index = 0;
 
    while (*str != '\0') 
        {
        while (*str == ' ') 
        {
            str++;
        }
                 
        if (*str == '\0') 
        {
            break;
        }
 
        sscanf(str, "%2hhx", &hexArray[index++]);
 
        str += 2;
    }
         
        return index;
}
 
/*
*********************************************************************************************************
*        函 数 名: encrypt
*        功能说明: 计算UID加密
*        形    参: ---
*        返 回 值: 无
*********************************************************************************************************
*/
static void encrypt(const uint8_t* _uid, const uint8_t* _rnd, uint8_t _rndsize, uint8_t* out) 
{
    uint8_t uid[16] = {0};
    uint8_t rnd[16] = {0};
    int i, j;
 
    if (_uid == NULL) 
        {
        return;
    }
 
    for (i = 0; i < UID_BYTES; i++) 
        {
        uid[i] = _uid[i];
    }
 
    j = 0;
    for (i = UID_BYTES; i < 16; i++) 
        {
        uid[i] = uid[j++];
    }
 
    if (_rnd != NULL) 
        {
        for (i = 0; i < _rndsize; i++) 
                {
            rnd[i] = _rnd[i];
        }
    }
 
    out[0] = uid[A1 - 1] ^ (uid[A2 - 1] >> 1) ^ (uid[A3 - 1] >> 1);
    out[1] = uid[A4 - 1] ^ (uid[A5 - 1] >> 0) ^ (uid[A6 - 1] >> 1);
    out[2] = uid[A7 - 1] ^ (uid[A8 - 1] >> 1) ^ (uid[A9 - 1] >> 3);
    out[3] = uid[A10 - 1] ^ (uid[A11 - 1] >> 2) ^ (uid[A12 - 1] >> 0);
 
    out[4] = uid[A1 - 1] ^ (uid[A10 - 1] << 1) ^ (uid[A2 - 1] >> 0);
    out[5] = uid[A4 - 1] ^ (uid[A7 - 1] << 1) ^ (uid[A5 - 1] << 2);
    out[6] = uid[A7 - 1] ^ (uid[A4 - 1] >> 0) ^ (uid[A8 - 1] << 0);
    out[7] = uid[A10 - 1] ^ (uid[A1 - 1] >> 2) ^ (uid[A11 - 1] << 1);
 
    out[8] = uid[A2 - 1] ^ (uid[A10 - 1] >> 1);
    out[9] = uid[A3 - 1] ^ (uid[A7 - 1] << 1);
    out[10] = uid[A6 - 1] ^ (uid[A4 - 1] << 1);
    out[11] = uid[A9 - 1] ^ (uid[A1 - 1] >> 2);
 
    out[12] = uid[A1 - 1] ^ (uid[A2 - 1] >> 1);
    out[13] = uid[A3 - 1] ^ (uid[A5 - 1] >> 0);
    out[14] = uid[A6 - 1] ^ (uid[A8 - 1] << 2);
    out[15] = uid[A9 - 1] ^ (uid[A11 - 1] >> 0);
 
    for (i = 0; i < 16; i++) 
        {
        out[i] ^= rnd[i % _rndsize];
    }
}
 
/*
*********************************************************************************************************
*        函 数 名: UidCompare
*        功能说明: 比较加密的UID
*        形    参: 1表示成功,0表示失败
*        返 回 值: 反
*********************************************************************************************************
*/
uint8_t UidCompare(void)
{
    uint8_t tempbuf[16] = {0};
    uint16_t i;
        uint8_t size;
        uint8_t index;        
 
    for(i = 0; i < UID_BYTES; i++)
    {
        UidArray[i] = *(volatile uint8_t*)(UID_ADDR+i);
    }
         
    for(i = 0; i < ENCRYPT_LEN; i++)
    {
        EncryptUidArray[i] = *(volatile uint8_t*)(ENCRYPT_ADDR + i);
    }        
 
    if(ENCRYPT_RND_IDX == 0)
    {
        size = stringToHexArray((const char *)RNG_CONST_DATA, tempbuf);
 
        encrypt(UidArray, tempbuf, size, ReEncryptUidArray);
    }
    else
    {
                index = (uint8_t)(ENCRYPT_RND_IDX - 1);
        for(i = 0; i < RNG_TAB[index].length; i++)
        {
            tempbuf[i] = *((uint8_t *)(uintptr_t)(RNG_TAB[index].address + i));
        }
        encrypt(UidArray, tempbuf, RNG_TAB[index].length, ReEncryptUidArray);        
    }
 
    for (i = 0; i < ENCRYPT_LEN; i++) 
    {
        if (ReEncryptUidArray[i] != EncryptUidArray[i]) 
        {
            return 0;
        }
    }
 
    return 1;
}

3、用户仅需调用UidCompare()即可,返回值是1表示验证成功,返回值是0表示验证失败

int main() 
{
        uint8_t re;
 
        re = UidCompare();
         
        if(re == 1)
        {
                printf("验证成功\r\n");
                 
        }
        else
        {
                printf("验证失败\r\n");                
        }
 
    while(1);
}

4、修改一个bug的地方

特别注意,当前2.26版本生成的C算法这两个写错了:

#define RNG_CONST_DATA = "11 22 33 44 55 66 77 88"   //常量值
#define RNG_TAB_t RNG_TAB = {     //使能位, 存储地址, 随机数长度
    {0, 0x08000000, 4},
    {0, 0x08000000, 4},
    {0, 0x08000000, 4},
    {0, 0x08000000, 4}
};

修改为如下即可:

uint8_t RNG_CONST_DATA[] = "11 22 33 44 55 66 77 88";   //常量值
RNG_TAB_t RNG_TAB[] = {     //使能位, 存储地址, 随机数长度
    {0, 0x08000000, 4},
    {0, 0x08000000, 4},
    {0, 0x08000000, 4},
    {0, 0x08000000, 4}
};

然后编译生成hex文件。添加到TOOL上位机进行下载:

为了方便查看验证是否正常,我们这里简单做了个串口答应,成了就提示验证成功:


5、实际验证是没问题的,完整的测试例子如下,方便大家参考:

H7-TOOL UID加密.7z (1.28MB)

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

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

相关文章

Spring Core常见错误及解决方案

Spring Core常见错误及解决方案 一些Spring Core错误及解决方案&#xff0c;出自极客时间傅健老师《Spring编程常见错误50例》 https://time.geekbang.org/column/intro/100077001 Bean定义 隐式扫描不到Bean的定义 如果我们定义这样的目录结构&#xff0c;实际上访问对应接…

图书馆客流统计系统实时精准统计,管理者能及时了解馆内人数情况

在信息化时代&#xff0c;图书馆作为知识的宝库&#xff0c;其日常管理和服务水平直接影响着读者的体验和满意度。为了更好地管理图书馆的空间资源&#xff0c;并为读者提供更优质的阅读环境&#xff0c;许多图书馆开始引入先进的客流统计系统。 一、客流统计系统统计精准 1. 高…

线下参会报名丨智源数据与行业应用 Workshop 第二期

目前&#xff0c;大模型在数据基建和行业落地仍存在不少挑战。北京智源人工智能研究院深耕数据工具研发与数据平台建设&#xff0c;并持续推动模型与垂直场景的应用&#xff0c;旨在通过举办“数据与行业应用系列Workshop”活动&#xff0c;广泛链接生态伙伴&#xff0c;共同探…

NC设计LFU缓存结构

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 一个缓存结构…

基于pygame的雷电战机小游戏

import pygame import sys import random# 初始化 Pygame pygame.init()# 设置窗口尺寸 WIDTH, HEIGHT 800, 600 screen pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("雷电战机")# 设置颜色 BLACK (0, 0, 0) RED (255, 0, 0) GREEN (…

波束管理简介

波束管理简介 3GPP中&#xff0c;波束管理被定义为一组物理层或接入网高层的过程&#xff0c;用于获取和维护一组用于上行和下行传输或接收的gNB和UE波束。波束管理大致由&#xff1a;波束扫描&#xff0c;波束测量&#xff0c;波束判决&#xff0c;上报和指示&#xff0c;波束…

点亮星星的世界:当小孩得了自闭症该怎么办

在这个丰富多彩的世界里&#xff0c;每一个孩子都是独一无二的天使。然而&#xff0c;有一些孩子却仿佛被困在了自己的小小世界中&#xff0c;难以与外界正常交流和互动。他们是自闭症儿童&#xff0c;他们的世界充满了挑战和困惑&#xff0c;也让家长们陷入了深深的担忧和焦虑…

深入解析并发与并行:如何利用住宅代理加速网页抓取

引言 什么是并发执行&#xff1f;基本单位是什么&#xff1f; 什么是并行执行&#xff1f;和并发执行的区别是什么&#xff1f; 导致网页抓取缓慢的原因有哪些&#xff1f; 使用python进行网页抓取的并发性 并行性如何加速网页抓取 总结 引言 在当今数据驱动的世界中&am…

泛微Ecology9建模问题及解决办法记录(一)(按钮变灰、批量修改、导出、显示转换等)

1、为管理员和普通用户分别设置显示模版,其中普通用户的显示模版,“编辑‘’按钮置灰,不允许使用的方法 在用户显示模版页面中插入E9代码块如下: <script type="text/javascript"> /* * 请在下面编写JS代码 */ ModeForm.controlBtnDisabled(true); </…

“我王多鱼投了!”疯狂烧钱的AI大模型公司如何赚钱?

AI大模型到底有多烧钱&#xff1f; 或许最有发言权的就是OpenAI了&#xff0c;2022年其亏损大约翻了一番&#xff0c;达到约5.4亿美元。据悉&#xff0c;Altman曾私下建议&#xff0c;OpenAI可能会在未来几年尝试筹集多达1000亿美元的资金&#xff0c;以实现其开发足够先进的通…

Thinkphp6 反序列化漏洞分析

本文来自无问社区&#xff0c;更多实战内容可前往查看http://wwlib.cn/index.php/artread/artid/10431.html 版本&#xff1a;Thinkphp6&PHP7.3.4 TP 环境搭建利用 composer 命令进行&#xff0c;同时本次分析在 windows 环境下进行 composer create-project topthink/t…

佰朔资本:上市有什么好处?为什么有公司不愿上市?

公司上市或许带来的长处有&#xff1a; 1、融资途径拓宽。上市为公司供给了更广大的融资途径&#xff0c;通过发行股票公司可以敏捷筹集到大量资金&#xff0c;用于扩大生产规模、研制新产品、拓宽商场等。与银行贷款、发行债券等传统融资方法比较&#xff0c;上市融资不仅本钱…

【目标检测】YOLOV1

You Only Look Once: Unified, Real-Time Object Detection 1、核心思想 将整张图片作为网络的输入&#xff0c;直接在输出层对 BBox 的位置和类别进行回归。 Resize image&#xff1a;将输入图片resize到448x448。Run ConvNet&#xff1a;使用CNN提取特征&#xff0c;FC层输出…

Python神经网络在基因组学中的应用

在基因组学研究中&#xff0c;神经网络作为一种强大的工具&#xff0c;被广泛应用于基因型和表型之间的关联分析。通过构建神经网络模型&#xff0c;我们可以更好地理解遗传变异是如何影响个体的性状表现。本文将详细介绍如何使用Python实现这一过程&#xff0c;利用已知群体的…

一文读懂大语言模型:基础概念篇

在当今AI时代&#xff0c;大语言模型正以前所未有的速度重塑我们的世界。作为NLP领域的明星&#xff0c;它们不仅理解语言&#xff0c;更创造语言&#xff0c;开启了智能交互的新纪元。 本文将介绍着重介绍大模型的概念&#xff0c;帮助大家简单了解其技术原理、发展历程&#…

C++学习笔记----5、重用之设计(二)---- 为最优化重用结构化你的代码(1)

一定要在所有的层面在设计的一开始就考虑重用&#xff0c;也就是说&#xff0c;从一个独立的函数到一个类&#xff0c;直到整个库与框架。我们以后就把这些统称为部件。下面的策略会帮助你正确地组织代码。记住所有的这些策略关注的是你的代码的的通用目的。设计可重用代码第二…

2024上半年营业收入同比增长17%,一图看懂亚信安全2024半年报

2024上半年营业收入同比增长17%&#xff0c;贯彻健康经营&#xff0c;业绩企稳向好&#xff01; 云网安筑基 AI智绘未来 | 一图看懂亚信安全2024半年报

SAP DRC 交易与报表合规化

交易与报表合规化- SAP Document and Reporting Compliance(DRC) SAP DRC通过嵌入到端到端业务流程的源系统中的国家和地区特定内容&#xff0c;保证全球处理合规&#xff1b;利用统一的解决方案管理全球电子发票和法定报表&#xff0c;从而优化合规性&#xff0c;提高效率并提…

无线麦克风什么牌子最好,无线直播麦克风十大名牌推荐

​在数字化飞速发展的今天&#xff0c;无线领夹麦克风已经成为自媒体创作者、直播主播和专业录音师的重要工具。它们不仅小巧便携、操作简便&#xff0c;还具有出色的录音质量&#xff0c;极大地提升了音频录制的效率和质量。无论是户外探险的Vlog拍摄&#xff0c;还是室内直播…

基于Linux系统和ncurses库的贪吃蛇小游戏

目录 前言 一、地图&#xff0c;蛇身&#xff0c;食物设计 二、蛇和食物的初始化 食物 蛇 三、添加和删除蛇身节点 四、main函数和蛇运行方向线程 五、地图刷新线程 最终源码 前言 ncurses库是什么我并没有深入了解&#xff0c;本文的重点也不是ncurses的使用&#xff…