dffzh 发表于 2025-5-14 17:14

MCU程序怎么加密?你有什么妙招?

本帖最后由 dffzh 于 2025-5-15 14:32 编辑

#申请原创#
@21小跑堂

有时候为了防止MCU出厂程序(固件)被抄袭,会通过一些手段进行程序加密,那常用的MCU程序加密方法包括哪些呢?总结了一下,主要包括硬件、软件和混合加密三类,下面将逐一介绍。一、硬件加密方法   1、内置闪存读写保护原理:通过配置芯片的Option Bytes(选项字节)启用读保护(RDP)和写保护(WRP)。例如常见的STM32,其RDP就分为三个等级:级别0:无保护;级别 1:禁止调试接口直接读取Flash,解除保护会触发全片擦除;级别 2:永久禁用调试接口(不可逆)。如下截图来源于STM32Fxx系列的中文参考手册:

操作:使用工具(如STM32CubeProgrammer)配置RDP和WRP;或在代码中通过HAL库进行动态设置(需复位生效)。2、使用外部加密芯片原理:MCU与外部加密芯片(如Microchip的ATECC608A,INZOTEK的ICP209等)交互验证合法性,例如通过随机数生成与校验算法确认芯片存在。应用场景:适用于高安全性需求,如支付设备或关键算法保护。3、烧断数据总线或引脚原理:物理破坏调试接口(如JTAG/SWD)或熔断特定引脚,阻止外部访问。缺点:行为不可逆,并且可能会损坏芯片,还可能通过芯片拆解**,不建议使用。
二、软件加密方法 1、唯一标识(UID)加密原理:利用MCU出厂时内置的唯一ID(如STM32或者GD32的96位UID),在程序启动时校验ID合法性:基础实现:将UID存储于Flash,运行时比对;增强方案:将UID通过加密算法(如AES)处理后分散存储,运行时组合验证。优势:低成本,易实现,适合防复制场景。现在很多32位MCU,都支持加密算法,比如STM32F4系列的加密处理器CRYP模块:
再比如PIC单片机的PIC32MZ、PIC32MK等较新的高性能系列的AES硬件模块,支持AES-256(以及AES-128/192),提供高速加解密(ECB/CBC/OFB/CTR等模式):
2、程序固件加密原理:将程序编译为密文存储,运行时解密至RAM执行。应用:适用于外部Flash启动的芯片,通过硬件加速解密实现边运行边解密。
三、混合加密方案1、读保护 + UID加密操作步骤:启用RDP Level1防止调试接口读取;在程序中嵌入UID校验逻辑,若UID不匹配则锁定功能。增强措施:结合哈希算法或非对称加密处理UID,避免明文存储。2、Bootloader加密原理:在Bootloader中集成解密程序,升级固件时验证签名(令牌)并解密烧录,防止非法固件注入。
四、芯片厂商特定方案1、STM32系列(意法半导体)使用RDP和WRP保护Flash,并通过HAL库配置OptionBytes;可以查看前文截图。2、GD32系列(兆易创新)通过FMC(闪存控制器)外设设置安全保护状态,类似STM32的RDP机制,如下图为GD32F4xx系列的数据手册截图信息:
3、NXP系列(恩智浦)LPC系列采用CRP(代码读保护)配置字,写入特定地址后禁用调试接口,如下图为LPC408X_7X系列的数据手册截图信息:

其他MCU厂商的保护机制可以参考其对应的数据手册。
通过综合硬件保护+软件算法+厂商方案,开发者可以根据项目需求选择最合适的加密策略。例如,消费类产品可采用UID+读保护的方案,而更高级别的应用场景推荐外部加密芯片+固件加密的组合方案。

zzele 发表于 2025-5-15 06:32

以前都把精力放在防读取防**上,效果不是太好,还增加了额外的烧写流程,现在都是多重验证再运行的策略。

zjsx8192 发表于 2025-5-15 08:16

外挂一个加密芯片就行了

dffzh 发表于 2025-5-15 08:48

是的,毕竟凡事有利有弊,主要还得看应用场景和需求

dffzh 发表于 2025-5-15 08:49

zzele 发表于 2025-5-15 06:32
以前都把精力放在防读取防**上,效果不是太好,还增加了额外的烧写流程,现在都是多重验证再运行的策略。

是的,毕竟凡事有利有弊,主要还得看应用场景和需求;
多重验证再运行的加密策略指的是什么手段?愿闻其详

yjmwxwx 发表于 2025-5-15 09:49

本帖最后由 yjmwxwx 于 2025-5-15 10:27 编辑

zzele 发表于 2025-5-15 06:32
以前都把精力放在防读取防**上,效果不是太好,还增加了额外的烧写流程,现在都是多重验证再运行的策略。
最好加上完整性校验,而且要多处校验,校验不过就进入一个让内存溢出的程序,这样很难靠调试抓到哪里出的问题。

cooldog123pp 发表于 2025-5-15 13:05

不过最近老刷到有逆向公司,从逆向PCB到芯片,感觉怎么加密人家都有办法的么。

dffzh 发表于 2025-5-15 13:08

上有政策,下有对策;
人类的智慧就是这么牛。

dffzh 发表于 2025-5-15 13:09

cooldog123pp 发表于 2025-5-15 13:05
不过最近老刷到有逆向公司,从逆向PCB到芯片,感觉怎么加密人家都有办法的么。 ...

上有政策,下有对策;
人类的智慧就是这么牛。

星辰伴梦 发表于 2025-5-15 14:27

硬件加密确实是一种有效的方法,尤其是内置闪存读写保护,可以防止未授权的读取和写入。但要注意,一旦启用了高级别的保护,就无法再进行调试了,所以需要谨慎选择保护级别。

dffzh 发表于 2025-5-16 08:49

星辰伴梦 发表于 2025-5-15 14:27
硬件加密确实是一种有效的方法,尤其是内置闪存读写保护,可以防止未授权的读取和写入。但要注意,一旦启用 ...

是的,除非肯定程序固件不会再升级,那就可以用最高级别保护了

xionghaoyun 发表于 2025-5-16 08:52

1.加密芯片

xionghaoyun 发表于 2025-5-16 08:52

2.烧录口配置为输出口

xionghaoyun 发表于 2025-5-16 08:53

3.2个芯片串口通讯 代码能分开

dffzh 发表于 2025-5-16 09:02

xionghaoyun 发表于 2025-5-16 08:52
1.加密芯片

你们用的是什么加密芯片呀?

dffzh 发表于 2025-5-16 09:03

xionghaoyun 发表于 2025-5-16 08:52
2.烧录口配置为输出口

也是简单的但不错的操作;
后续如果需要更新固件,可以通过OTA或者UART方式升级

dffzh 发表于 2025-5-16 09:04

xionghaoyun 发表于 2025-5-16 08:53
3.2个芯片串口通讯 代码能分开

还有这样的牛操作,学习了{:handshake:}

xionghaoyun 发表于 2025-5-16 09:12

dffzh 发表于 2025-5-16 09:02
你们用的是什么加密芯片呀?

没用过 听说有这个东西存在

万能的互联网 发表于 2025-5-17 17:28

本帖最后由 万能的互联网 于 2025-5-17 17:30 编辑

yjmwxwx 发表于 2025-5-15 09:49
最好加上完整性校验,而且要多处校验,校验不过就进入一个让内存溢出的程序,这样很难靠调试抓到哪里出的 ...
首先最好要确保固件,不会被通过硬件缺陷,整个固件被完整的读出来。youtube上有通过电压毛刺攻击,读出完整固件的视频。stm32有一部分单片机使用RDP1保护,会有这个缺陷。国产arm32单片机也有一些会,具体那些型号就不说了,怕得罪人,说了厂商也不一定会认领,哈哈。闲鱼甚至有卖这种固件读保护“坡姐器”,也是利用电压毛刺漏洞。固件都被完整读出来了,坡姐就看那人的技术实力,和时间空间复杂度了(坡姐成本)。

yjmwxwx 发表于 2025-5-17 23:47

万能的互联网 发表于 2025-5-17 17:28
首先最好要确保固件,不会被通过硬件缺陷,整个固件被完整的读出来。youtube上有通过电压毛刺攻击,读出完 ...

只要挖的坑多而且隐秘拿到固件也不容易搞

仪表类校准算法不公开,拿到固件做出来也测不准。
页: [1] 2
查看完整版本: MCU程序怎么加密?你有什么妙招?