旁路之能量分析攻击总结
一、理解旁路攻击
在前几年的工作里,对智能卡(或者说芯片卡、CPU 卡,比如 SIM 卡、芯片银行卡、社保卡等,另外 USBKEY 也属于智能卡的一种)的安全研究比较多,主要攻击智能卡中加密算法,获取算法密钥,验证智能卡安全性。用到的攻击手法就是本文要说的旁路攻击,英文名称是 Side Channel Attacks,也有的翻译成“侧信道攻击”或者“边道攻击”,它们都是一个意思。
首先谈谈我对旁路攻击中“旁路”的理解,不论是对硬件、系统还是网络的攻击,最方便也是最直接的攻击手段是直接读取其中的信息,比如账号的密码。若此路不通,则需另辟他路,这种通过“他路”进行攻击的手段就可以叫做“旁路”攻击。
以破解某人邮箱为例,如果碰巧通过社工库找到了他泄露过的密码而撞库成功,这是最理想的。而通过 XSS 获取到了其登录邮箱的 Cookie 从而登录其邮箱的途径,可以理解为“旁路”。
再看看下面这张图,直接拿到锁的钥匙打开抽屉,是最理想的攻击途径。而通过图中的方法拿到被锁抽屉中的东西,就是“旁路”攻击了。《研究人员利用旁路攻击窃取Android和iOS上的密钥》的这篇文章,也是属于旁路攻击的一种。
对智能卡的旁路攻击,是上世纪 90 年代末提出的。攻击者在智能卡的 VCC 或 GND 上串联一个小的电阻,使用示波器测量该电阻上的电压降,测量的电压降和芯片的能量消耗成正比,因此可以将电压降作为能量消耗来处理,并将对应的曲线波形视为功耗曲线。同样的道理,探测电磁变化获取智能卡芯片的功耗曲线也能进行攻击。这类旁路攻击叫做能量分析攻击(Power Analysis Attack)。攻击设备的物理连接示意图如下所示:
能量分析攻击的基本思想是通过分析密码设备的能量消耗获得其密钥。这种攻击利用了两类能量消耗依赖性:数据依赖性和操作依赖性。因为密码设备的瞬时能量消耗依赖于设备所处理的数据和设备所执行的操作。
现在进行旁路攻击需要一套价格不菲的攻击设备。经过十几年的发展,攻击设备厂商也不再局限在国外,源于上海交大的观源信息算是国内厂商的后起之秀,郁昱教授在多个安全大会上也演示了如何克隆 SIM 卡。
二、能量分析攻击
1. 定义
能量分析攻击又分为简单能量分析攻击和差分能量分析攻击。在《智能卡安全与设计》一书中对这两种攻击方法的描述比较准确:
简单功耗分析(Simlpe Power Analysis, SPA)攻击:从密码芯片运算的功耗波形上能够直接找出一切密钥信息的攻击方法。因为在芯片中,密钥位为 0 时运算的功耗和密钥位为 1 时运算的功耗存在差异,通过这样的差异分析出密钥位的值,按照一定规律组合得到完整的密钥。
以下图为例,使用 SPA 就可以从芯片的功耗曲线中可以读出十六进制的关键数据。
差分功耗分析(Differential Power Analysis, DPA)攻击:需要知道算法的明文(输入)和密文(输出),通过对一系列的功耗轨迹进行分析和计算,重现加密密钥的攻击方法。
DPA 的主要任务在于找出密钥参与运算时的功耗和密钥位的相关性,而不是直接得到密钥位的值。这个解释起来比较复杂,下面以分析 DES 算法为例讲解 DPA 的原理。
2. DPA 攻击原理
在《能量分析攻击》一书中,作者以 AES 为例分析了 DPA 原理和攻击过程,下面以 DES 算法为例进行说明。
首先分析一次 DES 加密操作的功耗与明文第一个字节最高有效位 MSB
之间的依赖关系,记该比特为 d
。为了确定 d
对功耗的影响,测量芯片分别加密 1000 个随机明文时的功耗。因为明文是随机的,d
也就是随机的,这样可以获得约 500 条 d = 0
时加密操作的功耗曲线,以及约 500 条 d = 1
时加密操作的功耗曲线。
确定 d
对功耗影响的一个简单方法就是计算平均值之差,即分别计算所有 d = 0
的功耗曲线的平均值与所有 d = 1
的功耗曲线的平均值,获得一条 d = 0
的平均功耗曲线和一条 d = 1
的平均功耗曲线。接下来,将这两条平均功耗曲线做减法运算,得到一条功耗曲线,称为差分功耗曲线。
观察差分功耗曲线,几乎这段时间内的所有时刻,其电压值都接近于零,但有几个特别突出的尖峰。这些尖峰表明了芯片功耗依赖于 d
中的那些时刻。在这一时刻,芯片所执行的指令要么直接对 d
进行处理,要么所处理的某些数据依赖于 d
。在这一时刻,d
的相关性是最高的。
芯片的运算会直接或间接地依赖于 d
的指令,通过对上面尖峰出现位置的分析,说明芯片的能量消耗中包含它所处理数据的信息,在能量分析中利用这一特性,就可以确定出芯片使用的密钥。
3. DPA 分析过程
DES 加密共 16 轮,有效密钥 56 位,这 56 位密钥生成 16 轮子密钥参与各轮次的运算,每轮子密钥 48 位。如果已知 DES 前两轮或最后两轮的子密钥,就可以恢复出 DES 完整的密钥。
这样一来,我们的目标拆分为攻击前两轮(或最后两轮)的子密钥。
先来分析第一轮的过程。32 位明文经过扩展变换后与 48 位轮密钥进行异或,然后进入 S 盒。S 盒共 8 个,每个 6 位输入,4 位输出。
我们关注第一个 S 盒:S1
,S1
的每一个输出位都可以通过明文的 6 位和密钥 6 位来获得。将参与 S1
运算的 6 位明文记为 p
,6 位密钥记为 k
。因此,S1
操作对应的输出可以记为 S(p⊕k)
。在所给出的攻击实例中,都利用了如下事实:芯片在某个时刻的能量消耗依赖于这一输出字节的最高有效位 v
,其中,v = MSB(S(p⊕k))
。
进行这个攻击与之前已经完成的对值 d
的分析过程非常相似。首先,加密 1000 个随机明文,记录相应的能量消耗。此后,将功耗曲线划分为两组:v = 1
的功耗曲线与 v = 0
的功耗曲线。与先前已经完成对明文比特d的分析不同,此时中间值 v
依赖于密钥字节 k
。
最初,攻击者并不知道 k
。然而,攻击者可以对 k
进行猜测,实际上,k
只有 64 个可能值。因此,攻击者能够很容易地遍历所有可能的 k
值,并使用这些值来计算 v
。在实际的攻击中,这意味着首先猜测 k = 0
。基于这一猜测,对于 1000 次加密操作的每一次,分别计算对应的 v
。然后,攻击者分别计算 v = 1
的功耗曲线平均值和 v = 0
的功耗曲线平均值。这样就可以绘制出两条平均功耗曲线之间的差异曲线。对于所有其他 63 个可能的密钥值,重复同样的过程。这样,攻击者就可以获得 64 个差异曲线。对于每一个密钥猜测,都有一个与之对应的差分曲线。
在 64 个猜测中,当猜中 k
时,就已经正确计算出了 v
。因此,该密钥猜测对应的差分曲线实际上说明了芯片能量消耗对 v
的依赖性。由于这种依赖性的存在,对应的差分曲线中就会有明显的尖峰。
一个重要的问题是:如果基于一个错误的密钥猜测计算 v
,会出现什么情况呢?这种情况下,所计算出的v值将功耗曲线划分为两组(v = 1
和 v = 0
),但是芯片没有处理这些计算所得到的 v
值。因此,能量消耗就不会依赖于这些值,所以对应的差分曲线中就不会有大尖峰出现。
同理,依次猜测 S2、S3……S8 参与运算的密钥位,就可以获得第一轮的 48 位子密钥。
再同理获得第二轮子密钥,然后组合这两轮子密钥还原为 DES 完整密钥。
使用这种策略的攻击称为差分能量分析(DPA)。这种攻击利用了这样一个事实:密钥设备的能量消耗依赖于算法执行过程中所处理的中间值。上面的攻击分析中,已经利用过这样一个事实:芯片的能量消耗依赖于第 1 轮中 S 盒的输出数据的 MSB。同样,攻击者也可以利用其他的中间值来实施攻击。特别地,攻击者可以利用依赖于其他密钥字节的中间值来实施攻击,这样就可以很容易地恢复出完整的 DES 密钥。
4. 其他说明
对称算法与非对称算法的 DPA 攻击原理不同,CRT 方式实现的 RSA 算法攻击的是 CRT 的组合阶段。
另外,除 SPA 和 DPA 之外,其实还有一种叫做错误注入
(DFA)的攻击手段,也属于能量分析攻击,这里不再介绍。
参考资料
- 张之津等著《智能卡安全与设计》,清华大学出版社
- [奥]Stefan Mangard 等著,冯登国等译《能量分析攻击》科学出版社