基于RISC-V的防御侧信道攻击AES软件实现方案

2021-11-02 11:48焦芃源殷树娟李翔宇
微处理机 2021年5期
关键词:掩码字节密钥

焦芃源,殷树娟,李翔宇,李 涵

(1.北京信息科技大学理学院,北京100192;2.清华大学微电子学研究所,北京100084)

1 引言

随着信息技术的飞速发展,信息的安全传输与存储问题也备受关注。高级加密标准(Advanced Encryption Standard,AES)是美国国家标准技术研究所(NIST)在2001年发布的一种分组加密算法,能够满足现代密码学中对加密算法的计算安全性的要求[1],目前已广泛应用于信息加密传输与存储。侧信道分析攻击[2]是利用密码设备在进行加密算法运行期间的能量消耗、时间差异、电磁辐射等信息,根据算法中间值与操作之间的相关性进行密钥破译的技术。其中,能量侧信道分析是一种成本较低的攻击技术。未加防护的AES算法在嵌入式处理器中的软件实现已被证明是可以破解的。焦铬等人[3]针对未加防护的AES算法设计了能量相关性分析平台并成功完成了攻击。诸多防御侧信道攻击的对策也随之出现。此类防御对策可分为隐藏对策和掩码对策两类,均以消除密码设备的能量消耗与加密算法运行密钥及敏感操作的相关性为目标[4]。隐藏对策通过对密码设备进行特殊构建,使得密码设备在各个时钟周期的能量消耗随机化或均等化,以此消除相关性。吴镜聪[5]研究了基于隐藏对策的双轨逻辑和混沌触发器电路的AES算法硬件防护方案。掩码对策则通过对算法运行中间值添加随机掩码的方式使得中间值变得随机化,从而消除相关性。苑志刚[6]研究了抵抗功耗攻击的掩码AES算法在硬件上的实现方案,但其硬件防护方案灵活性较低,可移植性受硬件环境制约。在已有成果基础上,此处使用掩码对策,基于RISC-V架构嵌入式处理器,尝试实现一套全掩码保护的AES算法的软件方案。

2 AES算法结构

AES算法的明文分组和密钥长度为128比特。每个明文分组的加密由10轮操作完成。每轮操作又分为SubBytes(字节替代,也称为S盒操作)、Shift Rows(行移位)、MixColumns(列混淆)和AddRound Key(轮密钥加)四类基本操作。在进行每轮操作时,将每个明文分组看作4×4的16字节状态矩阵参与运算。其中,SubBytes操作可以通过查询一个16×16的S盒来完成,即将状态矩阵的每个字节的高4位和低4位看作S盒坐标来完成字节替换;ShiftRows操作通过将状态矩阵的第i行循环左移i-1个字节来完成;Mixclomuns操作通过将状态矩阵左乘一个常数矩阵来完成;AddRoundKey操作即状态矩阵的每个字节与密钥矩阵相应字节的异或运算。在进行各轮操作之前,还需要进行密钥的扩展,将128比特的密钥分为32位的4组初始密钥参与10轮加密操作前的AddRoundKey操作,由这4组初始密钥再通过密钥编排算法生成40组扩展密钥参与10轮的加密操作。

3 全掩码AES方案软件实现

掩码对策要求算法运行过程中的中间值始终处于被掩码的状态。对中间数据加掩码可以采用布尔掩码的方式。布尔掩码即对算法中间值与掩码进行异或运算。密码算法中的线性函数使用布尔掩码很容易实现。AES算法中的ShiftRows、MixClolumns与AddRoundKey均为线性操作,因此均适合使用与掩码异或的方式来实现防护。SubBytes操作是8位字节输入输出的非线性运算,可使用查表的方式实现。但是使用掩码对查表操作进行防护时需要构造一个形如Sm:Sm(in⊕m)=S(in)⊕m的掩码型的查找表,即满足输入字节in加掩码m后查Sm表的值等于输入字节查S表的值再加掩码。这种查表的方式需要针对每一个掩码值生成一次“Sm”,运算性能非常低。

另一种实现SubBytes运算的方式是使用有限域分解。AES算法中的每一个8位字节均可以看作为有限域GF(28)中的元素[7],SubBytes操作在有限域上的实现可以看作是一个两步的变换:对输入GF(28)元素求乘法逆元和对逆元进行仿射变换。

一个GF(28)元素的求逆运算可以分解为GF(24)元素的加法、求逆、乘法以及平方倍乘运算。GF(24)元素的平方倍乘运算可以分解为GF(22)元素的加法、平方和倍乘运算。GF(22)元素的乘法分解为GF(2)元素的加法、乘法和倍乘运算。通过这样的变换,GF(28)元素的求逆这一非线性运算即可被转换为一系列的线性运算,以此可以使用布尔掩码完成对SubBytes运算的防护。

设SubBytes运算的输入字节A是轮加密过程中的一个中间值,掩码为M,经M掩码后的A记作A。对A求乘法逆元得到A-1;仿射变换后输出字节的掩码为M'。根据文献[8]中的有限域分解法,有:

式中,M=M1Y16+M0Y,M1=m11X4+m10X。

此外,被掩码后的中间值会参与到子域中乘法等非线性运算中,运算后的结果将不是均匀分布的,从而使得防护失效。因此在求逆过程中需要在一些非线性运算的结果加上独立的掩码。在本方案中,对GF(28)元素求逆结果的掩码M进行同样的变换得到校正掩码M'。

整体掩码防护方案流程如图1所示。在C语言下AES输入128比特的明文和初始密钥,使用两个unsigned char数组来存放。首先进行密钥编排生成子密钥。为加快加密过程的速度,程序采用预先离线生成子密钥的方法。定义KeyExpansion()函数实现密钥的编排。44组子密钥均为32位宽,且10轮加密中每轮使用到的4组子密钥均由前一轮加密使用的4组密钥派生得到,故可采用一个循环次数共10次的for循环来实现密钥的派生。循环开始前定义一个有44个unsigned int变量的数组keyA来存放子密钥,并使用掩码mk对各组子密钥进行异或加掩码。密钥编排完成后执行10轮加密前的初始密钥加操作。因为加密轮函数中有字节操作,所以使用unsigned char数组作为AES状态的数据结构。

图1 系统总体方案

初始密钥加操作前先将含有16字节的状态矩阵进行操作,将含有16个unsigned char变量的一维明文数组和存放4组初始密钥的一维数组分别放入二维数组state和k中,然后逐字节执行异或操作。该异或操作被封装在AddRoundkey()函数中,函数的参数为初始密钥、二维数组形式的明文和初始值为0的前一操作输出掩码。因为由于密钥本身是带有掩码的,这使得异或后的状态矩阵也处于被掩码保护的状态。初始密钥加操作的输出掩码为mk。

在后续10轮的轮密钥加操作也使用AddRoundKey函数实现,与初始密钥加操作不同的是,第1~9轮轮密钥加函数参数中前一操作输出掩码的值为列混淆输出掩码mc1'、mc2'、mc3'、mc4'。第10轮轮密钥加操作后需要还原出真实的密文,由于第10轮加密不包含列混淆操作,因此将第10轮轮子密钥掩码与前一操作输出掩码异或后的之传入函数从而消除最终加密密文的掩码。

初始密钥加操作后执行9轮的四个基本加密操作。SubBytes操作使得状态字节的掩码由mk变为mk'。在C实现中,定义函数SubByte()来实现该功能。SubBytes()函数的参数为存放状态矩阵的二维数组state、输入掩码mk,Q和输出掩码mk'。SubBytes函数内使用for循环完成对状态矩阵的每一个字节进行GF(28)求逆和仿射变换的遍历。其中GF(28)求逆过程中使用到对8位字节中1位、2位和4位的数据的运算。故使用三种包含两个位域成员的结构体表示GF(28)、GF(24)、GF(22)元素。

处理过程中涉及到GF(24)元素的求逆、异或、平方倍乘和GF(22)元素的求逆(平方)、异或、乘法、倍乘运算。因此将这些操作封装为7个函数供调用。各运算流程由图2给出。

图2 各算法计算流程

在此定义函数ShiftRows()。函数的参数只有表示状态矩阵的二维数组state。函数体内使用一个for循环遍历数组的每一行,并将每一行的4个unsigned char类型元素左移24、16、8、0位。将移位后的数据的进行按位或运算拼接,转换为一个unsigned int类型的元素,接着对该元素进行循环左移位,再分别右移24,16,8,0位并转换为unsigned char类型的4个元素完成ShiftRows操作。在第1~9轮加密中,由于列混合会导致不同行的混合,使可能具有相同掩码的行的防护失效,故在ShiftRows操作之后对状态矩阵执行重掩码的操作。

定义函数Remasking()。函数参数为表示状态矩阵的二维数组state、状态矩阵各行需要加的掩码mc1、mc2、mc3和mc4以及SubByte操作的输出掩码mk'。在Remasking()函数体中使用for循环遍历数组每一行,对各行元素分别通过异或相互独立的掩码mc1、mc2、mc3和mc4,再通过异或消去mk',以保证在整个过程中不出现未加掩码的中间值。执行重掩码之后可以进行MixCloumns操作,即对状态矩阵左乘一个4×4常量矩阵。

定义MixColumns()函数。函数参数为表示状态矩阵的二维数组state、状态矩阵各行掩码mc1、mc2、mc3、mc4和MixColumns操作输出掩码mc1'、mc2'、mc3'、mc4'。函数体使用一个二维数组来表示该常量矩阵。因为经过MixColumns运算的状态矩阵与相同变换的掩码异或后才能得出正确的运算结果,因此,将各行掩码mc1、mc2、mc3、mc4组成一个4×4矩阵也左乘常量矩阵得出MixColumns操作的输出掩码mc1'、mc2'、mc3'、mc4'。

4 方案测试结果分析

设计方案使用嵌入式C语言完成S盒的有限域分解和整体AES算法掩码防护的程序设计,并使用一款嵌入式开发板运行该软件实现。该嵌入式开发板具有一个32位的RISC-V架构的处理器,并使用RISC-V交叉编译工具链进行程序的编译运行。AES软件实现代码采用AES-128标准文档中提供的明文和密钥样例作为测试数据,并根据标准文档中提供的密文为加密结果的正确性做验证。

程序运行使用的明文、密钥和加密后的密文如表1所示。测试给出的加密结果与AES标准文档样例的结果相同。

表1 AES-128测试结果(16进制表示)

5 结束语

针对能量侧信道攻击对未加防护的AES算法带来的威胁,采用防御能量侧信道攻击的布尔掩码作为对策。对算法中的线性操作进行布尔掩码防护,且针对非线性运算使用布尔掩码过于复杂的问题,将非线性S盒运算进行有限域分解为线性运算并利用掩码保护。通过在一个嵌入式RISC-V处理器上运行了该掩码方案的软件实现,验证了方案的正确性与可行性。

猜你喜欢
掩码字节密钥
幻中邂逅之金色密钥
No.8 字节跳动将推出独立出口电商APP
密码系统中密钥的状态与保护*
No.10 “字节跳动手机”要来了?
低面积复杂度AES低熵掩码方案的研究
基于MSP430的四旋翼飞行器的S-BUS通信协议的设计与实现
TPM 2.0密钥迁移协议研究
基于布尔异或掩码转算术加法掩码的安全设计*
解析网络掩码
一种对称密钥的密钥管理方法及系统