2. 实验环境搭建:硬件平台与软件环境
做侧信道攻击,说白了就是跟芯片的“物理泄露”打交道。你没法光靠脑子空想,得真刀真枪地搭一套环境。我见过不少新手,理论背得滚瓜烂熟,一上手连示波器探头怎么接地都搞不清楚——嗯,这章咱们就把这些基础活儿捋一遍。
2.1 硬件平台选型
目前主流的侧信道实验平台就两个:ChipWhisperer 和 SAKURA-G。我个人习惯把前者叫“入门神器”,后者叫“进阶利器”。
| 特性 | ChipWhisperer | SAKURA-G |
|---|---|---|
| 定位 | 教学/快速原型验证 | 科研/高精度采集 |
| 采样率 | 最高 40 MS/s(CW1173) | 最高 1 GS/s(通过 FMC 扩展) |
| 集成度 | 板载目标芯片 + 采集电路 | 纯采集板,需外接目标板 |
| 软件支持 | ChipWhisperer 库 + Jupyter | 需自行编写采集脚本 |
| 价格 | 约 200-500 美元 | 约 1000-2000 美元 |
我的建议:如果你是第一次接触侧信道,先买一块 ChipWhisperer Lite(CW1173)。我在项目里用它做过 AES-128 的 CPA 攻击,从拆箱到拿到第一条功耗曲线,只花了两个小时。别一上来就上 SAKURA-G,那玩意儿调试起来能让你怀疑人生。
2.2 ChipWhisperer 硬件详解
ChipWhisperer 的核心设计思路是“把目标芯片和采集电路做到一块板子上”。你想想看,这样就不需要额外接一堆飞线了,噪声小很多。
以 CW1173 为例,它包含:
- 目标芯片:通常是 XMEGA 或 STM32F3,跑你要攻击的加密算法
- 电流探头接口:板载一个 20 欧姆的采样电阻,直接串在 VCC 上
- 时钟同步:目标芯片的时钟由 FPGA 产生,和采集时钟同源
- 触发信号:目标芯片在加密开始前拉高一个 GPIO,告诉采集卡“我要开始了”
避坑指南:我曾经犯过一个低级错误——把 ChipWhisperer 的 USB 线插到了电脑的 USB 3.0 口上。结果采集到的功耗曲线全是高频噪声。后来才发现,USB 3.0 的 EMI 干扰会耦合到采样电阻上。老老实实插 USB 2.0 口,或者用带磁环的线。
2.3 SAKURA-G 硬件简介
SAKURA-G 是日本 AIST 研究所设计的开放平台。它没有板载目标芯片,而是通过 FMC 连接器外接。好处是你可以换不同的目标板,坏处是——你得自己搞定同步问题。
SAKURA-G 的亮点:
- 使用 Xilinx Kintex-7 FPGA 做采集控制
- 支持 12-bit ADC,动态范围比 ChipWhisperer 的 10-bit 好不少
- 可以外接高精度示波器(比如 PicoScope 6407)
说实话,SAKURA-G 更适合做研究。我在做差分功耗分析(DPA)的论文实验时用过它,采集 10 万条曲线只需要 3 分钟,ChipWhisperer 要跑将近 20 分钟。
2.4 软件环境安装
软件环境其实就三样东西:Python、Jupyter、ChipWhisperer 库。我建议用 Anaconda 一把梭,省得折腾依赖。
2.4.1 安装步骤
- 下载并安装 Anaconda(Python 3.9+ 版本)
- 打开 Anaconda Prompt,创建一个新环境:
conda create -n sidechannel python=3.9 - 激活环境:
conda activate sidechannel - 安装 ChipWhisperer 库:
pip install chipwhisperer - 安装 Jupyter:
conda install jupyter
验证安装:在 Python 里运行以下代码,如果没有报错,说明环境搭好了。
import chipwhisperer as cw
print(cw.__version__)
# 应该输出类似 5.6.0 的版本号
2.4.2 常见问题
- libusb 报错:Windows 下需要安装 Zadig 驱动,把 ChipWhisperer 的 USB 设备驱动从 WinUSB 换成 libusb-win32
- Jupyter 内核卡死:检查是不是同时开了多个采集会话,ChipWhisperer 的 FPGA 固件一次只能被一个进程占用
- Python 版本冲突:ChipWhisperer 库目前不支持 Python 3.11+,老老实实用 3.9
2.5 示波器与探针基础
虽然 ChipWhisperer 板载了采集电路,但有时候你还是得用示波器——比如调试触发信号,或者验证采集到的功耗曲线质量。
示波器选型建议:
| 参数 | 入门级(如 Rigol DS1054Z) | 专业级(如 PicoScope 6407) |
|---|---|---|
| 带宽 | 50 MHz | 500 MHz |
| 采样率 | 1 GS/s | 5 GS/s |
| 垂直分辨率 | 8-bit | 12-bit |
| 价格 | 约 3000 元 | 约 1.5 万元 |
探针使用技巧:测功耗曲线时,探针的地线要尽量短。我见过有人用 10cm 长的地线夹,结果采集到的信号全是 50Hz 工频干扰。正确的做法是:用探针自带的弹簧接地针,直接怼到目标板的 GND 焊盘上。
2.6 实验板连接与验证
硬件连接其实就四步:
- 用 USB 线把 ChipWhisperer 连到电脑
- 把目标板(比如 CW1173 自带的 XMEGA)插到 ChipWhisperer 的排针上
- 用 SMA 线连接 ChipWhisperer 的“Trigger Out”和示波器的 CH1
- 上电,检查 ChipWhisperer 的 LED 是否亮起
连接完成后,跑一个简单的验证脚本:
import chipwhisperer as cw
# 连接 ChipWhisperer
scope = cw.scope()
target = cw.target(scope)
# 设置采集参数
scope.clock.clkgen_freq = 7.37e6 # 目标芯片时钟 7.37 MHz
scope.clock.adc_src = "clkgen_x4" # ADC 时钟 = 4 倍目标时钟
# 采集一条功耗曲线
trace = cw.capture_trace(scope, target, plaintext=[0]*16, key=[0]*16)
# 打印曲线长度
print(f"采集到 {len(trace.wave)} 个采样点")
# 如果输出 2560,说明一切正常
注意:如果采集到的曲线全是 0 或者全是噪声,先检查触发信号。我曾经花了一下午排查,最后发现是目标芯片的触发 GPIO 没配置成输出模式。用示波器量一下 Trigger Out 引脚,看有没有一个从低到高的跳变——没有的话,就是固件配置有问题。
2.7 知识体系总览
下面这张图把本章的核心逻辑串起来了。你对照着看,心里就有谱了。
环境搭好之后,下一步就是动手采集第一条功耗曲线了。别急,先把这章的内容消化掉——尤其是接地和触发这两个点,搞不定它们,后面全是白搭。