随着电子产品更新换代速度的加快,往往都会进行系统升级或APP功能维护升级,但是由此产生了两个主要问题。首先,由于更新过程中出现错误,该设备可能变得无用;另外一个主要问题是:如何避免未经授权的用户访问目标产品的固件?
在嵌入式领域,根据嵌入式系统的MCU存储结构和更新原理,提出了通过加密方式升级设备功能的方法,其中最常用的方法为BootLoader加密升级。
Bootloader 是在操作系统或用户应用程序运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备(如 CPU、SDRAM、Flash、串口等)、建立内存空间的映射表,从而将系统的软硬件环境带到一个合适的状态,为最终调用操作系统内核或者用户应用程序准备好正确的环境。
如何使用BootLoader加密升级可以防止竞争对手/恶意用户获得对固件代码的访问权限?
首先是使用代码加密来保护固件。这里需要实现对称密码,以及私钥的引导加载程序中的生成和包含。在制造商方面,需要保护相同的私钥,用于加密新固件版本。如图1所示,一般对称加密算法流程。
图1对称加密算法流程
对于常见的AES-128加密算法,由于AES处理的单位是字节,128位的输入明文或固件P和输入的密钥K都被分为16个字节,一般我们会将明文分组用字节为单位的正方形状态矩阵来描述,在每一轮的算法中,状态矩阵的内容不断发生变化,最终的结果作为密文输出。如图2所示,AES-128分块加密。
图2 AES-128加密过程
AES算法是基于置换和代替的,置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES算法使用了多重循环实现置换和代替,在规范中被称为Bytes Sub(字节替换)-对数据的每个字节应用非线性变换;Shift Rows(行位移变换)-对每一行字节循环重新排序;Mix Columns(列混合变换)-对矩阵的列应用线性变换;Add Round Key(轮密钥加)-对状态和每轮的子密钥进行异或操作。该算法对内存的需求非常低,使得它很适应于资源受限制的环境。
AES(AES-128)加解密的流程,如图3所示。
图3AES-128加解密流程
对于实际AES(AES-128)加密过程中,在第一轮的迭代之前,会将明文和原始密钥进行异或加密运算,然后正常执行从第一轮到第九轮一样的加密函数,其中都会包含四个操作:字节代换、行位移、列混合和轮密钥加;在最后一轮迭代不执行列混合运算。
解密的过程仍然为10轮,每一轮的操作都是加密操作的你操作。由于AES一轮的4个操作都是可逆的,因此解密操作的一轮就是执行逆行一位、逆字节代换、轮密钥加和逆列混合;同加密操作类似,最后一轮不执行逆列混合,在第一轮解密之前,执行一次密钥加操作。
如图4所示,为Boot Loader固件升级流程图。
图4Boot Loader固件升级流程
用户程序升级成功之后,可以通过函数指针的方式调用该程序。函数在编译时都会被分配一个入口地址,该地址就是函数的指针。只要用一个指针变量指向这个函数的入口地址,就可以通过指针变量调用这个函数。函数指针的本质是指针变量,只不过该指针变量指向函数,读出程序标志区的运行地址就可以通过指针变量调用新写入的程序。
固件升级的数据加密方案,对于具有IAP功能的芯片具有普遍意义,不仅适用于网络远程升级,同样适用于本地升级。至于加密算法可以根据MCU的能力进行灵活选择。
例如NXP推出的跨界MCU-iMX.RT1052系列MCU具有强大的安全组件,出于安全目的,数据协处理器(DCP)提供硬件加速和密码算法;其内置加密算法:AES-128(ECB和CBC模式)、哈希算法:SHA-1和SHA256、CRC-32等。
SNVS、DCP内部密钥存储或通用存储器中进行密钥选择,当一个密钥被写入时,内部存储器可存储多达四个AES-128密钥,它只能由DCP AES-128引擎读取。
-
嵌入式系统
+关注
关注
41文章
3587浏览量
129435 -
AES
+关注
关注
0文章
103浏览量
33225
原文标题:安全加密(五):如何使用AES防止固件泄露
文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论