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


    本文导读

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

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

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

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

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

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

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

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

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

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

    如图4所示,为Boot 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引擎读取。

    来源

  • 相关阅读:
    C/C++内存管理 笔记
    RAII惯用法:C++资源管理的利器
    JS、Flash 实现复制功能 (浏览器兼容)
    JS页面刷新实现方法总结
    php 一些常用的语句
    使用ZeroClipboard解决跨浏览器复制到剪贴板的问题
    window.opener.location.reload() and href()的区别 弹出页修改后刷新父窗体
    查看Mysql数据库大小
    JQUERY操作集锦
    十进制正整数转换成六十二进制
  • 原文地址:https://www.cnblogs.com/skullboyer/p/9335127.html
Copyright © 2020-2023  润新知