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 安装步骤

  1. 下载并安装 Anaconda(Python 3.9+ 版本)
  2. 打开 Anaconda Prompt,创建一个新环境:conda create -n sidechannel python=3.9
  3. 激活环境:conda activate sidechannel
  4. 安装 ChipWhisperer 库:pip install chipwhisperer
  5. 安装 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 实验板连接与验证

硬件连接其实就四步:

  1. 用 USB 线把 ChipWhisperer 连到电脑
  2. 把目标板(比如 CW1173 自带的 XMEGA)插到 ChipWhisperer 的排针上
  3. 用 SMA 线连接 ChipWhisperer 的“Trigger Out”和示波器的 CH1
  4. 上电,检查 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 知识体系总览

下面这张图把本章的核心逻辑串起来了。你对照着看,心里就有谱了。

实验环境搭建知识体系 硬件平台选型 ChipWhisperer(入门) SAKURA-G(进阶) 软件环境:Python + Jupyter + ChipWhisperer 库 示波器与探针基础 实验板连接与验证 成功采集第一条功耗曲线 核心原则:时钟同步 + 触发对齐 + 低噪声接地,三者缺一不可

环境搭好之后,下一步就是动手采集第一条功耗曲线了。别急,先把这章的内容消化掉——尤其是接地和触发这两个点,搞不定它们,后面全是白搭。