第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 攻击知识体系 功耗波形采集 波形特征识别(平方 vs 乘法) 单比特泄露 → 密钥位提取 完整密钥恢复 关键要点 • 单条波形即可攻击 • 依赖操作差异 • 需要高信噪比 • 经验要求较高 • 适合 RSA、ECC • 可识别算法结构 • 噪声掩蔽可防御 • 入门必修课

嗯,SPA 的内容就讲到这里。你回去可以找个带 RSA 的智能卡试试,亲手抓一条波形,看看能不能认出平方和乘法。实践出真知嘛。


专注资料整理