【转】安全加密(五):如何使用AES防止固件泄露

本文导读算法

 

随着电子产品更新换代速度的加快,每每都会进行系统升级或APP功能维护升级,可是由此产生了两个主要问题。首先,因为更新过程当中出现错误,该设备可能变得无用;另一个主要问题是:如何避免未经受权的用户访问目标产品的固件?安全

 

在嵌入式领域,根据嵌入式系统的MCU存储结构和更新原理,提出了经过加密方式升级设备功能的方法,其中最经常使用的方法为BootLoader加密升级。网络

 

Bootloader 是在操做系统或用户应用程序运行以前执行的一小段程序,经过这一小段程序,咱们能够初始化硬件设备(如 CPU、SDRAM、Flash、串口等)、创建内存空间的映射表,从而将系统的软硬件环境带到一个合适的状态,为最终调用操做系统内核或者用户应用程序准备好正确的环境。函数

 

如何使用BootLoader加密升级能够防止竞争对手/恶意用户得到对固件代码的访问权限?加密

 

首先是使用代码加密来保护固件。这里须要实现对称密码,以及私钥的引导加载程序中的生成和包含。在制造商方面,须要保护相同的私钥,用于加密新固件版本。如图1所示,通常对称加密算法流程。操作系统

对于常见的AES-128加密算法,因为AES处理的单位是字节,128位的输入明文或固件P和输入的密钥K都被分为16个字节,通常咱们会将明文分组用字节为单位的正方形状态矩阵来描述,在每一轮的算法中,状态矩阵的内容不断发生变化,最终的结果做为密文输出。如图2所示,AES-128分块加密。3d

AES算法是基于置换和代替的,置换是数据的从新排列,而代替是用一个单元数据替换另外一个。AES算法使用了多重循环实现置换和代替,在规范中被称为Bytes Sub(字节替换)-对数据的每一个字节应用非线性变换;Shift Rows(行位移变换)-对每一行字节循环从新排序;Mix Columns(列混合变换)-对矩阵的列应用线性变换;Add Round Key(轮密钥加)-对状态和每轮的子密钥进行异或操做。该算法对内存的需求很是低,使得它很适应于资源受限制的环境。指针

 

AES(AES-128)加解密的流程,如图3所示。blog

对于实际AES(AES-128)加密过程当中,在第一轮的迭代以前,会将明文和原始密钥进行异或加密运算,而后正常执行从第一轮到第九轮同样的加密函数,其中都会包含四个操做:字节代换、行位移、列混合和轮密钥加;在最后一轮迭代不执行列混合运算。排序

 

解密的过程仍然为10轮,每一轮的操做都是加密操做的你操做。因为AES一轮的4个操做都是可逆的,所以解密操做的一轮就是执行逆行一位、逆字节代换、轮密钥加和逆列混合;同加密操做相似,最后一轮不执行逆列混合,在第一轮解密以前,执行一次密钥加操做。

 

如图4所示,为Boot Loader固件升级流程图。

 

用户程序升级成功以后,能够经过函数指针的方式调用该程序。函数在编译时都会被分配一个入口地址,该地址就是函数的指针。只要用一个指针变量指向这个函数的入口地址,就能够经过指针变量调用这个函数。函数指针的本质是指针变量,只不过该指针变量指向函数,读出程序标志区的运行地址就能够经过指针变量调用新写入的程序。

 

固件升级的数据加密方案,对于具备IAP功能的芯片具备广泛意义,不只适用于网络远程升级,一样适用于本地升级。至于加密算法能够根据MCU的能力进行灵活选择。

 

例如NXP推出的跨界MCU-iMX.RT1052系列MCU具备强大的安全组件,出于安全目的,数据协处理器(DCP)提供硬件加速和密码算法;其内置加密算法:AES-128(ECB和CBC模式)、哈希算法:SHA-1和SHA25六、CRC-32等。

 

SNVS、DCP内部密钥存储或通用存储器中进行密钥选择,当一个密钥被写入时,内部存储器可存储多达四个AES-128密钥,它只能由DCP AES-128引擎读取。

 

 

来源

相关文章
相关标签/搜索