何利文,国海轮,安 聪
(南京邮电大学,江苏 南京 210003)
随着信息化的高速发展,智能信息化在深刻影响着人们生活各方面的同时,也带来了信息安全问题,故受到了极大的重视。目前的密码算法已经可以对抗传统的数学分析,如代数分析、差分分析。但最近兴起的侧信道分析[1](side channel analysis,SCA),可以利用密码芯片在加密过程中泄露一些功耗、辐射等信息,这些信息可以帮助攻击者破解密钥。侧信道攻击中利用功耗泄露信息来破解密钥的方法称为功耗攻击(power analysis attack)。功耗分析包括简单功耗分析(simple power analysis,SPA)、差分功耗分析[2](different power analysis,DPA)、相关功耗分析(connection power analysis,CPA)等。
由于侧信道攻击的出现,也产生了许多对抗方法,例如加入掩码、使用数据与功耗不相关的逻辑单元、增加噪声[3]产生电路。该文设计了一种d+1高阶掩码方案,通过将敏感数据拆分成多份来消除明文与功耗之间的相关性。
AES[4]算法是一种对称分组密码算法。AES将分组长度设为128比特、192比特、256比特三种密钥长度。后面以128位的密钥长度为例介绍。加密过程如图1所示。
图1 AES加密过程
目前应用最广泛的三种功耗攻击[5]手段为SPA(简单功耗分析攻击)、CPA(相关功耗分析攻击)、DPA[6](差分功耗分析攻击)。SPA比后面两种方法简单,对一些简单的加密算法是有效的,但对于一些复杂的算法比如AES算法、DES算法,就不容易成功。CPA和DPA的攻击效果比SPA[7]好,目前功耗分析[7]方法的研究主要是后面两种。
相关能量分析(correlation power analysis,CPA)的攻击原理在于电子设备在进行加密操作的时候,它消耗的瞬时能量[8]和数据以及所进行的操作是相关的。攻击者需要从芯片设备上测量出大量的实时功耗数据,再通过建立功耗仿真模型计算出一组特定中间数据的预期功耗[9]。其理论基础是皮尔森相关系数[10]。
DPA通过采集大量明文功耗与数学统计相结合,比较假设的中间值与实际功耗值之间的相关性来猜解出密钥[11]。
第一步:输入随机明文并记录功耗轨迹。将n组随机明文c=[c0,c1,…,cn](n为一个较大的值,输入明文相互独立且随机逐一输入到加密芯片中进行加密运算。
第二步:计算区分函数D(mi,kj)。对于一个8比特的密钥数据,将猜测密钥K-guess进行0到255之间的遍历猜测。
第三步:功耗波形子集划分。如第二步所示,对于猜测密钥kj其对输入明文mi进行区分函数的运算,且每个明文mi对应着一组功耗波形数据。
第四步:计算差分功耗波形。步骤3中已经划分出两个功耗波形子集,对两个集合取平均和进行差分操作运算。
第五步:比较差分功耗波形峰值。在对256个猜测密钥猜测完毕后得出256组差分功耗波形数据。取每一组差分功耗波形的峰值进行比较,其中最大峰值对应的猜测密钥最有可能是真实的隐藏密钥。
通过对敏感数据拆分为多份来消除明文与功耗的相关性。以汉明重量为随机种子生成随机掩码,用于高阶掩码刷新算法;重新设计了S盒,它由求逆运算和仿射变换组成,该方案对这两部分进行重新设计,新S盒采用按列的变换方式进行,由原来的查表操作变为平方乘运算。在加密过程中保证中间状态的敏感数据被随机拆分为d+1份,其中任意一份与原来的状态值独立。
具体过程为:将明文信息拆分为d+1份(d为正整数),并根据随机掩码算法生成随机值掩码。首先将拆分的d+1份明文和掩码的异或结果进行加密。前九轮依次执行字节替换、行移位、列混淆、轮密钥加操作,最后一轮进行密钥列混淆操作,然后将d+1份结果异或得到最终的密文。
加密算法高阶掩码实现时,在计算过程中每个敏感变量[12]x被随机分割为d+1份共享x0,x1,…,xd。满足x0⊕x1⊕…⊕xd=x。每个掩码变量涉及到d个掩码时称为d阶掩码。方案满足下面2个性质:
(1)完整性:d个异或的结果必须产生预期的密文。
(2)d阶安全性:任何由d或者少于d的中间变量组成的元组必须独立于任何敏感变量。
假设掩码是均匀分布的,加入的掩码使得计算的每个中间变量统计上独立于任何敏感变量。所以利用中间变量相关的信息泄露的侧信道攻击不再那么顺利。d阶掩码理论上容易受到d+1阶SCA攻击。SCA利用d+1中间变量相关的信息泄露,信息的泄露取决于敏感变量。然而随着d的增加这种攻击变得不切实际,使得高阶掩码成为一种合理的解决方法。
安全乘法[13]是本方案的关键步骤,主要是在S-box阶段运用。在设计S盒时,字节替换的求逆和仿射变换必须重新设计,所以必须对之前的非线性操作做安全乘法。
安全乘法:
Ishai等人[14]提出了一种高阶掩码ISW方案。用来保护任意d阶的硬件电路。假设要保护的电路都是由非和与门组成的,用掩码值将电路转换成一个新的保护电路。主要的问题是如何保护与门的安全,为此他们提出了下面的方案。
(1)0≤i≤j≤d,选一个随机数ri,j。
(2)0≤i≤j≤d,计算:
rj,i=(ri,j⊕aibj)⊕ajbi
(3)0≤i≤j≤d,计算:
ci=aibj⊕⊕j≠iri,j
虽然ISW方案理论上很安全,但它的实现开销很大。每个与门通过(d+1)2和2d(d+1)异或门进行编码。它要求在每个时钟周期产生d(d+1)2个随机比特数据。对于AES算法来说,对S盒做屏蔽会增加电路的门数。随着d的增加门电路数急剧增加。
AES加密包括轮密钥加、字节替换、行移位、列混淆操作。其中只有S-box[15]是非线性的,也是掩码方案的主要困难。
该d+1阶掩码方案通过加入掩码[16]来增加抗功耗攻击操作。还是以异或方式为基础设计了AES算法中的安全乘法、安全S盒、安全行移位与安全列混淆。
Masking SubBytes:
方案主要包括对任意d阶幂函数做屏蔽。和Blomer等人[17]的方案相比,该文的求幂对d阶的掩码是安全的。
根据前面的知识,需要设计安全的求逆即(c0,c1,…,cd)←SecMult((a0,a1,…,ad),(b0,b1,…,bd))。
Blomer等人[18]已经描述过d=1阶的,核心思想是对一阶掩码输入做求幂比如平方乘算法,同时保证进行掩码校正。Rivain和Prouf[19]提出了一种对d阶掩码输入进行运算的求幂算法,并保证d阶SCA安全。虽然这种方法的乘法只达到了4次,但是需要7次额外的平方操作。在求逆的过程中将其减少到2,并且不需要平方。Rivain and Prouff改进了之前的求逆操作[13],将乘法次数从13减少到4次。
安全求逆算法:
随机掩码算法rand():
首先确定随机掩码个数为16个,需要生成16个[0,8]的汉明重量HWi={1,3,6,0,2,4,5,7,8,1,4,5,2,8,6,3}的不同取值确定相应的随机掩码字节,比特1的位置随机放置。
RefreshMasks掩码刷新算法:
对仿射变换[20]做掩码操作很容易,其中需要注意如果d是偶数要异或0x63。
安全S盒:
AES密钥扩展产生一个4*4(Nr+1)字节数组w。称为密钥表,其中Nr是轮数,w*,j表示w的第j列。每一组4列(w*,4r-3,w*,4r-2,w*,4r-1,w*,4r)组成一圆键Kr,并在第r个轮密钥加阶段异或到状态矩阵。Subword接受一个四字节输入并将AES S-box应用于每个字节,让Rotword以一个四字节作为输入,从上往下循环移动一个字节。轮常量异或Rcon。密钥列表w的第j列被定义为w*,j=w*,j-Nk⊕t。
T=
为了安全地进行d阶密钥扩展[21],将w分为d+1个w0,w1,…,wd。每个共享的第一列都填满了刚开始时的密钥共享。每次新的时间表列w*,j重新计算,它的d+1份计算如下:
(wi)*,j=(wi)*,j-Nk⊕ti
ti表示w的四个字节的共享安全计算得到t的4个字节的共享w*,j-1,从上面的描述可以很容易推导出这样的安全计算。Subword通过之前描述的安全s-box计算应用于字节共享(w0)l,j…(wd)l,j为每个row-coordinatel∈[1,4]。因为Rotword相对于异或是线性的,所以它会分别应用于每一份分享。最后Rconj/Nk必须添加到t,它被添加到它的每一份如t0。
密钥扩展算法:
1.forj=1 toNkdo
2.fori=0 toddo (wi)*,j←(ki)*,j
3.forj=Nk+1 to 4*(Nk+1) do
4.fori=0 toddoti←(wi)*,j-1
5.if(jmodNk= 0) or (Nk= 8)
and (jmodNk= 4) then
6. forl=1 to 4 do
((t0)l…(td)l)←SecSbox((t0)l…(td)l)
7.if(jmodNk=0) then
8.fori=0 toddoti←RotWord(ti)
9.t0←t0⊕Rconj/Nk
10.fori=0 toddo
(wi)*,j-1←(wi)*,j-Nk⊕ti
AES操作一个4*4的状态矩阵,由明文初始化,加密结束时得到密文。AES加密1到9轮,每轮由4个阶段组成:轮密钥加、字节替换、行移位、列混淆。最后一轮没有列混淆。AES加密有10、12和14轮,轮数取决于密钥长度。
加密开始前密钥已经被掩码屏蔽,并且把其分为d+1份作为加密输入。开始的时候状态矩阵(16个明文)被分为d+1个状态s0,s1,…,sd。满足s=s0⊕s1⊕…⊕sd。在加密结束时d+1份异或得到密文。
Masking AddRoundkey:每轮的轮密钥加操作是每个状态和对应轮的密钥异或得出的,如下:s⊕kr=(s0⊕k0)⊕…⊕(sd⊕kd)
Masking ShiftRows and MixColumns:
行移位和列混淆都属于线性变换[22],对于行移位,状态的最后三行中每行分别循环移动1个字节、2个字节、3个字节;对于列混淆,将状态的每列看作有限域上的一个多项式,通过系数合并得到c(x)=3x2+2x2+x+2,然后在modulo(x4+1)下将它与一个固定多项式进行乘法操作。
因为这两个算法都是线性的,所以对它们加入掩码相对来说比较容易,只要将它们分别对应于每个状态共享[23]即可。
ShiftRows(s)⊕ShiftRows(si)
MixColums(s)⊕MixColums(si)
完整AES加密算法过程:
1.s0←p
2.fori= 0toddo
3.si←rand(16*8)
4.s0←s0⊕si
1到9轮
5.forr= 0 toNr- 1 do
7.forl= 1 to 4,j= 1 to 4 do
8.((s0)l,j…(sd)l,j) ←SecSbox((s0)l,j…(sd)l,j)
9.fori= 0 toddo
si←MixColumns(ShiftRows(si))
最后一轮
11.forl= 1 to 4,j= 1 to 4 do
12.((s0)l,j…(sd)l,j) ←SecSbox((s0)l,j…(sd)l,j)
13.fori= 0toddosi←ShiftRows(si)
15.c←s0
16.fori=1 toddoc←c⊕si
验证设计方案的正确性,中间16个字节被分为四份,四份的异或结果为密文。由于篇幅限制该文只给出最后一轮结果,见表1。由最后的密文可以看出,该方案设计是正确的。
表1 异或结果
ChipWhisperer[19]是一个完全开放的嵌入式硬件安全研究平台,可用于基于硬件加密系统或软件加密系统的侧信道攻击实验平台。它里面包含了一系列可用于侧信道分析的软硬件工具集,如目标加密设备、低功耗采集设备、功耗分析软件等。用到的设备为ChipWhisperer-Lite Board和XMEGA[24]Target Board(CW303)。上述方案用C语言实现,然后对XMEGA设备进行编程,将写好的代码传到目标设备。实验对没有添加掩码和添加掩码的AES算法进行功耗攻击,攻击点选取在S盒之后。表2是攻击结果,对16字节密钥的攻击。
表2 无掩码AES算法CPA攻击结果
表2中的结果是由ChipWhisperer平台的 Analyzer工具分析实现的,图中第一排即为破解出来的密钥,在分析时,每一个字节所有猜测密钥都进行计算,采用的是相关系数公式计算假设功耗和真实功耗的相关程度,相关度越高密钥排名越靠前。由于没有加入掩码进行防护中间值很容易泄露,密钥轻松地就被破解。
由表3可以看出,最后的密钥都没有被成功破解,原因在于S盒替换不同于之前的查表操作,而是采用按列的变换进行的,加密过程中所有敏感数据被随机拆分为d+1份进行计算,每一份都与原来的状态独立,而且小于d份异或结果和原来的状态也是独立的。从表3可以看出,每个密钥都没有正确计算出来。该方案降低了中间状态值和实际功耗的相关性,最终密钥没有被破解,而且加密出来的密文和未添加掩码的结果是一样的,表明了设计方案的正确性。
表3 文中方案结果
从表4可以看出,随着明文条数的增加,添加了掩码的AES算法因为消除了功耗之间的相关性,因此能抵抗高阶功耗攻击。
表4 随机明文功耗相关性对比
提出了一种d+1的高阶掩码方案抵抗高阶功耗攻击。该方案以汉明重量为种子刷新掩码,构造了有限域上的安全乘法,采用平方和实现有限域上的求逆变换,再结合仿射变换实现S盒的替换,提高了新S盒的替换速度,并且保证安全。实验结果表明该方案相比已有的方法在一定程度上有很大优势。尽管该方案是运用在AES加密算法上来实现的,但可以运用到类似的密码算法上来抵御功耗攻击。加密算法作为芯片的灵魂,对芯片安全起着重要作用。随着AI技术的快速发展,侧信道攻击结合AI技术使得加密算法变得更容易破解。如何在保证加密效率不变的情况下,加密算法可以抵御高阶差分功耗攻击将会是未来的研究重点。