0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

对主流MCU的程序加密进行讲解

UtFs_Zlgmcu7890 来源:未知 作者:李倩 2018-07-06 09:17 次阅读

随着物联网和边缘计算的出现,五花八门的MCU也被应用其中,如何保证我们的程序安全和知识产权不受侵犯呢,本文我们将对主流MCU的程序加密进行讲解,希望能够帮助你选择最适合自己应用的微处理器

1. MCU加密

通常所说的MCU加密是指将用户的程序固件保护起来,防止别人通过外部调试接口或者其他方法读取烧写在Flash中的程序。保护自家方案不轻易被别家抄袭,从硬件上保护自己的知识产权。MCU加密还指防止自家程序被恶意读取破解。

2. 常用MCU加密方式

通过写特定配置字;

增加外部加密芯片

程序代码进行密码加密,使程序变成密文;

程序校验芯片的唯一ID。

2.1 配置字加密

2.1.1 原理

MCU厂商在设计芯片时在芯片中增加特定的非易失存储,该存储也可能是Flash的特定地址区域。用户可以通过外部工具或在程序的特定地址写入使能存储保护的值。

配置字加密在芯片完成上电时序后才会生效,一般包含以下功能:

禁能调试接口(JTAG/SWD);

不禁能调试接口,但不允许调试器连接内核和访问Flash和RAM空间;

关闭读写Flash的ISP指令;

禁止除芯片正常执行程序外读Flash操作;

禁能芯片从外部接口或RAM启动执行代码。

2.1.2 应用场景

这种加密方式通常用在程序存储在芯片内部Flash的系统中。例如NXP LPC系列MCU、GD32系列MCU、NXP Kineits Cortex-M系列。

2.2 外接加密芯片

2.2.1 原理

加密芯片保护程序的方式,是通过程序与外部加密IC的交互来确认程序是否进一步执行。

利用芯片随机数外设或者其他能够产生随机数的机制,在每次上电后系统取得一个随机数,并将这个随机数通过类似IIC的协议传给外部的硬件加密IC。随后系统按先前约定的算法进行结果计算,等待外部IC接收到随机数并也算出结果后,外部IC会将计算结果传回给系统。如果系统的计算结果和外部IC的计算结果相同,则说明外部的加密IC存在。

2.2.2 应用场景

这种加密方式主要用在用户对代码中关键算法的加密,算法通常会以Lib的方式提供,只有购买了对应加密芯片(类似于产品密钥)的客户才能够使用算法程序。

2.3 UID检验加密

2.3.1 原理

UID加密一种用户主动加密的方式。当下几乎所有处理器内部都包含UID,可以通过直接寻址读取或者IAP指令获得。

UID加密通常分为二种方式:

用户在烧写程序时,读取一次芯片UID将其写入Flash特定区域。在程序启动时直接读取UID和Flash内部的数值进行比较决定是否启动;

用户读取UID后通过私有密钥将UID加密之后的信息写入Flash特定地址,例如Flash的最后一个扇区。程序启动时,首先读取芯片UID并通过同样的密钥和算法进行计算后与Flash中的数值进行比较决定是否启动。

其中第一种最容易被破解,第二种也存在潜在风险,为了增强第二种的安全性,可以将加密后的数据拆分后分别存放到Flash的不同位置,运行时再组合。

2.3.2 应用场景

主要用在一些不需要太多保护的协议栈上,例如LoRa协议栈、文件系统、私有操作系统等。协议栈相对算法的价值会低一些,增加加密芯片的成本显得过高。

同时这种方式也可延伸为使用PID(每个型号的ID相同)来区分设备型号。

2.4 程序固件加密

2.4.1 原理

程序固件加密是指通过私有密钥将整个程序固件加密计算后生成密文,使得程序即使被其他人拿到后也不可能被反编译。这种加密方式通常需要有一段地址存储密钥和解密程序,他们可以是芯片内部Bootloader或用户自己的Bootloader。

2.4.2 应用场景

这种加密方式主要用于芯片没有内部Flash或Flash较小,以及需要给用户升级固件的产品上。例如:

芯片从外部Flash启动时,外部Flash很容易被拷贝,盗版。这种应用通常芯片内部具备OTP区域用于编程密钥;

芯片内部Flash较小时可以将算法等文件放置在外部Flash中,运行时解密到内部RAM执行。密钥通常和内部Flash的程序一同存储;

使用在产品需要后期升级功能算法的项目中,可以在Bootloader中放置解密程序,升级的过程中,Bootloader将收到的固件解密烧写到内部Flash中。这样既可以随意发送产品更新固件,同时不用担心知识产权被侵害。

例如i.MX RT1050系列芯片就是使用程序固件加密,程序被放置在外部Flash中,执行时边解密边执行,对i.MX RT1050系列的加密问题可以联系我们。

3. 常用芯片的加密方式

3.1 NXP LPC系列

LPC系列MCU大多采用配置字加密方式,即CRP(Code Read Protection)加密。将配置字(CRP Key)写入特定的Flash地址中。芯片上电启动后内部boot会根据配置选择禁用相应的功能。

CRP是一种允许用户在系统中启用不同级别的安全性的机制,从而可以限制对片上闪存的访问和ISP的使用。当需要时,通过在0x0002FC中闪存位置编程特定模式来调用CRP。IAP命令不受代码读取保护的影响。

以LPC824位例,在启动文件(*.s)中找到CRP Key根据需要进行修改,如图3.1。

图3.1 CRP Key示例

注:切记在产品最终固件中才可使用CRP3,否则芯片将被锁死不能再被解锁。

3.2 NXP Kineits Cortex-M系列

Kineits Cortex-M系列的加密同样使用配置字的方式写入Flash特定区域,但它比LPC系列相对复杂一些功能也更加强大。

Kineits Cortex-M系列的加密包含在FlashConfig区域,FlashConfig包含一些用于芯片内部Boot的配置信息,比如使能或禁能NMI引脚中断。

图3.2 FSL的FlashConfig段

使用keil工具可以快速使用UI配置,如图3.3所示:

图3.3 启动文件配置

3.3 GD32系列

GD32系列加密与和STM32系列加密方式类似。GD32内部包含一个FMC外设。FMC提供了一个安全保护功能来阻止非法读取闪存。此功能可以很好地保护软件和固件免受非法的用户操作。

FMC包含一个OB_RDPT字节与其补字节:

当将OB_RDPT字节和它的补字节被设置为0x5AA5,系统复位以后,闪存将处于非安全保护状态;

当设置OB_RDPT字节和它的补字节值为任何除0x5AA5外的值,系统复位以后,安全保护状态生效;

在安全保护状态下,主存储闪存块仅能被用户代码访问且前4KB的闪存自动处于页擦除/编程保护状态下。在调试模式下,或从SRAM中启动时,以及从boot loader区启动时,这些模式下对主存储块的操作都被禁止;

如果将OB_RDPT字节和它的补字节设置为0x5AA5,安全保护功能将失效,并自动触发一次整片擦除操作。

GD官方提供加密工具GigaDevice_MCU_ISP_Programmer或者使用FlyMCU等工具,操作界面如图3.4所示:

图3.4 GD32使用FlyMCU加密

3.4 i.MX RT系列

i.MX RT系列是NXP公司发布的跨界处理器,MPU的处理性能、MCU的开发方式。该系列不包含用户可用的内部Flash,所有代码都要存储在外部存储介质中。它使用FSL独有的HAB安全机制,能够达到比前面更安全的加密机制。

i.MX RT的加密是将程序固件完全通过工具转换为密文,不能够被反编译,同时i.MX RT内部包含OTP区域,用于编程密钥信息和启动信息,加密后不可读取。

芯片使用QSPI或HypeFlash时,可以实现边运行边解密,不占用额外的RAM空间,同时硬件解密配合内核中32KB ICache和32KB DCache使得程序运行不会受到固件加密的影响;

芯片还支持Boot时完全解密程序到内部RAM或外部SDRAM,这种方式代码的启动速度略微变慢,但是能够支持更多的启动方式:SD卡、MMC、Nand Flash等。

NXP提供加密工具CSF和密钥烧写工具FlashLoader,用于程序固件的加密和烧写。如有任何疑问可联系我们的FAE获得支持。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    446

    文章

    47769

    浏览量

    409069
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16011

    浏览量

    343544
  • 加密
    +关注

    关注

    0

    文章

    293

    浏览量

    23591

原文标题:安全加密(一):这些MCU加密方法你都知道吗?

文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    32位MCU是物联网市场的绝对主流

    随着物联网的快速发展,各大MCU厂商都将目光聚焦到32位MCU上,目前主流的8位MCU最终是否会退出市场?32位MCU在物联网时代会成为市场
    发表于 06-02 01:05 5110次阅读

    MM32 MCU加密方法

    本帖最后由 MMCU5721167 于 2017-11-30 17:17 编辑 来源 灵动MM32在MM32系列MCU产品中有多种加密手段保护用户程序,在这里给大家简单介绍几种加密
    发表于 11-30 17:15

    这些MCU加密方法你都知道吗?

    本文导读随着物联网和边缘计算的出现,五花八门的MCU也被应用其中,如何保证我们的程序安全和知识产权不受侵犯呢,本文我们将对主流MCU程序
    发表于 07-12 15:33

    MCU加密方法你知道多少?

    随着物联网和边缘计算的出现,五花八门的MCU也被应用其中,如何保证我们的程序安全和知识产权不受侵犯呢,本文我们将对主流MCU程序
    发表于 10-10 14:53

    MCU加密手段有哪些

    关注、星标公众号,不错过精彩内容编辑:黄工参考素材来源:网络现在的MCU程序可能别人花几百块钱就能破解,为了防止大家的程序不被剽窃,今天给大家分享点加密的内容。一、常见
    发表于 11-01 07:29

    MCU加密的方法

    本文导读随着物联网和边缘计算的出现,五花八门的MCU也被应用其中,如何保证我们的程序安全和知识产权不受侵犯呢,本文我们将对主流MCU程序
    发表于 11-04 07:24

    有什么方法可以对STM32 MCU进行加密

    STM32 MCU加密的原理是什么?有什么方法可以对STM32 MCU进行加密呢?
    发表于 11-08 07:05

    一个简单的MCU加密方法

    。目前有一个简单的MCU加密方法,就算抄袭者整块copy你MCU的flash,也无法正常运行你的程序。原理Created with Raphaël 2.2.0
    发表于 11-10 09:13

    请教大家MCU的固件加密方式有哪些?

    请教大家,mcu的固件加密方式有哪些?程序有bootloader 和app两部分,mcu资源有限,flash:256kb,ram : 32kb。
    发表于 02-01 15:52

    MCU常见的加密手段

    关注、星标公众号,不错过精彩内容编辑:黄工参考素材来源:网络现在的MCU程序可能别人花几百块钱就能破解,为了防止大家的程序不被剽窃,今天给大家分享点加密的内容。一、常见
    发表于 10-25 14:21 1次下载
    <b class='flag-5'>MCU</b>常见的<b class='flag-5'>加密</b>手段

    MCU常见的加密手段

    MCU常见的加密手段
    发表于 10-25 16:36 15次下载
    <b class='flag-5'>MCU</b>常见的<b class='flag-5'>加密</b>手段

    【转】安全加密(一):这些MCU加密方法你都知道吗?

    本文导读随着物联网和边缘计算的出现,五花八门的MCU也被应用其中,如何保证我们的程序安全和知识产权不受侵犯呢,本文我们将对主流MCU程序
    发表于 10-28 20:36 14次下载
    【转】安全<b class='flag-5'>加密</b>(一):这些<b class='flag-5'>MCU</b><b class='flag-5'>加密</b>方法你都知道吗?

    MCU加密

    MCU加密
    的头像 发表于 09-26 17:01 477次阅读
    <b class='flag-5'>MCU</b>之<b class='flag-5'>加密</b>

    HASH算法加密芯片的工作原理及其在STM32 MCU上的应用

    本文主要研究了HASH算法加密芯片的工作原理及其在STM32 MCU上的应用,实现了外部加密芯片对STM32 MCU程序保护,目前的技术手
    的头像 发表于 10-24 15:01 1668次阅读
    HASH算法<b class='flag-5'>加密</b>芯片的工作原理及其在STM32 <b class='flag-5'>MCU</b>上的应用

    如何对GD32 MCU进行加密

    GD32MCU有哪些加密方法呢?大家在平时项目开发的过程中,最后都可能会面临如何对出厂产品的MCU代码进行加密,避免产品流向市场被别人读取复
    的头像 发表于 01-20 09:30 560次阅读
    如何对GD32 <b class='flag-5'>MCU</b><b class='flag-5'>进行</b><b class='flag-5'>加密</b>?