STM32的加密思路

  1. 使用系统启动程序STM32 Flash Loader demonstrator将Flash设置为读保护。
    所有以调试工具、内置SRAM或FSMC执行代码等方式对主存储器访问的操作将被禁止,只允许用户代码对主Flash存储器的读操作和编程操作(除了Flash开始的4KB区域不能编程)。用户代码允许自主编程可以实现IAP或者数据存储等功能。
    这样破解者将不能用调试工具、内置SRAM或者FSMC执行代码等方式读出Flash中的代码。破解者也不能使用系统启动程序读取代码,因为要解除读保护,将执行整个芯片的擦除操作。
  2. 主程序中使用设备ID保护
    即使将Flash设置为读保护,破解者也可以通过IAP下载自己的一段小程序,从而读出Flash中的内容。因此,还需要利用设备的唯一ID进行加密保护。在主程序中,加入对设备唯一ID的检测,这样即使破解者读出了芯片中的二进制码,也不能用这个二进制码去复制新的器件。
    具体实现方法:
    a. 在应用程序中定义1个(32位甚至更多)const变量,变量值全为0xFF。每次启动程序时,检查const变量值如果全为0xFF,就读器件的唯一ID,通过Flash编程写入该const变量中(因为全是0xFF,所以可以编程写入)。
    b. 在程序中多个地方检查const变量,如果变量值不为0xFF并且与设备ID不一致,就执行与功能无关代码(比如自擦除)。
    这样,即使破解者读出了芯片中的二进制码,因为这份二进制码包含了设备唯一ID,具有唯一性,所以不能复制到其他芯片中。
    为了避免破解者利用反汇编,根据芯片ID数据在二进制文件中查找对应相同数据的位置从而破解,可以将ID拆散成不同的组合,并且写到不同且不连续的地方。更进一步,可在程序中检测多份这样的分散ID,以增加反汇编的难度。或者将CPUID进行加密,Flash中存储加密后的结果。
  3. 固件的加密。有两种方案:一是传输过程的加密,另外一种是固件镜像的加密。具体方案待补充。

程序加密的实现

//加密后的CPUID
volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;//写入加密数据
void WriteEncrypt(void)
{//第一次烧写:将UID写入到Flash中if(CPUIDEncrypt==0xFFFFFFFF){uint32_t CpuID[3];//获取CPU唯一的IDCpuID[0]=*(vu32*)(UID_BASE);CpuID[1]=*(vu32*)(UID_BASE+4);CpuID[2]=*(vu32*)(UID_BASE+8);//加密算法,很简单的加密算法uint32_t EncryptCode=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);FLASH_Unlock();FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);FLASH_ProgramWord((uint32_t)&CPUIDEncrypt, EncryptCode);FLASH_Lock();}
}
//判断加密
bool JudgeEncrypt(void)
{uint32_t CpuID[4];//获取CPU唯一的IDCpuID[0]=*(vu32*)(UID_BASE);CpuID[1]=*(vu32*)(UID_BASE+4);CpuID[2]=*(vu32*)(UID_BASE+8);//加密算法,很简单的加密算法CpuID[3]=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);//检查Flash中的UID是否合法return (CPUIDEncrypt == CpuID[3]);
}
  • 将写入加密数据和判断加密两个功能分开。写入加密在PrsCtrlTask开始的地方;而判断加密分布到程序的各个角落。
  • 非常重要的是CPUID加密值的定义一定要加“volatile”类型,否则按速度优化编译,在判断加密值,不会重新读取加密值,导致判断出错。
volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;
  • 在工程选项Options->Debugger->Download中选择: use flash loader,否则主程序中对Flash编程将不成功。
    [未完待续]

STM32 加密思考相关推荐

  1. STM32加密保护工具 | STM32Trust介绍、解决方案

    视频号 | strongerHuang 微信公众号 | strongerHuang 物联网时代,因为要联网就牵涉到一个重要的问题,那就是安全,你会发现近两三年各MCU厂商都在推自己的安全芯片. 本文就 ...

  2. python-hashlib模块-加密

    功能介绍: 数据加密 只能加密,不能解密 应用场景: 用户密码加密 思考,加密后看不懂,改密码该怎么办? 如何验证? 导入hashlib模块 模块的导入 import hashlib md5加密 &g ...

  3. (1)非对称加密——RSA——史上最通俗的小白可看懂!

    摘要 我身边有几个年龄分布在4-6岁的小朋友.由于他们还都不能熟练地掌握100以内的加减法,所以我原计划的对称加密,在他们看来还是有点难.那非对称加密呢,需要他们能熟练进行三位数的乘法,我想就可以逐步 ...

  4. 从智能锁谈STM32安全技术

    一. 智能锁的安全分析 1.1 安全的概念与保护的对象 1.1.1 什么是安全 安全分为2类: 功能安全 Functional Safety 保护系统不受那些随机故障或者系统设计缺陷的影响 信息安全 ...

  5. seafile安装教程mysql密码_Seafile安装踩坑

    欢迎大家访问我的博客新地址: 至于为什么要搭建私有云盘,或许就是因为前段时间360个人网盘下架的原因吧,事情过去很久了,我也在摸索方案,最后还是选择了百度云,或许是因为百度说过我们百度云不会倒下的,哈 ...

  6. [转]信息安全相关理论题(二)

    27.在工程实施之前,验收方可以不给施工方弱电布线图纸,但施工结束后必须有图纸 A. 对 B. 错 您的答案: 标准答案: B 28.在OSI七层协议中,提供一种建立连接并有序传输数据的方法的层是 A ...

  7. 【滴水三期】--公开课

    课程思想:用逆向的思维学习正向,而不是用正向的思维学习逆向 滴水逆向课程体系: 第一章  进制.寄存器与汇编指令 第二章  C语言 第三章  硬编码 第四章  C++与MFC 第五章  Win32 A ...

  8. stm32cubeIDE的使用

    stm32官方出了个免费的IDE,可以很方便地配置(初始化)stm32项目. 文章目录 安装相关 安装 st-link utility 安装 工程.芯片配置流程 flash相关 读写保护 flash的 ...

  9. 关于STM32驱动DS1302实时时钟的一点思考

    关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...

最新文章

  1. c语言把地址用%d输出字符串,C语言必须要记住的经典程序
  2. server 2008访问Server 2003数据慢
  3. 关于《大道至简》第一章的收获
  4. 永劫无间大神玩家ZX迷恋上单人三排,单局28杀,过程太过瘾了
  5. 计算机类农学类牧医类,考生注意!2017年高考报考类别确定
  6. cuda 5.0配置vs2008+Visual Assist X +安装问题解决
  7. VXWORKS 几种定时机制
  8. Redis简单案例(三) 连续登陆活动的简单实现
  9. 小米MIX 4屏幕规格曝光:华星光电1080P面板 或支持屏下摄像
  10. Rickie的软件测试学习笔记-第四周
  11. 147.对链表进行插入排序
  12. gaster字体转换器_Galas字体转换器 Galas在线生成器-万字网
  13. WEP无线网络密码破解
  14. Ordering disordered structures
  15. zzzfun网站连接不上服务器,zzzfun网页版
  16. Bouncy Castle 密码包的配置及使用详解
  17. 权限管理框架实现(1)--Struts切面处理
  18. c#NPOI操作word小心得
  19. acwing 4269.校庆(map)
  20. 刚入行的 可以了解下什么是物理机和虚拟机 租用和托管 ——世通兰陵王为你解答

热门文章

  1. 励志心灵鸡汤经典语录,满满都是道理!
  2. H2 database文档学习
  3. 用Tkinter打造自己的Python IDE开发工具(5)利用HP_tka模块设计自己的中文代码编辑器
  4. PCB上邮票孔的添加方式,你真的做对了吗……
  5. Lua脚本的基本使用
  6. OAuth网络协议(转)
  7. 虚拟机无法正常打开使用,拷贝出虚拟机文件
  8. es分布式架构和原理分析
  9. 联想万全服务器 R630 故障处理
  10. 解决PotPlayer播放MKV格式文件没有声音的问题