侧信道攻击遇见安全网络协议
亚历克斯·比留科夫、丹尼尔·迪努(B)和扬·勒科雷
卢森堡大学SnT,卢森堡埃施苏阿尔泽特丰特大道6号,邮编4364
{alex.biryukov,dumitru‐daniel.dinu,yann.lecorre}@uni.lu
1 引言
侧信道攻击通过观察密码算法实现执行过程中的行为来恢复秘密信息。在众多侧信道攻击中,相关功耗分析(CPA)[5]是一种非常高效且可靠的技術。其成功得益于获取侧信道信息时所采用的最低侵入性方法。最常用的侧信道泄漏来源包括被攻击设备的功耗或电磁(EM)辐射。
如今,高级加密标准 [23] 是使用最广泛的对称加密算法。它被广泛用于保护传输中的数据或静态数据。各种网络协议依赖高级加密标准的不同工作模式来提供诸如机密性和真实性之类的安全服务。高级加密标准的应用范围从高性能服务器和个人计算机延伸到无线传感器节点等资源受限设备。自从高级加密标准成为对称密码标准以来,尽管其算法及其实现的安全性一直受到严格审查,但除少数显著例外情况外,大多数先前的研究主要集中在高级加密标准本身,而非其在复杂系统中的应用。
迄今为止,侧信道文献中报道的大多数实验结果都是针对高级加密标准实现的。这些研究通常假设攻击者对高级加密标准输入具有完全控制权。然而在现实世界的通信协议中情况并非如此,因为输入的大部分通常是固定的,只有少数字节是可变的。此外,有时攻击者无法控制这些可变字节,而必须被动观察目标算法的执行过程,而不能自行随意触发加密操作。除了少数例外情况外,[16,24],基于高级加密标准的通信场景的安全性在面对侧信道攻击时迄今尚未得到充分分析。因此,在本文中,我们首次分析了在对通信协议实施侧信道攻击时,攻击者需要对高级加密标准输入具备多少控制能力才能恢复密码算法的密钥。
物联网(IoT)中的许多通信标准,例如IEEE 802.15.4[15]和 LoRaWAN [21]使用高级加密标准来加密和认证介质访问控制(MAC)层帧。802.15.4标准采用AES‐CCM的一种变体,而LoRaWAN则使用AES‐CMAC [9,34],。相同的CCM模式与高级加密标准结合用于加密IPsec封装安全载荷(ESP)[14]。根据[29] IEEE 802.15.4的安全架构依赖于四类安全套件:无、AES‐CTR、AES‐CBC‐MAC和AES‐CCM。图1展示了在IEEE 802.15.4协议中使用的AES‐CTR和AES‐CCM模式的一个典型输入。在此特定示例中,攻击者最多可以操纵12个字节的输入(源地址和帧计数器),而其他输入字节(标志位、密钥计数器和块计数器)是固定的。文献[24]中描述的针对IEEE 802.15.4无线传感器节点的攻击仅假设控制四个输入字节(帧计数器),其余输入字节为常量。因此产生了以下问题:攻击者在注入的消息中需要更改多少个输入字节,才能在不触发任何网络保护机制的情况下完全恢复主密钥?
| 标志位 | 源地址 | 帧计数器 | Key Ctr | 块计数器 |
|---|---|---|---|---|
| 1字节 | 8字节数 | 4字节数 | 1字节 2字节 |
图1. IEEE 802.15.4 中使用的 AES‐CTR 和 AES‐CCM 模式的第一个输入块。
尽管许多网络协议使用高级加密标准来保障终端节点之间的通信安全,但主要的密码学库(如OpenSSL[25]和ARM mbed TLS [2])并未为不支持 AES‐NI指令集的设备提供针对高级加密标准的侧信道防护实现,而大多数物联网设备正是属于此类情况。因此,有必要对在通信协议中使用的非保护实现的高级加密标准进行详尽的安全性分析。只有通过如此细致的分析,才能评估侧信道攻击对采用高级加密标准非保护实现的现实世界系统安全性所产生的影响。
在本研究中,我们选择重点关注CPA攻击,因其具有较高的效率和可靠性。我们采用非侵入式测量设置,因此选取目标处理器的电磁辐射作为侧信道泄漏源。目标设备是意法半导体STM32 Nucleo [32]开发板上的ARM Cortex‐M3处理器。这类处理器广泛应用于低功耗场景,符合物联网应用的需求。
如果整个生态系统在设计时没有考虑安全性,那么物联网将成为一场安全噩梦。尽管许多物联网通信协议仍处于形成阶段,但物联网的威胁模型尚未被充分理解,尽管人们普遍认为其攻击面很大。虽然我们重点关注一种特定的侧信道攻击(即功耗/电磁攻击),但其他侧信道攻击,如时序、故障、缓存或数据残留攻击,可能对物联网生态系统的安全性构成相似甚至更高的威胁。那些不利用侧信道信息的攻击(例如用于攻破联网计算机的攻击)也不应被忽视,因为它们在某些方面相较于侧信道攻击具有优势。因此,我们的工作通过揭示需要采取侧信道防护措施来防范一个某种程度上被忽视的威胁,为物联网的安全拼图增添了重要的一块。
研究贡献
本文首次对用于保护各种通信协议的高级加密标准软件实现的所有可能攻击场景进行了全面分析。首先,我们提出了一种用于对高级加密标准的给定输入状态进行符号处理的算法。该算法输出为恢复密钥所需攻击的轮数和字节。然后,利用此算法,我们根据恢复主密钥所需攻击的轮数对所有可能的输入进行分类。结果得到一组25个独立的评估情况。其次,我们描述了一种最优算法,该算法使用上述符号表示,通过CPA攻击来恢复高级加密标准的主密钥。该算法探索所有可能的输入密钥字节组合,并排除无效的密钥候选,从而在提供足够数量且具有较佳信噪比的功耗轨迹时,仅产生正确的主密钥。随后,我们在分类步骤中确定的25种评估情况下,使用ARM Cortex‐M3处理器的轨迹对攻击算法的结果进行了评估。
我们的结果表明,知名且广泛使用的密码学库中流行的高级加密标准实现可以通过 CPA攻击被破解。唯一的要求是,AES输入的一部分是已知且可变的,其余部分为常量,这在通信协议中是一个常见场景。了解AES的实现策略可以提升攻击结果,但并非关键。本文介绍的所有软件工具均为公共领域1以支持结果的可重现性并最大化可重用性。
2 预备知识
2.1 高级加密标准的描述
我们简要描述了高级加密标准 [23] ,以回顾该算法的相关方面,并介绍本文中使用的符号。有关高级加密标准算法的更多细节,我们建议读者参考官方技术规范。
高级加密标准使用具有三种不同密钥长度(128、192和256位)的 Rijndael密码[8]的128位块长度版本。轮函数根据密钥长度对 4× 4字节状态矩阵应用10、12或14次。该轮函数包含四个变换:字节替换、行移位、列混淆和轮密钥加。最后一轮函数不包括列混合变换。
设 si,j 为位于第 i 行第 j 列(0 ≤ i, j ≤ 3)的状态字节, kl 为对应的轮密钥字节(l= 16·r+i+4·j), r 为轮数。在应用轮密钥加变换后,状态矩阵中的每个字节变为 s′ i,j= si,j ⊕ kl,其中“⊕”符号表示两个8位值的按位异或运算。非线性的字节替换操作使用一个8位S盒 S 对状态的每个字节进行如下变换:s′ i,j= S[si,j]。行移位变换将第 i 行向左循环移动 i 字节。在列混淆变换中,对状态矩阵的每一列应用在 GF(28) 上的多项式乘法。“•”符号用于表示 GF(28) 中两个数的乘法,而 {01}、{02} 和 {03} 是表示来自 GF(28) 元素的 8位向量。
密钥扩展将主密钥扩展为16字节的轮密钥。轮常数数组Rcon包含规范中描述的{02}在 GF(28)中的幂。
2.2 相关性功耗分析
相关功耗分析(CPA)[5]是一种侧信道攻击,攻击者将目标密码算法某个敏感中间值的功耗模型与运行该算法的设备所测得的功耗或电磁辐射(EM)进行相关性分析,然后选择产生最大相关系数的密钥假设作为最可能密钥。与经典的差分功耗分析(DPA)[17]攻击相比,CPA攻击在效率、鲁棒性和实验次数方面具有若干优势,但对资源的需求更高。Agrawal et al.[1]
1 https://github.com/cryptolu/aes-cpa.
将目标设备的电磁辐射引入作为侧信道攻击的泄漏源。
相关功耗分析攻击(CPA)可分为两个阶段:采集阶段和攻击阶段。在采集阶段,攻击者针对不同的输入,观察并记录目标设备的泄漏信息(功耗或电磁辐射)。采集功耗轨迹需要在目标设备的电路中插入一个电阻,以测量其两端的电压;而对电磁辐射的观测则是非侵入式的,仅需将电磁探针放置在泄漏位置附近即可。在攻击阶段,攻击者将这些观测结果与选择函数的建模功耗进行相关性分析,以恢复密钥。选择函数将已知输入与待恢复的密钥材料相结合。
在本研究中,我们重点关注运行各种高级加密标准软件实现的、时钟频率为8兆赫兹的ARM Cortex‐M3处理器的电磁辐射。采集工作通过Langer RF‐K 7‐4 H场探头在芯片上方某一点完成。信号经30dB放大后输入至 Teledyne LeCroy WaveRunner 8254M‐MS示波器,采样率为500兆样本每秒。有关测量设置的更多细节,请参阅本文的完整版本。
2.3 攻击临时密钥字节
为了攻击计数器模式下的高级加密标准,贾菲提出了一种将差分功耗分析攻击传播到后续轮次的技术。当高级加密标准输入中仅有少数密钥字节已知且可变,而其余字节为未知的固定(常量)时,该技术可以被使用[16]。接下来我们简要描述如何将未知的固定字节合并到一个轮密钥字节中,以恢复一个临时密钥字节。然后,利用这些临时密钥字节,可将攻击推进到后续轮次,直到恢复足够的轮密钥字节以逆向推导出密钥扩展。
使用CPA攻击,攻击者只能恢复在轮密钥加变换中与可变且已知的状态字节进行异或运算的那些密钥字节。贾菲技术的核心在于,当轮密钥加变换的某个输入字节是列混淆变换对至少一个已知且可变的输入字节进行操作的结果,而其他输入字节为未知且常量时,攻击者仍然可以恢复该临时密钥字节。
为了更好地说明该技术的工作原理,让我们考虑执行第一轮函数后第一个状态字节 s′ 0,0:
s′ 0,0=({02}• s0,0)⊕({03}• s1,1)⊕({01}• s2,2)⊕({01}• s3,3)⊕ k16
假设现在输入字节s0,0和s1,1已知且可变(密钥字节 k0和 k5已通过针对第一轮字节替换变换的侧信道攻击成功恢复),而其他输入字节(s2,2和s3,3)未知但固定。因此,s′ 0,0可表示为({02} • s0,0) ⊕({03}• s1,1)⊕ k′ 16,其中常量部分包含在临时密钥 k′ 16中,该临时密钥将通过攻击第二轮的字节替换变换来恢复;k′ 16 =({01}• s2,2)⊕({01}• s3,3)⊕k16。该临时密钥 k′ 16 使得下一轮中四个状态字节的计算。通过这种方式,攻击被推进到后续轮次,直到所有状态字节都被获取;从而可以恢复真实的密钥字节。
当三个输入字节已知且可变时,该技术的工作方式类似。然而,当仅有一个输入字节已知且可变时,攻击者将恢复密码状态同一列中两个字节的两个同等可能的密钥候选。例如,当仅有s3,3已知且可变,而其他输入字节未知且固定时,则s′0,0=({01}• s3,3)⊕k1′6和s′1,0=({01}• s3,3)⊕ k1′7。因此,攻击其中任意一个,攻击者都将得到两个同等可能的密钥字节(k1′6和 k1′7)。如果状态字节未按顺序被字节替换变换处理,则攻击者将无法确定哪个密钥字节对应s′0,0,以及哪个密钥字节对应s′ 1,0。
2.4 高级加密标准的软件实现
根据执行时间、代码大小和RAM消耗要求,高级加密标准在软件中有多种实现方式。影响实现策略的其他因素包括密码算法的操作模式以及需要加密的明文块数量。施瓦布和斯托费伦[30]确定了四种不同的高级加密标准软件实现策略:传统方法、T表、向量置换和位切片。在本文中,我们考虑以下两种与安全通信协议相关的高级加密标准实现方法:
– 直接实现(S盒策略)执行上述四个轮变换。替换层通过基于S盒 S的256字节查找表实现。这种实现方式适用于8位架构。
– 基于查找表的实现(T表策略)使用四个各为1024字节的查找表(T0、 T1、 T2和 T3),以每轮16次查找表访问、16次掩码操作和16次异或运算的代价,完成SubBytes、ShiftRows 和MixColumns操作(最后一轮除外)。一种低内存替代方案仅使用一个T表,但每轮需额外执行12次旋转操作。该策略最初由Rijndael的设计者[8]提出,可在32位平台实现非常快速的实现。
我们没有分析位切片或向量置换实现,因为由于以下限制,此类实现在密码学库中并不常见。位切片实现至少并行处理两个块,因此只能应用于非反馈操作模式。向量置换实现需要支持向量置换指令,但大多数物联网资源受限的微控制器不支持此类指令。
表1给出了对不同开源密码学库所使用的现有高级加密标准实现的分析。对于不支持AES‐NI [13]指令的平台,诸如OpenSSL[12,25]或mbed TLS等流行密码学库中高级加密标准的默认实现使用了
| 库 | 语言 版本 最后更新 | AES‐NI | T表 |
|---|---|---|---|
| Botan [27] | C++ 2.1.0 2017年4月 | ✓ | ✓ |
| cryptlib [6] | C 3.4.3 2017年2月 | ✓ | ✓ |
| Crypto++[7] | C++ 5.6.5 2016年10月 | ✓ | ✓ |
| Libgcrypt [18] | C 1.7.6 2017年1月 | ✓ | ✓ |
| libtomcrypt[10] C语言 | 1.17 2017年4月 | ✗ | ✓ |
| libsodium [19] | C 1.0.12 2017年3月 | ✓ | ✗ |
| mbed TLS[2] | C 2.4.2 2017年3月 | ✓ | ✓ |
| Nettle [22] | C 3.3 2016年10月 | ✓ | ✓ |
| OpenSSL [25] | C 1.1.0e 2017年2月 | ✓ | ✓ |
| wolfCrypt [35] | C 3.10.2 2017年2月 | ✓ | ✓ |
T表方法。除了libsodium [19],之外,所分析的所有其他密码学库都具有基于 T表策略的高级加密标准实现。此外,这些实现未针对差分功耗分析或缓存攻击等侧信道攻击进行防护。众所周知,未受保护的密码算法实现很容易成为差分功耗分析攻击的目标。最近,Rambus密码学研究部门的研究人员已经表明,即使是基于AES‐NI指令的未受保护软件实现也可能遭受差分功耗分析攻击[28]。如[20,26]所示,高级加密标准的T表实现容易受到各种缓存攻击的影响。尽管未受保护的T表实现易受侧信道攻击,但在表1中考虑的十个库中有九个采用了此类高级加密标准实现。
3 量化泄漏
Biryukov et al.[4]引入了相关系数差度量,用于在CPA背景下分析不同选择函数的泄漏情况。相关系数差异 δ表示正确密钥的相关系数与最可能密钥猜测的相关系数之间的差值,其中最可能密钥不同于正确密钥。
我们使用相关系数差异来量化基于高级加密标准S盒和基于高级加密标准 T表的两个选择函数的泄露信息。这两个选择函数定义如下:
ϕ1: F 8 2 → F 8 2 , ϕ1(x ⊕ k)= S(x ⊕ k)
ϕ2: F 8 2 → F 32 2 , ϕ2(x ⊕ k)= T(x ⊕ k)
表2。 相关系数差异 δ正确密钥的相关性与最可能密钥的相关性之间的[4],对于正确密钥的不同汉明权重;¯; δ和SEδ¯分别为95%置信区间的均值和标准误差。泄露信息来自 ARM Cortex‐M3处理器。
| 正确密钥 0x00 0x01 0x03 0x07 0x0F 0x1F 0x3F 0x7F 0xFF | δ¯ SEδ¯ | |
|---|---|---|
| ϕ1 | 0.104 0.072 0.143 0.074 0.070 0.126 0.078 0.044 0.028 | 0.028 |
| ϕ2 | 0.146 0.126 0.108 0.156 0.126 0.960 0.153 0.140 0.084 | 0.126 |
(a) S盒 (b) T表 图2. 高级加密标准 (AES) (a) S盒和(b) T表在所有可能输入组合下的输出汉明权重分布。
在使用模拟泄露信息时, ϕ1和 ϕ2的相关系数差异值分别为0.813和0.7。这些值与所使用的正确密钥无关。在模拟环境中,这两个选择函数的泄露信息量很高,且它们之间的差异约为第一个值的14%。另一方面,基于ARM Cortex‐M3处理器获取的泄露信息,在不同正确密钥取值下的平均相关系数¯差异 δ如表2所示。测量是在500 MS/s的采样率下,使用分析的选择函数的汇编实现进行的。将采样率提高到1 GS/s并不会¯显著改善结果。平均相关系数差异 δ对于两个选择函数均为正值,这意味着它们泄露了足够的密钥信息,使得攻击者只需一次密钥猜测即可恢复键字节。实际上,基于AES S盒的选择函数比基于AES T表的选择函数多泄露约50%的信息。这可以通过两种选择函数在所有可能输入组合下的汉明权重分布来解释(见图2)。
读者可以很容易地在图2a中观察到,AES S盒情况下数值的分布遵循二项式分布。另一方面,如图2b所示的AES T表情况下数值的分布则不像二项式分布。此外,在32种可能的输出值中从不出现的数值(即1、2、3、4、6、7、25、26、27、28、29、30、31和32)。这两个选择函数 ϕ1和 ϕ2输出的汉明权重分布之间的差异解释了为何使用相关系数差异进行量化时, ϕ1的泄漏大于 ϕ2的泄漏。这意味着,针对基于T表策略实现的CPA攻击相比基于S盒策略实现的CPA攻击需要更多的努力(即功耗轨迹)。
4 生成评估情况
在本节中,我们描述了一种对给定初始状态进行符号处理的算法,以确定恢复高级加密标准主密钥所需的轮数。我们使用该算法来探索所有可能的攻击情况,并为我们的场景选择相关的评估情况。该算法依赖于对位于第 r轮开始时AES状态中第 i行和第 j列字节的如下符号表示:
sri,j=
⎧ ⎪⎨ ⎪⎩
0 ,对应的密钥字节无法被恢复
1,对应的密钥字节能被恢复
−n, n临时密钥字节能被恢复
因此,如果字节sri,j的符号表示不同于0,则为可变;若其符号表示为0, 则为固定(常量)。由于列混淆变换,第 r+ 1轮状态的每一列都可以表示为第 r轮状态中四个字节的函数。在第 r+ 1轮开始时,状态的每个字节将根据以下规则进行更新: – 如果可变输入字节数为0,则输出字节的符号表示设置为0;
– 如果可变输入字节数为1,则输出字节的符号表示按如下方式更新:
•如果在列混淆变换中,可变输入字节被{01}相乘,则输出字节的符号表示设置为−2p+1,其中 p是独立输入对的数量。一对新的值被添加到输出字节;
•否则,输出字节的符号表示设置为 −2p;——如果可变输入字节数为2或 3,则输出字节的符号表示设置为‐1;——如果可变输入字节数为4,则输出字节的符号表示设置为1。
除了更新状态的符号表示外,该算法还为状态中的每个字节维护一个密钥对列表,并将该列表传递到下一轮。当某一轮中所有字节的符号表示均为1时,算法停止。它输出状态的符号表示以及相关的密钥对。这些信息可用于计算轮数
恢复主密钥所需的可能主密钥数量。该算法的伪代码在本文的完整版本中给出。
图3给出了当初始状态的第一个字节为可变且已知,而其他字节为固定且未知时,该算法工作原理的图形表示。通过攻击第一轮中对状态的第一个字节应用字节替换变换后的结果,可以恢复密钥字节 k0。该已恢复的密钥字节使攻击得以延续至第二轮,在此可以攻击字节替换变换的结果以恢复四个密钥字节(k′ 16, k′ 18, k′ 17和 k′ 18,因此向对应的状态字节 添加一个新的对 S1={1}。随后,攻击者将目标转向第三轮,在此可以恢复所有状态字节的临时密钥字节。前一轮中的对 S1影响状态的第三和第四列的所有字节,因此对应的对为
表3. 攻击者控制不同字节数(字节数)时的可能攻击结果。需攻击的轮数 是指为恢复主密钥所需攻击的轮数。比例(%) 是指在攻击者控制的字节数固定的情况下,某一评估情况占所有可能输入配置的比例。
| 字节数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 最小轮数(Rnds) | 4 | 4 | 4 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 1 |
| 比例(%) | 100 | 100 | 100 | 14.1 | 35.2 | 55.9 | 72.7 | 84.7 | 92.3 | 96.7 | 98.9 | 99.8 | 100 | 100 | 100 | 100 |
| 最大(轮数) 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 3 | 3 | 3 | 1 | |
| 比例(%) | 100 | 100 | 100 | 85.9 | 64.8 | 44.1 | 27.3 | 15.3 | 7.7 | 3.3 | 1.1 | 0.2 | 100 | 100 | 100 | 100 |
| 权衡 | ✗ | ✗ | ✗ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
侧信道攻击遇见安全网络协议 445
相应地进行了更新。此外,当攻击者无法区分密钥候选时,会添加新的对,如图3所示。在第四轮中,攻击者能够恢复所有轮密钥字节。然后,通过获得第四轮的所有轮密钥字节,她可以逆向AES密钥调度以获取主密钥。
攻击者需要构建 2p个可能的轮密钥,其中 p是与最后被攻击轮次的状态字节相关联的独立对的数量。对于图3中的示例,可能的密钥数量为 25,因为 card(S)=card(S6 ∪ S7)= card({1, 2, 3, 4, 5})= 5。因此,除了要攻击的轮数之外,初始状态的符号处理算法还给出了攻击者需要恢复的可能主密钥的数量。然而,
表4. 所有评估情况及其每个评估情况的可能初始状态示例。 字节数 表示由攻击者控制的字节数; 轮数 表示为恢复主密钥需要攻击的轮数。
| Case | 字节数 | 轮数 可能的初始状态 |
|---|---|---|
| 0 | 1 | 4 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
| 1 | 2 | 4 [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
| 2 | 3 | 4 [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
| 3 4 | 4 4 | 3 4 [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
| 5 6 | 5 5 | 3 4 [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] |
| 7 8 | 6 6 | 3 4 [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] |
| 9 10 | 7 7 | 3 4 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0] |
| 11 12 | 8 8 | 3 4 [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0] |
| 13 14 | 9 9 | 3 4 [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0] |
| 15 16 | 10 10 | 3 4 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0] |
| 17 18 | 11 11 | 3 4 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0] |
| 19 20 | 12 12 | 3 4 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0] [1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1] |
| 21 | 13 | 3 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0] |
| 22 | 14 | 3 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0] |
| 23 | 15 | 3 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] |
| 24 | 16 | 1 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] |
| ## 5 攻击 |
本节中我们提出的攻击方法结合了AES状态的符号表示(见第4节)和CPA攻击,以恢复AES轮密钥的各个字节。执行算法1后,攻击者已获得第 R轮的所有轮密钥字节。因此,她可以通过逆向密钥调度来恢复密码算法的主密钥。
该算法遵循状态的符号表示,以推断出必须攻击哪些密钥字节,以及每个被攻击的密钥字节应生成多少密钥候选。通过跟踪与已恢复密钥字节相关的对,该算法能够排除所有不可能的轮密钥,从而节省计算资源。实际上,该算法使用最优数量的相关功耗分析攻击来恢复主密钥。
最初,已知对集合为空,所有可能的密钥都被视为有效。该算法会跟踪 2p个可能的密钥,其中 p是第 R轮状态符号表示中独立对的总数。
算法的主循环遍历所有需要攻击的轮数。在每一轮中,针对与变量状态字节相对应的密钥字节进行攻击,以恢复一个或多个临时密钥字节或一个轮密钥字节。根据与待攻击字节相关的对,存在三种可能的情况:
S盒实现,S盒选择函数;(b) S 盒实现,T表选择函数;(c) T表实现,T表选择函数;(d) T表实现,S盒选择函数。)
算法1. Theattack
需要: state 初始状态:0 – 固定字节,1 – 可变字节
需要: λ=(plaintexts, traces) 在采集阶段记录
1: state, pairs= Process(state) 符号处理(第4节)
2: known pairs= ∅, mapped pairs= ∅
3: keys[2p]= ∅, valid keys[2p]= True p是独立对的数量
4: 对于 r= 1到 R执行 R是被攻击的轮数
5:对于 i= 0到 15 执行
6: 如果 state[r][i] ≠ 0 那么
7: 如果 pairs[r][i]== ∅ 那么 无配对
8: keys[0,···, 2p − 1][r][i]= CPA(λ, keys[0], r, i)
9: 否则如果 pairs[r][i] ⊆ known pairs 那么 已知对(s)
10: 如果 i∉ mapped pairs[pairs[r][i]] 那么
11: mask= 0, temp keys= ∅, αmax= −1
12: 对于 pair ∈ pairs[r][i] 执行
13: mask= mask ∨ 2pair−1
14: 结束循环
15: 对于 j ∈[0, 2p −1] 执行
16: 如果 valid keys[j]并且 temp keys[j ∧ mask]== ∅ 那么
17: temp keys[j ∧ mask], α= CPA(λ, keys[j], r, i)
18: 如果 α> αmax then
19: αmax= α
20: 结束条件语句
21: 结束 if
22: valid keys[j][r][i]= temp keys[j ∧ mask]
23: 结束 for
24: for j ∈[0, 2p −1] do
25: if abs(state[r][i])== 1且 α+ β< αmax则
26: valid keys[j]= False
27: 结束 if
28: 结束 for
29: 结束 if
30: else 新配对
31: mask= 2pairs[r][i]−new pair, k1= k2= ∅
32: 对于 j ∈[0, 2p −1] 执行
33: 如果 k1[j ∧ mask]== ∅ 那么
34: k1[j ∧ mask], k2[j ∧ mask]= CPA(λ, keys[j], r, i)
35: 结束 if
36: 如果 j ∧ 2 new pair−1 那么
37: keys[j][r][i]= k1[j ∧ mask], keys[j][r][i ′ ]= k2[j ∧ mask]
38: else
39: keys[j][r][i′]= k2[j ∧ mask], keys[j][r][i′ ]= k1[j ∧ mask]
40: 结束 if
41: 结束 for
42: known pairs= known pairs ∪ new pair
43: 将 (i, i ′ ) 添加到 mapped pairs[new pair]
44: 结束 if
45: 结束 if
46:结束 for
47:结束 for
48: 返回 keys[i],其中 valid keys[i]== True 对于 i ∈[0, 2 p − 1]
– 无配对:如果符号表示中没有与用于攻击的状态字节相关联的配对,则该算法将恢复一个密钥字节,该密钥字节会被分配给所有可能的密钥。
– New pair:如果与正在攻击的字节相关的对中,有一个对未包含在已知对集合中,则该算法将恢复 2u个可能的值作为相应密钥字节的候选值,其中 u是与正在攻击的字节相关联的已知独立对的数量。已知对的数量决定了需要执行的相关功耗分析攻击次数。通过使用基于现有对的掩码以及新对的掩码,该算法正确地将恢复出的密钥字节值分配给所有可能的密钥。该新对被添加到已知对集合中,并将受恢复的临时密钥影响的两个状态索引映射到此新对。该映射可防止重复计算相同的临时密钥。
– 已知对(s):当与待攻击密钥字节相关的 t个独立对已知但未映射到当前状态字节时,该算法执行 2t次CPA攻击。然后,将攻击结果(恢复出的密钥以及前两个最可能密钥候选之间的相关系数差值 α)分配给所有可能密钥的相应字节。随后,将 α值小于最大观测值 αmax减去阈值 β的可能密钥标记为无效。通过这种方式,仅保留产生最高相关峰值的密钥组合。此时,输入对被视为已求解,因为算法可以唯一地将每对中的两个临时密钥分别分配给对应的状态字节。因此,算法将不再处理被标记为无效的可能密钥。该优化通过减少执行的 CPA攻击次数提高了算法效率。
最后,该算法会返回所有被标记为有效的可能密钥。当阈值 β 趋近于零时,算法将仅返回一个可能的密钥。当侧信道采集的质量较高(即信噪比较高)且有足够的功耗轨迹时,该算法能够得到正确密钥。
5.1 最优性
我们证明了我们的算法使用最少的相关功耗分析攻击次数来恢复主密钥,因此是最优的。因此,表5中提供的下界是最优的。
定理1。 算法1执行最优数量的相关功耗分析攻击以恢复高级加密标准的16字节主密钥。
证明。 攻击者恢复高级加密标准的16字节主密钥的唯一方法是恢复某一轮的所有密钥字节,然后逆向推导密钥扩展。由于从第 i −1轮的轮密钥推导第 i轮的轮密钥的函数是双射的,因此知道某一轮的所有轮密钥字节 r即可获得主密钥的信息。
假设算法1对给定的初始状态使用了 n次独立的CPA攻击,且该方法并非最优。因此,至少存在一种算法能够仅通过 m次CPA攻击来恢复主密钥,其中 m< n。接下来我们证明这样的算法并不存在。如果存在一种比算法1使用更少 CPA攻击次数的算法,那么该算法必定至少少攻击一个密钥字节。但如果确实如此,则该攻击将无法继续进行到后续轮次,因为在经过列混淆变换后,与未恢复密钥对应的状态字节将导致未知且可变的状态字节。这些字节无法通过 CPA攻击恢复,因此攻击失败。因此,不存在比算法1使用更少CPA攻击次数的算法。
5.2 选择最佳攻击策略
对于最多由攻击者控制的七个字节,我们的攻击算法(算法1)比经典攻击算法更高效,后者需要攻击所有可能的密钥字节以恢复主密钥。增益范围为经典攻击所需相关功耗分析攻击次数的15%至68%。当攻击者控制超过七个输入字节时,我们的算法执行的相关功耗分析攻击次数与经典攻击相同。同时,只要存在足够多具有高信噪比的轨迹,我们的算法就能给出唯一的主密钥。而对于经典攻击,除非采用如算法1中用于剔除无效密钥的额外机制,否则无法实现这一点。
希望缩短攻击离线阶段持续时间的攻击者(且不增加必须攻击的轮数)可以结合表5和表3中的数据来相应调整攻击策略。更准确地说,如果攻击者能够控制最多 n个AES输入字节,则她可以选择控制 m(m ≤ n)个输入字节,因为m可变字节能够最小化恢复主密钥所需的相关功耗分析攻击次数。此决策必须在执行侧信道采集之前做出,因为它会影响所选择的输入。另一个支持使用较少的可变输入字节的原因是,如果注入的数据包具有更少的可变字节并模仿正常网络流量的外观,则攻击更难被检测到。例如,当 n= 12时,攻击者可以选择 m=4,5,或6,将离线攻击的复杂性从44次降低到38次单独的CPA攻击,同时仍然仅攻击三轮。其结果是攻击效率比经典攻击整体提高了14%。
借助针对与待攻击目标相似的设备在不同输入配置下的实验结果,结合迄今为止已呈现的结果,可以做出更优的决策。为此,在下一节中,我们将通过实验确定利用来自ARM Cortex‐M3处理器的电磁泄漏信息,在每种评估情况下恢复主密钥所需的轨迹数量。
6 结果
在实验评估中,我们考虑了两种用ANSI C编写的无保护的高级加密标准实现。第一种实现采用S盒实现策略,而第二种实现则采用T表实现策略。对于25种评估情况中的每一种,我们最多测量了2000条电磁轨迹。每个评估情况的采集耗时约90分钟。样本被分割成对应于高级加密标准轮数的文件。然后,我们使用算法1进行攻击,使用的轨迹数量在区间 [100, 2000]内以100条轨迹为步长逐步增加,直到猜测熵收敛到零。
对于每种实现,我们分别基于AES S盒和T表考虑了两种选择函数。每种评估情况下,猜测熵变为零并保持稳定的最小轨迹数在图4中直观地展示。所有攻击均使用少于1600条电磁轨迹恢复了完整的16字节主密钥。通常,当选择函数与实现策略完全匹配时,使用更少的轨迹即可恢复主密钥。尽管如此,我们的结果表明,即使选择函数与被攻击的实现不完全匹配,仍有可能实现完整的密钥恢复。使用T表选择函数对S盒实现进行攻击时,平均需要比使用S盒选择函数多204条轨迹才能恢复主密钥。类似地,使用S盒选择函数而非T表选择函数来攻击基于T表策略的实现时,平均需要多354条轨迹。有关每种评估情况和攻击场景下恢复主密钥所需确切轨迹数量的详细信息,请参阅本文的完整版本。
对抗措施。 我们的实验结果表明,即使在通信协议场景中,当攻击者拥有对输入的控制有限。掩码非线性查找表是一项具有挑战性的任务,因为它会显著增加执行时间和内存使用[33]。尽管由于其局限性(例如不能在CCM等操作反馈模式中使用)而未在许多密码学库中出现,但位切片实现的CPA泄露低于使用查找表的实现[4],,不过它们仍然容易受到DPA攻击[3]。一种轻量级原语(分组密码或认证加密),特别是为高效掩码设计的,在考虑侧信道防护时,是AES‐CCM的良好替代方案。其他对抗措施(例如密钥刷新机制)可以支持纵深防御方法。然而,任何额外的对抗措施都会影响物联网协议的整体效率,因此在资源受限的情况下,必须优先考虑最有效的措施(即掩码)。
7 结论
本文中,我们针对网络协议背景下AES软件实现面对CPA攻击的安全性进行了广泛的分析。在此场景下,攻击者可控制多个输入字节,而其余输入字节为固定值。为了评估AES实现在所有可能输入组合下的抗攻击能力,我们提出了一种用于符号处理密码状态的算法。随后,根据由攻击者控制的输入字节数量以及恢复主密钥所需攻击的轮数,我们将所有可能的输入分类为25个独立的评估情况。最后,我们描述了一种通过发起CPA攻击以恢复主密钥的最优算法可能的最小相关功耗分析攻击次数。它根据影响受攻击密钥字节的密钥对集合以及可能密钥候选的相关系数,巧妙地做出决策,以剔除不可能密钥。
我们证明了,即使攻击者仅控制密码算法的一个输入字节,并且仅从32位 ARM Cortex‐M3处理器获取约一小时内采集的不到1600条电磁轨迹,基于S盒和T表策略的高级加密标准非保护实现仍可被攻破。对实现策略的了解并不会显著改善攻击结果,也不会降低攻击复杂度。因此,不应使用高级加密标准的非保护实现来保护网络协议中终端设备之间的通信安全。在使用来自流行的开源密码库的高级加密标准实现时必须格外小心,因为其中大多数并未针对侧信道攻击进行防护。



77

被折叠的 条评论
为什么被折叠?



