第三章:侧信道攻击原理——功耗分析、电磁辐射分析与时间分析
各位同学,今天我们来聊聊侧信道攻击。说实话,这个领域是我个人觉得智能卡安全里最「艺术」的部分。为什么这么说?因为传统的密码分析是在数学层面找漏洞,而侧信道攻击是在物理层面「偷」秘密。你想想看,芯片在运算时,它的功耗、电磁波、甚至运算时间,都在不经意间泄露了密钥信息。
我最早接触侧信道攻击是在一次银行IC卡的安全评估项目中。当时我们用了各种逻辑攻击都没能攻破那张卡,最后通过简单的功耗分析,密钥就自己「跳」出来了。嗯,那次经历让我彻底改变了对硬件安全的看法。
3.1 功耗分析攻击(SPA/DPA)
功耗分析,说白了就是盯着芯片的电流变化来猜密钥。芯片在执行不同指令时,消耗的电流是不一样的。比如执行乘法运算比加法更耗电,处理1和0时电流也有细微差别。
3.1.1 简单功耗分析(SPA)
SPA是最直观的攻击方式。你只需要一条功耗轨迹,就能直接看出芯片在执行什么操作。
核心原理:不同指令的功耗特征不同,通过观察单条功耗曲线即可识别操作序列。
我举个例子。在RSA签名过程中,模幂运算通常使用「平方-乘」算法。平方操作和乘法操作的功耗波形明显不同。攻击者只要看一眼波形,就能知道密钥的每一位是0还是1。
// 典型的RSA平方-乘算法
result = 1
for i from n-1 down to 0:
result = result * result mod N // 平方操作(总是执行)
if key_bit[i] == 1:
result = result * base mod N // 乘法操作(仅当密钥位为1时执行)
return result
你看,如果波形上出现了乘法操作的尖峰,那对应的密钥位就是1。我曾经在实验室里用示波器抓过一张老式智能卡的功耗曲线,密钥简直是一目了然。不过现在的芯片都加了各种防护,SPA没那么好使了。
避坑指南:我曾经以为SPA只对老芯片有效,结果在一次评估中发现,某款号称「抗SPA」的芯片,因为PCB布线问题,功耗泄露依然明显。所以别太相信芯片手册上的宣传。
3.1.2 差分功耗分析(DPA)
SPA不行了,那就上DPA。DPA不依赖肉眼观察,而是用统计学方法从大量功耗轨迹中提取密钥信息。
DPA的基本思路是这样的:
- 猜测密钥的一个小部分(比如一个字节)
- 根据猜测计算中间值(比如S盒输出)
- 根据中间值的某个比特(通常是LSB)将功耗轨迹分成两组
- 计算两组轨迹的平均值之差
- 如果猜测正确,差分曲线上会出现明显的尖峰
为什么会这样?因为正确的猜测能准确分类数据,错误的猜测则相当于随机分组,平均后差异趋近于零。
注意:DPA需要采集数千到数万条功耗轨迹。采集过程中必须保持触发信号稳定,否则对齐误差会毁掉整个分析。我见过有人采集了一整天数据,结果因为时钟抖动,最后什么都分析不出来。
在实际项目中,我建议使用相关系数分析(CPA)替代简单的DPA。CPA计算功耗与中间值的相关性,比二分法更敏感。下面是一个简化的CPA实现思路:
// CPA核心步骤(伪代码)
for each key_guess in 0..255:
for each trace in traces:
mid_val = sbox[plaintext[trace] XOR key_guess]
hw = popcount(mid_val) // 汉明重量模型
correlation = pearson(traces_power, hw_values)
if max(abs(correlation)) > threshold:
key_guess is correct
3.2 电磁辐射分析(EMA)
功耗分析需要接触芯片的电源引脚,但有些场景下你没法直接接线。这时候电磁分析就派上用场了。芯片在工作时,内部电流变化会产生电磁辐射,用近场探头就能捕获这些信号。
我个人觉得EMA比功耗分析更「优雅」。因为你可以把探头对准芯片的不同区域,比如只采集密码协处理器附近的电磁信号,信噪比反而更高。
3.2.1 电磁辐射的来源
芯片内部的电磁辐射主要来自:
- 数据总线翻转:总线从0变1或从1变0时,会产生明显的电磁脉冲
- 时钟信号:时钟边沿会产生周期性辐射,可作为同步参考
- 电源网络:芯片内部电源分配网络(PDN)的谐振也会辐射
我记得有一次做车规级安全芯片的评估,芯片被封装在金属屏蔽罩里。按理说电磁辐射很难测到,但我们在屏蔽罩的散热孔附近找到了一个「窗口」,探头伸进去后信号质量出奇的好。
3.2.2 EMA攻击流程
EMA攻击和DPA非常相似,只是信号源从功耗换成了电磁辐射:
- 用近场探头(如Langer RF-U 2.5-2)扫描芯片表面
- 找到辐射最强的位置(通常是密码模块上方)
- 固定探头,采集加密操作时的电磁信号
- 使用DPA/CPA相同的统计方法分析
实战技巧:探头的位置非常敏感。我习惯先用X-Y扫描台做一次粗定位,找到热点区域后,再微调探头角度。有时候旋转探头45度,信号强度能提升3dB以上。
3.3 时间分析攻击
时间攻击是最容易被忽视的侧信道。它的原理很简单:如果密码算法的执行时间依赖于密钥或输入数据,那么通过精确测量时间就能推断出秘密信息。
你可能会想:「现在的芯片都是纳秒级的,时间差异能测出来吗?」答案是能。现代测量设备的时间分辨率可以达到皮秒级,而且通过多次测量取平均,可以消除噪声。
3.3.1 典型的时间攻击场景
最经典的例子是RSA的模幂运算。如果使用「平方-乘」算法且没有做时间均衡,那么密钥中1的个数越多,乘法操作就越多,执行时间就越长。
| 密钥特征 | 执行时间 | 泄露信息 |
|---|---|---|
| 密钥中1较多 | 较长 | 密钥汉明重量较大 |
| 密钥中0较多 | 较短 | 密钥汉明重量较小 |
| 特定比特为1 | 出现额外乘法延迟 | 该比特位置 |
还有一种更精细的攻击——针对密码比较操作的时间攻击。比如PIN码验证时,如果程序在发现第一个错误字符后就返回,那么验证时间会随正确字符数增加而增加。攻击者可以逐位爆破。
严重警告:我曾经审计过一个智能门锁的固件,它的管理员密码验证就存在时间泄露。用Python写了个脚本,远程测量了2000次验证时间,就把8位密码完整还原了。这种漏洞在物联网设备中极其常见。
3.3.2 时间攻击的防御
防御时间攻击的核心原则就一条:让所有路径的执行时间恒定。具体做法包括:
- 固定时间实现:无论密钥如何,都执行相同数量的操作(比如总是执行平方+乘法,但根据密钥位决定是否使用结果)
- 蒙哥马利阶梯:一种RSA实现方式,每次迭代都执行一次平方和一次乘法,时间完全固定
- 随机延迟插入:在关键操作前后加入随机延时,但这种方法只能增加攻击难度,不能彻底防御
// 蒙哥马利阶梯(时间恒定)
R0 = 1
R1 = base
for i from n-1 down to 0:
if key_bit[i] == 0:
R1 = R0 * R1 mod N
R0 = R0 * R0 mod N
else:
R0 = R0 * R1 mod N
R1 = R1 * R1 mod N
return R0
你看,无论密钥位是0还是1,每次循环都执行一次乘法和一次平方,时间完全一致。
3.4 知识体系总览
为了让大家更直观地理解这三种攻击的关系,我画了一张图:
这张图把三种攻击的脉络理清楚了。从中心向外,先分三大类,再细化到具体攻击手法,底部是通用的防御策略。我个人建议初学者先从DPA入手,因为它的工具链最成熟,网上也有开源项目可以练手。
学习建议:如果你想动手实践,推荐使用ChipWhisperer平台。它集成了功耗采集、电磁探头和数据分析工具,价格也不贵。我带的培训班里,学员用这个平台一般两天就能复现一个完整的DPA攻击。
好了,关于侧信道攻击的原理就讲到这里。记住,理解攻击是为了更好地防御。下一节我们会深入讨论具体的防护技术,包括掩码方案、隐藏技术,以及如何在硬件层面彻底消除侧信道泄露。
公众号:蓝海资料掘金营,微信deep3321