STM32加密的核心就是给代码加上“三把锁”UID唯一ID锁、Flash读保护RDP锁和算法验证锁。我会为你详细说明从硬件、软件到具体操作的全过程。 准备工作️ 硬件准备STM32开发板入门级且支持加密的Nucleo系列就非常适合比如Nucleo-F103RB或Nucleo-G0/G4系列集成的ST-Link调试器方便连接电脑。USB数据线用于连接开发板和电脑。 软件准备集成开发环境 (IDE)STM32CubeIDEST官方免费、一体化或Keil MDK业界标准社区版免费。个人推荐新手直接使用STM32CubeIDE。烧录与配置工具STM32CubeProgrammer这是ST官方用来烧录和配置芯片选项字节如RDP的必备工具。串口调试助手用于查看程序输出推荐使用免费的VOFA或SSCOM。 关键概念速览在动手前先快速理解三个核心概念UID (唯一ID)每颗STM32芯片出厂时内置的96位唯一ID不可修改是软件验证的基石。RDP (读保护)芯片的硬件“防盗门”通过选项字节 (Option Bytes)配置。分为三个级别Level 0 (无保护)默认状态调试口可随意读写Flash。Level 1 (使能读保护)量产标准配置。禁止调试口访问Flash解除保护将触发全片擦除。Level 2 (禁止调试)芯片调试接口永久关闭不可逆除非极端高安全需求一般不用。️ 分步实操给STM32加上三把锁第一把锁硬件读保护 (RDP) - 防止固件被直接读出打开并连接启动STM32CubeProgrammer。在右侧选择ST-LINK并点击Connect。进入选项字节配置点击软件顶部的Option Bytes标签页。点击Read按钮软件会读出并显示当前芯片的配置。设置读保护等级在Read Out Protection下拉菜单中将默认的Level 0改为Level 1。生效并验证点击Apply按钮软件会弹出警告窗口点击OK确认。稍等片刻软件会提示断开并重连。此时任何试图读取或写入的操作都会失败说明保护已生效。第二把锁软件唯一ID (UID) 校验 - 防止固件被复制到其他芯片生成密钥工程打开你的IDE (STM32CubeIDE) 新建一个工程。在main.c中编写一个一次性运行的函数专门用于“签发身份证”c// 伪代码示例需要在芯片第一次运行时执行并将结果写入Flash。 void Generate_Key_Once(void) { uint32_t u_id[3]; // 用于存储UID的三个32位字 // 假设UID从地址0x1FFF7A10开始不同系列地址可能不同请查阅手册 u_id[0] *(uint32_t *)(0x1FFF7A10); u_id[1] *(uint32_t *)(0x1FFF7A14); u_id[2] *(uint32_t *)(0x1FFF7A18); // 使用UID和一些自定义的“盐”值来生成密钥 uint8_t key[16]; Generate_Key_From_UID(u_id, Your_Secret_Salt, key); // 将生成的密钥写入Flash的最后几页供以后校验 Write_Key_To_Flash(key); // 写入一个标志表示“已经签发过身份证了”避免重复执行 Write_Flag_To_Flash(0x5A5A5A5A); }将这个程序烧录到你的开发板上运行一次使其将生成的密钥存入Flash。校验密钥工程修改main.c在程序最开始添加校验函数c// 伪代码示例必须在所有用户功能之前执行 int Check_Key(void) { // 1. 检查是否已生成密钥的标志 if (Read_Flag_From_Flash() ! 0x5A5A5A5A) { // 若标志不存在说明是未初始化的芯片可拒绝运行或进入恢复模式 return 0; } // 2. 重新读取UID uint32_t u_id[3]; Read_UID(u_id); // 3. 使用完全相同的算法重新计算预期的密钥 uint8_t expected_key[16]; Generate_Key_From_UID(u_id, Your_Secret_Salt, expected_key); // 4. 读取Flash中之前存储的密钥 uint8_t stored_key[16]; Read_Key_From_Flash(stored_key); // 5. 比较两者是否一致 if (memcmp(expected_key, stored_key, 16) ! 0) { // 密钥不匹配说明固件被复制到了别的芯片启动“自毁”或“迷惑”程序 while(1); // 进入死循环 } return 1; // 校验通过 }点击Build按钮编译工程。第三把锁最终烧录与启用这是量产前的最后一步目的是将校验逻辑和读保护结合让固件坚不可摧。烧录含UID校验的固件使用STM32CubeProgrammer将上一步编译好的固件烧录进开发板。启用第一把锁RDP Level 1重复“第一把锁”的步骤在Option Bytes中再次将读保护设置为Level 1并Apply。最终验证断开并重连STM32CubeProgrammer如果一切顺利它会报告无法访问代表加密成功。 进阶保护为固件穿上“防弹衣”完成以上三步你的固件安全级别已经很高了。如果想更进一步可以考虑启用写保护 (WRP)和设置RDP在同一界面勾选需要保护的Flash扇区即可。代码混淆让攻击者难以逆向分析。添加“反调试”代码检测调试寄存器一旦发现即让程序停止或自毁。 几点提醒RDP Level 1是量产首选它提供了足够的安全性同时允许通过全片擦除的方式来“解锁”返修品适合量产和维修流程。RDP Level 2极难恢复一旦设置芯片基本报废。在量产初期请勿使用在最终产品定型且确定不再需要调试时才有必要考虑。密钥“盐值”是最高机密代码中生成密钥时使用的“盐值”Your_Secret_Salt是核心机密务必保管好。务必先测试后量产在大批量生产前一定要用几块板子完整地走一遍上述流程确保万无一失。善用ST官方工具新系列STM32H5、U5等支持更高级的安全固件安装SFI可直接烧录加密后的固件实现端到端的安全。加密是一个系统工程没有绝对的安全只有不断提高的破解成本。