当前位置: 首页 > news >正文

Hex2Bin转换软件、Bootloader 、OTA加密升级 、STM32程序加密、其他MCU同样适用

说明:这个工具可以将 Hex 文件 转换为 Bin 格式文件,软件是按自己开发 STM32 OAT 功能需求开发的一款辅助 上位机软件。

文中的介绍时 bootloader = boot 

文档在补充完善中...

有兴趣的朋友可留言探讨。

1. 软件功能:

1.生成 bin:将 Hex 格式文件转换为 Bin 格式。

2.boot 打包为 bin:可以生成指定大小的 bin 格式文件,文件多余的空余位置填充随机数。可在生成的Bin文件指定位置填充加密后的指定数据,用于程序加密使用。

3.app 打包为 bin :可生成整个程序加密后的 Bin 文件,可用于 OTA 中的 APP 文件加密,防止APP泄漏。

2. Bootload 加密思路

bootloader文件的构成: 

bootloader 编译文件 + flash加密数据区域 = 烧录用 bootloader;

例如:假设app的开始区域为 0x800A000 ,那boot的文件区域为 0x8000000 ~  0x800A000

1. Flash加密数据区域:

        假设取 0x8009800 ~ 0x800A000 共2kb区域作为加密数据的存储区域,简单说按app的前一个扇区作为加密数据存储区域,因为有的MCU一个扇区大小 2k ,有的 1k ,视具体型号而定,取app的上一个扇区即可。

2. boot 编译文件大小:

        调整Flash分区的大小,boot 的数据不要到 Flash加密数据区域,避免交叉导致 boot 被意外擦除。

3. Flash加密数据区域数据结构:

typedef struct
{
    uint32_t  app_state;            /* app 状态,无APP,有APP */
    uint32_t  mark[4];              /* 初始状态数据 */
    uint32_t  id_mark[4];           /* ID加密数据 */
    ...                             /* 根据需求自定义 */
}APP_t;

4. boot文件打包:

4.1.设定指定大小:

        使用专用 上位机软件导入 boot 程序后,按设定的大小输出输出 bin 文件,多余的地方填充随机数。例如:boot编译文件为 32k, 设定输出大小为40 k,那空余的 8k 全部填充随机数,这样混淆后即便读出boot程序也不知道boot程序具体多大。

4.2.插入加密数据:

        在预留的加密扇区内指定的位置插入加密数据。

        如:数据 mark[4] 是boot第一次运行时会检测的数据,检测这个数据和预期的相符才执行 boot 的加密工作,加密完成后再 修改或删除 mark[4] 数据,确保 boot 的加密工作只做一次。

        id_mark[4] 是加密数据,通过读取 MCU 的 ID ,再通过AES加密算法,加密后存储到 id_mark[4] 。 

uint32_t  mark[4];              /* 初始状态数据 */
uint32_t  id_mark[4];           /* ID加密数据 */

3. APP 加密思路

        1. app 按16字节凑整,即app的大小是 16 的整数倍,这样方便 AES 加密,加密前在app文件末尾插入app文件的 CRC16 校验值,这样boot可以校验app的完整性。在凑整和添加CRC16值后再AES加密文件,最终得到的bin文件作为 boot 升级用。

        2.app校验ID的有效性,app通过读取 boot 加密区域的 ID 加密数据,解密后与读取的MCU ID 做对比,判断程序的有效性。

4. boot 启动流程

5. App 启动流程

        app通过读取 boot 加密区域的 ID 加密数据,解密后与读取的 MCU ID 做对比,判断程序的有效性。

6. AES 加密算法代码

7. CRC16 校验算法代码

相关文章:

  • 平衡搜索二叉树(AVL树)
  • 数据结构(2023-2024)
  • docker - 常用容器部署命令大全(MySQL、Redis、RabbitMQ、ES、Kibana、Nacos、Sentinel)
  • Linux 服务器安全策略技巧:使用 Bcrypt 或 Argon2 进行密码哈希
  • 2015年电赛控制类—STM32风力摆控制系统资料+源程序
  • 【Python】Excel不同sheet另存为不同CSV
  • C#上位机与欧姆龙PLC的通信10----开发专用的通讯工具软件(WPF版)
  • #{}和${}的区别?
  • 面试算法108:单词演变
  • 一个Pygame的Hello World示例程序
  • phpstorm配置ftp
  • 【angular教程240105】02绑定属性 绑定数据、条件判断、加载图片、【ngClass】 【ngStyle】、Angular管道
  • springBoot配置文件(四)application常见配置
  • 雍禾植发袁宣心中有“术”,雍禾医疗帮用户重启人生
  • swaggerUI不好用,试试这个openapiUI?
  • 【Proteus仿真】【Arduino单片机】智能感应温控风扇
  • c语言:输入成绩,统计不及格人数|练习题
  • c++跨平台ui
  • react中实现拓扑图
  • 通过Docker搭建4节点的Tendermint集群
  • 霍步刚任辽宁沈阳市委书记
  • 国家统计局向多省份反馈统计督察意见
  • 泰山、华海、中路等山东险企综合成本率均超100%,承保业务均亏损
  • 杨文庄当选中国人口学会会长,曾任国家卫健委人口家庭司司长
  • 7月纽约举办“上海日”,上海大剧院舞剧《白蛇》连演三场
  • 万科再获深铁集团借款,今年已累计获股东借款近120亿元