首页 > 编程语言 >如何对stm32的程序进行加密

如何对stm32的程序进行加密

时间:2024-11-09 16:46:33浏览次数:3  
标签:加密 RDP SRAM FLASH 程序 stm32 保护 HAL 级别

目的:保护单片机里的固件或代码不被读取出来

通过代码配置 STM32 的寄存器来实现读取保护(RDP)和调试接口锁定,可以采用以下方式:

1. 启用读取保护(RDP)

可以在代码中配置 RDP 级别。例如在 STM32F4 系列中,RDP 的设置存储在选项字节(Option Bytes)中。RDP 的配置可以通过 STM32 HAL 库的相关函数来设置。

以下是配置RDP Level 1的示例代码,使用 HAL 库来配置读取保护:

// 初始化 Flash,设置读取保护
void Set_ReadOut_Protection_Level(void) {
    // 启动 Flash 解锁过程
    HAL_FLASH_Unlock();

    // 启动 Option Byte 解锁过程
    HAL_FLASH_OB_Unlock();

    // 配置 Option Bytes,将 RDP 设置为 Level 1
    FLASH_OBProgramInitTypeDef ob_config;
    HAL_FLASHEx_OBGetConfig(&ob_config);
    
    ob_config.OptionType = OPTIONBYTE_RDP;
    ob_config.RDPLevel = OB_RDP_LEVEL_1;  // 设置 RDP Level 1 保护
    
    // 应用配置
    if (HAL_FLASHEx_OBProgram(&ob_config) == HAL_OK) {
        // 触发 Option Bytes 重装载
        HAL_FLASH_OB_Launch();
    }

    // 锁定 Option Byte 和 Flash 操作,防止进一步修改
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
}

注意:在程序中启用 RDP 保护后,调试接口会被限制,Flash 内容也无法被读取。降级 RDP 等级会清除 Flash 中的所有内容,因此在启用 RDP 前确保对固件进行充分测试。

  • RDP Level 0(默认):没有读取保护。
  • RDP Level 1:启用读取保护,禁止外部调试器和设备读取内部 Flash 内容。如果需要降级为 RDP Level 0,所有 Flash 数据会被擦除。
  • RDP Level 2:不可逆的保护级别。一旦启用,将无法再降级,完全禁止外部访问 Flash 内容。

2. 禁用调试接口(JTAG/SWD)

如果不需要调试接口,可以将其禁用以防止外部连接。这可以通过设置 GPIO 的复用功能来实现:

void Disable_Debug_Interface(void) 
{
    __HAL_RCC_APB2_FORCE_RESET();   // 重置调试接口
    __HAL_RCC_APB2_RELEASE_RESET();

    // 禁用调试功能,防止调试器连接
    __HAL_AFIO_REMAP_SWJ_NOJTAG();
}

这样可以在不使用调试接口的情况下进一步增强安全性,但调试接口禁用后,调试和固件下载将会受限。

3. 代码中设置敏感数据加密(一般情况下不需要使用)

假设需要对固件的某些敏感数据加密,可以在 STM32 内部解密使用。例如,可以使用 AES 进行对称加密。在 STM32 HAL 库中,有些芯片提供硬件加密模块(CRYP),可以利用它加密数据。

以下是简单的 AES 加密和解密示例:(需要根据实际情况修改)

#include "aes.h"

// 使用 AES-128 进行加密
void Encrypt_Data(uint8_t *plainText, uint8_t *cipherText, uint8_t *key) {
    // 假设使用 AES_ECB_Encrypt 实现 AES 加密
    AES_ECB_Encrypt(plainText, key, cipherText);
}

// 使用 AES-128 进行解密
void Decrypt_Data(uint8_t *cipherText, uint8_t *plainText, uint8_t *key) {
    // 假设使用 AES_ECB_Decrypt 实现 AES 解密
    AES_ECB_Decrypt(cipherText, key, plainText);
}

注意:AES 的加密模式和密钥管理都需要根据应用需求精心设计,确保密钥安全并有效抵御逆向工程。

4.知识补充

下面教程来自:51. 设置FLASH的读写保护及解除 — [野火]STM32 HAL库开发实战指南——基于野火F7与H7系列开发板 文档

RDP读保护级别区别

修改选项字节的RDP位的值可设置内部FLASH为以下保护级别:

0xAA:级别0,无保护

这是STM32的默认保护级别,它没有任何读保护,读取内部FLASH及“备份SRAM”的内容都没有任何限制。(注意这里说的“备份SRAM”是指STM32备份域的SRAM空间,不是指主SRAM,下同)

其它值:级别1,使能读保护

把RDP配置成除0xAA或0xCC外的任意数值, 都会使能级别1的读保护。在这种保护下, 若使用调试功能(使用下载器、仿真器)或者从内部SRAM自举时都不能对内部FLASH及备份SRAM作任何访问(读写、擦除都被禁止);而如果STM32是从内部FLASH自举时,它允许对内部FLASH及备份SRAM的任意访问。

也就是说,在级别1模式下,任何尝试从外部访问内部FLASH内容的操作都被禁止,例如无法通过下载器读取它的内容,或编写一个从内部SRAM启动的程序,若该程序读取内部FLASH,会被禁止。而如果是芯片自己访问内部FLASH,是完全没有问题的,例如前面的“读写内部FLASH”实验中的代码自己擦写内部FLASH空间的内容,即使处于级别1的读保护,也能正常擦写。

当芯片处于级别1的时候,可以把选项字节的RDP位重新设置为0xAA,恢复级别0。在恢复到级别0前,芯片会自动擦除内部FLASH及备份SRAM的内容,即降级后原内部FLASH的代码会丢失。在级别1时使用SRAM自举的程序也可以访问选项字节进行修改,所以如果原内部FLASH的代码没有解除读保护的操作时,可以给它加载一个SRAM自举的程序进行保护降级,后面我们将会进行这样的实验。

0xCC:级别2,禁止调试

把RDP配置成0xCC值时,会进入最高级别的读保护,且设置后无法再降级,它会永久禁止用于调试的JTAG接口(相当于熔断)。在该级别中,除了具有级别1的所有保护功能外,进一步禁止了从SRAM或系统存储器的自举(即平时使用的串口ISP下载功能也失效),JTAG调试相关的功能被禁止,选项字节也不能被修改。它仅支持从内部FLASH自举时对内部FLASH及SRAM的访问(读写、擦除)。

由于设置了级别2后无法降级,也无法通过JTAG、串口ISP等方式更新程序, 所以使用这个级别的保护时一般会在程序中预留“后门”以更新应用程序,若程序中没有预留后门, 芯片就无法再更新应用程序了。所谓的“后门”是一种IAP程序(In Application Program), 它通过某个通讯接口获取将要更新的程序内容,然后利用内部FLASH擦写操作把这些内容烧录到自己的内部FLASH中,实现应用程序的更新。

图 52‑1 不同级别下的访问限制

图 52‑2 不同级别间的状态转换

标签:加密,RDP,SRAM,FLASH,程序,stm32,保护,HAL,级别
From: https://blog.csdn.net/weixin_54762282/article/details/143606073

相关文章

  • 开发的药店药品小程序的设计与实现毕业设计源码
    博主介绍:✌专注于VUE,小程序,安卓,Java,python,物联网专业,有17年开发经验,长年从事毕业指导,项目实战✌选取一个适合的毕业设计题目很重要。✌关注✌私信我✌具体的问题,我会尽力帮助你。研究的背景:随着互联网技术的快速发展,药品购买已经成为人们日常生活中不可或缺的一部分。为......
  • 幼儿早教小程序软件设计与实现毕业设计源码
    博主介绍:✌专注于VUE,小程序,安卓,Java,python,物联网专业,有17年开发经验,长年从事毕业指导,项目实战✌选取一个适合的毕业设计题目很重要。✌关注✌私信我✌具体的问题,我会尽力帮助你。研究的背景:随着科技的发展和教育理念的进步,幼儿教育越来越受到重视。然而,传统的幼儿教育模......
  • 程序的内存模型
    内存分区模型C++程序在执行时,将内存大致分为4个区域。1.代码区:存放函数体的二进制代码,由操作系统进行管理。2.全局区:存放全局变量和静态变量以及常量。3.栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。4.堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统......
  • python+flask计算机毕业设计个人碳足迹系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于碳足迹的研究,现有研究多集中在宏观层面的碳排放总量分析以及企业层面的碳足迹管理等方面。例如,许多研究聚焦于国家或大型企业的碳......
  • python+flask计算机毕业设计好骑行打卡园app系统(程序+开题+论文)
    文件加密系统的设计与实现tp835本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容好骑行打卡园app系统毕业设计相关内容说明一、选题背景随着骑行运动在全球范围内的日益流行,与之相关的数字化服务......
  • 25-018、基于STM32单片机智能行李箱设计-LED-BELL-KEY-指纹-LCD1602-GSM-GPS+HX711称
    本设计由STM32F103C8T6单片机核心板电路+LED指示灯电路+蜂鸣器报警电路+按键电路+指纹电路+LCD1602液晶显示电路+GSM模块电路+GPS模块电路组成。1、如果指纹错误。LED灯会闪,同时蜂鸣器发出滴滴声(3声即可)2、如果指纹输入三次失败后,禁止再用指纹解锁,如果指纹打不开,可以输入按键......
  • 25-009、基于STM32单片机智能公交车自动报站系统RFID语音报站+液晶显示温度和烟雾值设
    本系统由STM32F103C8T6单片机核心板、2.4寸TFT彩屏、JR6001语音播报电路、ULN2003步进电机驱动电路、RC522-RFID刷卡识别电路、轻触开关检测电路、按键电路组成。【1】STM32单片机驱动2.4寸TFT彩屏实时显示所有站台信息、当前公交运行方向、当前到站的站点(并有图标显示);语音播......
  • 【51单片机】程序实验1——点亮LED
    由于博主还未学习数字电路和计算机组成原理,因此本系列先开展单片机软件编程的内容,硬件结构的内容简单带过,会考虑安排在后续学习计划中,编程入门部分不会深入涉及单片机电路结构原理。博主已有C语言基础,因此相关内容不会从零开始赘述主要参考学习资料:B站【普中官方】51单片......
  • RSA加密解密参考
    python写的RSA加密流程,做题时参考。代号是标准的代号。fromCrypto.Util.numberimport*importgmpy2importlibnum#importuuid#print(uuid.uuid4())#产生两个大素数p=libnum.generate_prime(1024)q=libnum.generate_prime(1024)#定义模数nn=p*qe=65537#公钥#欧......
  • springboot毕设 篮球网站 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的迅猛发展和互联网的广泛普及,体育爱好者获取篮球赛事信息的途径日益多样化。篮球作为世界上最受欢迎的运动之一,拥有庞大的粉丝群体。然......