stm32 加密

本文探讨了STM32芯片的加密方法,包括设置读保护、利用唯一ID进行加密及采用AES等加密算法确保BOOT代码的安全。介绍了如何通过加密算法保护通信通道上的数据安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识产权的保护,如何让自已辛勤的劳动成果不被别人抄袭,采用有效的手段对IC加密是值得每一个设计者关注的问题。

当然,有人说,没有解不了密的IC,的确,解密是一项技术,只要有人类在不断的研究,它就有破解的一天;但是加密后的IC会增加破解的难度与破解成本,当破解的成本大于收益时,自然就会使破解者望而却步。

STM32芯片这两年销量很好,它的性能和价格都很不错,但如何对STM32进行加密呢,本人结合自已使用STM32 MCU一年多的经验,总结一下我对它加密的理解与方法。

关键字: STM32 加密 读保护

加密,最基本的方法是置读保护,这样可以防止外部工具非法访问,在STM32官网发布的 串口ISP软件中有置读保护和加密选项,选择一个就可以了,这样外部工具就无法对FLASH进行读写操作,但我要重新烧写FLASH怎么办?只能清读保护,而清读保护后,芯片内部会自动擦除FLASH全部内容。

还有人说,置读保护还不够安全,说要采用芯片内的唯一ID来加密,在程序里识别芯片的ID,如果ID不对,则程序不运行,当然,这样安全性又要更高一些,但每个芯片的ID不一样,因此对应的程序也应该不一样,那如何处理呢?有网友说:采购的时候,产品同批生产的ID号应该是连续的,可以通过判别ID的范围;还有网友说,在烧录工具里做一个算法,读取芯片ID,再修改相应的二进制文件。当然还会有很多种方法,这里不展开讨论。

以上介绍的只是一种情况,在实际的应用中还会发生第二种情况。

我们知道,STM32的内部FLASH是用户可编程的,也就是说它支持IAP,而IAP中的APP代码一般是需要开放的,那么只有保证BOOT的代码安全,才能确保不被破解。

前面提到,当IC置读保护后,外部工具不能访问内部FLASH,但CPU可以访问,破解者完全可以自已编写一段代码通过BOOT下载到IC 运行,然后在程序中读出你的BOOT代码。

只能加以限制,使别人的代码运行不了,才能保证BOOT不被读出。

常用的方法是采用加密算法,如AES;流程如下:

APP代码加密,下载时,在BOOT中解密,这样,只有通过正确加密的APP代码才能正常的运行,因此加密的算法就成了你的密钥,而这个是你独有的。


芯片内部先保存一个用唯一ID加密以后生成的数据

做IAP的时候,先把这个数据读出来,解密,再和芯片的ID比较,如果是一致的,说明芯片的来源可靠。


然后IAP应用程序根据芯片ID,对要烧录到芯片的BIN文件进行加密,再把加密过的数据传给芯片,芯片内部的BOOTLOADER代码根据自身ID,对加密以后的数据解密,并烧写入FLASH。这样在通信端口进行传输的数据就都是加密过的数据,保证了通信通道上的安全性。

### STM32 加密实现方案概述 STM32 微控制器提供了多种加密技术和实现方法来保护用户的代码和数据安全。这些技术涵盖了从硬件级别的执行保护到软件层面的数据加密,确保了设备的安全性。 #### 1. 执行保护功能 STM32 提供了 `STM32Trust.ExecutionProtection` 功能集,旨在保障代码运行期间的隔离性和正确性[^1]。该功能利用芯片内部的不同架构和隔离机制,防止未经授权的访问或篡改。开发者可以通过配置特定寄存器或启用专用外设(如 TrustZone 或 MPU),进一步提升系统的安全性。 #### 2. 设备 ID 加密与校验 为了增强嵌入式系统的安全性,STM32 支持基于唯一设备 ID 的加密和校验机制。具体而言,开发人员可以读取 MCU 的 UID 并对其进行简单或复杂的加密处理后存储至 Flash 中。每次启动时验证加密结果的一致性即可确认设备的真实性[^2]。 以下是设备 ID 加密的一个简化示例: ```c #include "stm32fxxx_hal.h" #define UID_BASE ((uint32_t *)0x1FFF7A10) void GenerateAndStoreEncryptedID() { uint32_t cpu_id[3]; uint32_t encrypted_code; // 获取 CPU 唯一 ID cpu_id[0] = *(UID_BASE); cpu_id[1] = *(UID_BASE + 1); cpu_id[2] = *(UID_BASE + 2); // 简单加密逻辑 encrypted_code = (cpu_id[0] >> 3) ^ (cpu_id[1] >> 1) ^ (cpu_id[2] >> 2); // 将加密后的值写入 Flash HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); HAL_StatusTypeDef status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, ENCRYPTED_ID_ADDRESS, encrypted_code); HAL_FLASH_Lock(); if (status != HAL_OK) { Error_Handler(); } } ``` 此代码片段展示了如何生成并存储经过加密的设备 ID[^4]。 #### 3. 数据加密算法应用 对于更高级别的安全保障需求,可采用标准密码学算法如 AES 对敏感数据进行加解密操作。AES 是一种广泛使用的对称加密算法,在 STM32 上可通过调用库函数轻松实现[^3]。 下面是一个使用 AES ECB 模式的加解密实例: ```c #include "aes.h" // 定义密钥长度为 16 字节(即 AES-128) const uint8_t aes_key[16] = { /* 用户定义的密钥 */ }; // AES 加密函数 void EncryptData(const uint8_t *plaintext, uint8_t *ciphertext) { AES_ECB_Encrypt(plaintext, aes_key, ciphertext); } // AES 解密函数 void DecryptData(const uint8_t *ciphertext, uint8_t *plaintext) { AES_ECB_Decrypt(ciphertext, aes_key, plaintext); } ``` 注意:实际部署时应考虑模式的选择(推荐 CBC 或 GCM 而非 ECB)以及初始化向量 IV 的管理等问题。 #### 4. 防止程序复制的技术手段 由于编译后的固件可能被提取并重新加载到其他相同型号的器件上,因此有必要采取措施阻止此类行为发生。常见的做法包括但不限于设置选项字节锁定 Bootloader 区域、禁用调试接口 JTAG/SWD 及启用 RDP(Readout Protection Level)。RDP 具有两级防护等级——Level 1 和 Level 2;后者会彻底封锁所有外部访问途径直至擦除整个闪存内容才能恢复正常使用状态[^5]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值