4. 简单功耗分析(SPA)实操:从波形里“读”出密钥
简单功耗分析,英文叫 Simple Power Analysis,简称 SPA。说白了,就是直接盯着芯片干活时消耗的电流波形,用肉眼(或者简单算法)去猜它在干什么。
你可能会问:功耗波形能看出啥?我告诉你,能看出的东西多了。芯片执行不同指令、处理不同数据时,消耗的电流是不一样的。这个差异虽然小,但用示波器抓出来,放大一看,清清楚楚。
我记得刚入行那会儿,带我的老工程师扔给我一段 DES 加密的功耗轨迹,说:“你看看,密钥第 3 位是 0 还是 1?”我当时一脸懵。后来他指着波形上的几个小突起,给我讲了十分钟,我才恍然大悟——原来 SPA 这么直观。
4.1 采集单一加密操作的功耗轨迹
做 SPA 的第一步,是把芯片干活时的“心电图”给录下来。你需要三样东西:
- 目标芯片:比如一个跑着 DES 算法的智能卡或 MCU。
- 示波器:采样率至少 1GSa/s,带宽 100MHz 以上。
- 触发信号:让示波器知道“加密开始了”。
具体操作步骤,我一般这么干:
- 在芯片的 VCC 引脚上串一个小电阻(比如 10Ω),用示波器探头测电阻两端的电压差。
- 把芯片的某个 GPIO 在加密开始时拉高,加密结束时拉低,作为触发信号。
- 设置示波器为上升沿触发,采样深度调到能覆盖整个加密过程。
- 跑一次加密,抓一条轨迹。
抓到的轨迹长什么样?大概是这样:
电压 (mV)
^
| __ __ __ __ __
| | | | | | | | | | |
| | | | | | | | | | |
+-----------------------------------> 时间 (us)
0 1 2 3 4 5 6 7 8
每个“鼓包”对应一轮加密操作。你看,16 轮 DES,波形上就有 16 个明显的峰。
4.2 识别操作序列:以 DES S 盒查找为例
拿到波形之后,怎么看出芯片在干什么?这需要你对目标算法的实现细节有了解。
拿 DES 来说,它的核心操作是 S 盒查找。S 盒本质上是一个 6 位输入、4 位输出的查表操作。芯片在执行查表时,会去内存里读一个预先算好的值。这个“读内存”的动作,在功耗波形上会留下一个独特的“凹陷”或“尖峰”。
我教你看:
- 粗看轮数:DES 有 16 轮,波形上就有 16 个相似的“大块”。数一数,是不是 16 个?
- 细看每轮:每一轮里,你会看到几个小峰。第一个小峰是“扩展置换”,中间 8 个小峰是“8 个 S 盒查找”,最后一个小峰是“P 盒置换”。
- 找异常:如果某个 S 盒查找的波形比其他 S 盒明显宽或窄,说明那个 S 盒的输入数据有特殊之处——很可能跟密钥有关。
4.3 从轨迹中提取密钥信息
好,现在你看到了 16 轮,看到了 8 个 S 盒。怎么从里面抠出密钥?
我举个例子。假设你抓到了 DES 第一轮的功耗轨迹,你发现第 3 个 S 盒查找的波形,比第 1 个 S 盒查找的波形“胖”了 10%。
为什么会这样?因为 S 盒查找的耗时跟输入数据有关。某些输入组合会让芯片走更长的路径,或者触发更多的总线翻转。这个“胖瘦差异”,直接泄露了 S 盒的输入值。
具体做法:
- 把第一轮 8 个 S 盒查找的波形片段截出来。
- 测量每个片段的宽度(耗时)或高度(峰值电流)。
- 对比已知的 S 盒输入-功耗模型,反推出 S 盒的 6 位输入。
- 有了 S 盒输入,结合已知的明文,就能算出密钥的一部分。
我曾经在一个项目里,用这个方法,只用了 3 条轨迹就把一个 8 位 MCU 上的 DES 密钥给还原了。当时客户还不信,我当场演示了一遍,他看完沉默了。
4.4 SPA 防御思路:掩码与隐藏
既然 SPA 这么厉害,那怎么防?我主要用两招:掩码和隐藏。
4.4.1 掩码(Masking)
掩码的思路很简单:让芯片处理的数据每次都不一样,但最终结果正确。
具体做法:
- 在加密开始前,生成一个随机数
m(掩码)。 - 把明文
p和掩码m一起送进算法,计算E(p ⊕ m)。 - 最后再用掩码把结果修正回来:
E(p) = E(p ⊕ m) ⊕ something。
这样一来,芯片每次执行的中间值都不一样,功耗波形也就没有固定的模式可循了。
我见过一个产品,用了 16 位掩码,SPA 波形看起来就像白噪声,完全看不出轮数。但代价是速度慢了 30%,面积大了 20%。
4.4.2 隐藏(Hiding)
隐藏的思路是:让所有操作的功耗看起来都一样。
常用方法:
- 恒定时间实现:不管输入是什么,都执行同样多的指令。比如 S 盒查找,不管输入是 0x00 还是 0x3F,都走同样的循环次数。
- 随机插入空操作:在加密过程中随机插入 NOP 指令,让波形的时间轴对不齐。
- 功耗平衡:用互补逻辑电路,让 0 和 1 的功耗一样。
4.5 本章知识体系
下面这张图,帮你把 SPA 的流程和防御串起来:
4.6 避坑指南
最后,分享几个我踩过的坑:
- 别急着上统计:SPA 的精髓是“看”,不是“算”。先肉眼观察波形,找异常点,再动手分析。一上来就跑相关性能量分析(CPA),容易忽略细节。
- 触发信号要干净:触发抖动会让波形对齐不准,导致你看到的“胖瘦”其实是时间错位。我吃过这个亏,浪费了两天。
- 注意电源噪声:芯片的供电纹波会叠加在功耗信号上。如果波形毛刺太多,先检查电源滤波。
- 别迷信示波器:高采样率不等于高信噪比。有时候用 100MSa/s 反而比 1GSa/s 看得更清楚,因为噪声更少。
嗯,SPA 就讲到这里。你回去找一块开发板,跑个 DES 或者 AES,抓几条轨迹看看。相信我,当你第一次从波形里“读”出密钥的时候,那种成就感,比打游戏通关爽多了。