第4章:简单功耗分析(SPA):SPA原理、单比特泄露、密钥位识别实战
4.1 SPA到底是个啥?
简单功耗分析,英文叫 Simple Power Analysis,简称 SPA。
说白了,就是盯着芯片工作时的功耗波形,直接读密钥。
你可能会问:功耗波形还能读出密钥?
嗯,我刚开始接触这个领域时,也觉得有点玄乎。但后来亲手抓了几条波形,才发现——这玩意儿比想象中直观得多。
SPA 的核心思想很简单:芯片执行不同操作时,消耗的电流不一样。比如做乘法比做加法费电,跳转指令和算术指令的功耗特征也不同。这些差异会直接体现在功耗轨迹上。
我在项目中遇到过一位老哥,他拿着示波器看智能卡的功耗波形,一眼就认出了 DES 算法的 16 轮迭代。每一轮波形都长得差不多,像心电图一样规律。这就是 SPA 的典型应用——识别算法结构。
4.2 单比特泄露:密钥藏在哪里?
SPA 能识别算法结构,这还不够刺激。
真正让攻击者兴奋的是——单比特泄露。
什么叫单比特泄露?
就是密钥的每一个比特,在执行过程中都会留下功耗痕迹。你想想看,芯片在处理密钥位 0 和密钥位 1 时,内部电路翻转的次数不一样,电流消耗自然也不同。
举个例子,RSA 的平方-乘算法:
- 密钥位为 0:只做平方运算
- 密钥位为 1:先做平方,再做乘法
这两种操作的功耗波形有明显区别。你只要把波形拍下来,数一数哪些位置多了乘法操作,密钥就出来了。
关键点:SPA 攻击不需要统计大量样本,一条干净的功耗轨迹就够了。这是它和 DPA(差分功耗分析)最大的区别。
4.3 实战:从波形中抠出密钥位
光说不练假把式。我们拿一个真实的例子来走一遍。
假设目标是一颗实现 RSA 签名的智能卡。我们想提取它的私钥。
第一步,搭测试环境。你需要:
- 一台数字示波器(采样率至少 1GSa/s)
- 一个电流探头或电阻(串在 Vcc 上测压降)
- PC 端控制软件(我用的是 Python + PyVISA)
第二步,触发采集。让智能卡执行一次签名操作,示波器抓取整个过程的功耗波形。
第三步,波形分析。这是最考验眼力的环节。
我个人的习惯是先把波形放大,找到平方和乘法的特征模式。平方操作通常是一个较窄的脉冲,乘法操作则更宽、幅度更大。
下面是一段简化的 Python 代码,用来识别密钥位:
import numpy as np
import matplotlib.pyplot as plt
# 假设 waveform 是采集到的功耗数据
# 已知平方操作的长度为 100 个采样点,乘法为 200 个采样点
def extract_key_bits(waveform, sq_len=100, mul_len=200):
key_bits = []
i = 0
while i < len(waveform) - mul_len:
# 检查当前段是否为乘法操作
segment = waveform[i:i+mul_len]
if np.std(segment) > threshold: # 乘法功耗波动更大
key_bits.append(1)
i += mul_len
else:
# 检查是否为平方操作
segment_sq = waveform[i:i+sq_len]
if np.std(segment_sq) > threshold_sq:
key_bits.append(0)
i += sq_len
else:
i += 1 # 跳过噪声
return key_bits
# 调用函数
bits = extract_key_bits(waveform_data)
print("提取的密钥位:", bits)
小技巧:实际波形中会有噪声干扰。我建议先做一次低通滤波,把高频毛刺去掉。另外,阈值不要设得太死,留点余量。
4.4 避坑指南:我踩过的那些坑
SPA 看起来简单,但真正上手时坑不少。我把自己踩过的坑列出来,你遇到了可以少走弯路。
我曾经犯过的错:
- 触发没设好:第一次抓波形时,触发位置偏了,导致只抓到一半的签名过程。密钥位全乱套了。后来我改用下降沿触发,配合预触发采集,才稳定下来。
- 采样率不够:用 100MSa/s 的示波器去抓,平方和乘法的波形糊在一起,根本分不清。换到 1GSa/s 后,特征就清晰了。
- 忽略了时钟抖动:智能卡的时钟不是绝对稳定的,波形会有微小的伸缩。我后来加了重采样对齐,才解决了这个问题。
4.5 SPA 的局限性
SPA 虽然直观,但不是万能的。
它要求功耗波形有足够高的信噪比。如果芯片加了噪声掩蔽(比如随机插入空操作),或者用了恒定功耗逻辑(比如双轨预充电),SPA 的效果就会大打折扣。
另外,SPA 对操作者的经验要求比较高。你得能肉眼分辨出不同操作的波形特征。我刚开始练的时候,看了几十条波形才找到感觉。
但话说回来,SPA 是侧信道攻击的入门必修课。它让你直观地理解「功耗泄露」这个概念。后面学 DPA、模板攻击时,很多思路都是从 SPA 延伸出来的。
4.6 本章知识体系
下面这张图总结了 SPA 的核心逻辑,你可以对照着回顾一下:
嗯,SPA 的内容就讲到这里。你回去可以找个带 RSA 的智能卡试试,亲手抓一条波形,看看能不能认出平方和乘法。实践出真知嘛。