2. 实验环境搭建:ChipWhisperer Lite 介绍、目标板连接、OpenADC 配置、Python 环境与库安装

好,咱们正式开始动手。这一章的目标很明确——把实验环境搭起来,让 ChipWhisperer Lite 能跟你的电脑正常通信。我见过不少学员卡在这一步,其实说白了就是几个关键点没对齐。咱们一步步来,别急。

2.1 ChipWhisperer Lite 是什么?

ChipWhisperer Lite(简称 CW-Lite)是一套开源的嵌入式安全测试平台。它集成了故障注入(Glitch)和侧信道分析(Power Analysis)两大功能。我个人习惯把它看作一个“硬件调试器 + 示波器 + 信号发生器”的合体。

它的核心部件包括:

  • 主控 FPGA(Spartan-6):负责产生 Glitch 信号、捕获功耗曲线。
  • OpenADC 模块:一个可编程的模数转换器,用来采样目标芯片的功耗或电磁辐射。
  • 目标板接口:通过排针连接不同的目标板(如 XMEGA、STM32F0 等)。
  • USB 接口:供电 + 数据通信,一根线搞定。

关键参数速查表

参数典型值说明
ADC 采样率最高 105 MS/s实际常用 20-40 MS/s
ADC 分辨率10 bit够用,但要注意噪声
Glitch 精度~1 ns取决于 FPGA 时钟
目标电压3.3V / 1.8V通过跳线选择

嗯,这里要注意:CW-Lite 的 ADC 是 10 位的,不是 12 位或更高。我在项目中遇到过有人拿它跟高端示波器比,其实没必要。10 位对于故障注入的功耗分析完全够用,关键是采样率和触发时机要调对。

2.2 目标板连接

CW-Lite 默认配了一块 XMEGA 目标板。连接方式很简单,但有几个坑得提前说。

2.2.1 硬件连接步骤

  1. 断电操作:先把 CW-Lite 的 USB 拔掉。我曾经带电插拔目标板,结果烧了一个 IO 口……从那以后我养成了断电再插拔的习惯。
  2. 对准排针:目标板的 20pin 排针对准 CW-Lite 的母座。注意方向——板子上的丝印三角形标记对准 CW-Lite 上的“J1”标记。
  3. 检查跳线:确认电压跳线(VTarget)在 3.3V 位置。如果目标板是 1.8V 的,记得先改跳线再上电。
  4. 上电:插上 USB,CW-Lite 的绿灯亮起,目标板的电源指示灯也亮,就对了。

常见连接问题

  • 目标板灯不亮 → 检查跳线是否松动,或者 USB 供电不足(换根线试试)。
  • 电脑识别不到设备 → 驱动没装好,后面会讲。
  • 采样波形全是噪声 → 目标板的地线没接好,检查排针的 GND 引脚。

2.3 OpenADC 配置

OpenADC 是 CW-Lite 的“眼睛”。配置不对,采到的信号就是一团浆糊。我刚开始用的时候,光调这个就花了两天……

2.3.1 核心配置项

参数作用我的建议值
采样率每秒采多少个点20 MS/s(平衡精度与数据量)
触发源什么时候开始采目标板 IO 引脚上升沿
增益放大信号幅度10-20 dB(视信号强弱)
偏移调整信号直流偏置使波形居中在 ADC 量程内
低通滤波滤除高频噪声开启,截止频率 10 MHz

2.3.2 通过 Python 配置 OpenADC

配置 OpenADC 是通过 ChipWhisperer 的 Python 库完成的。下面是一个典型的初始化代码:

import chipwhisperer as cw

# 连接设备
scope = cw.scope()

# 配置 ADC
scope.adc.samples = 2000          # 每次采样 2000 个点
scope.adc.offset = 0              # 偏移设为 0,后续微调
scope.adc.gain = 20               # 增益 20 dB
scope.adc.lowpass = True          # 开启低通滤波
scope.adc.clk_freq = 20E6         # 采样时钟 20 MHz

# 配置触发
scope.trigger.triggers = 'tio4'   # 使用目标板 IO4 作为触发
scope.trigger.io4 = 'high'        # 上升沿触发

# 验证连接
print("OpenADC 配置完成,采样率:", scope.adc.clk_freq/1E6, "MS/s")

调试技巧:如果波形幅度太小,先调增益,不要动偏移。偏移是用来让波形在 ADC 量程中间位置的,调错了会导致波形削顶或削底。

2.4 Python 环境与库安装

软件环境是很多人翻车的地方。我建议用虚拟环境,别直接装到系统 Python 里,不然以后版本冲突够你头疼的。

2.4.1 安装步骤

  1. 安装 Python 3.8-3.11:ChipWhisperer 目前对 3.12 支持不太好,我踩过这个坑。
  2. 创建虚拟环境:
    python -m venv cw_env
    source cw_env/bin/activate  # Linux/Mac
    cw_env\Scripts\activate     # Windows
  3. 安装 ChipWhisperer 库:
    pip install chipwhisperer
    这会自动安装 numpy、matplotlib、pyusb 等依赖。
  4. 安装驱动(Windows 用户注意):
    • 下载 Zadig 工具(开源驱动安装器)。
    • 将 CW-Lite 的 USB 驱动从“USB 串行设备”改为“WinUSB”或“libusb-win32”。
    • 不改驱动的话,Python 库无法通过 USB 与设备通信。
  5. 验证安装:
    python -c "import chipwhisperer as cw; print(cw.__version__)"
    如果打印出版本号,恭喜你,环境搭好了。

驱动安装避坑:Zadig 里选择设备时,一定要选“ChipWhisperer Lite”或“CW-Lite”,别选成别的 USB 设备。我曾经手滑把鼠标的驱动改了……结果鼠标动不了了。

2.5 实验环境整体架构

下面这张图展示了整个实验环境的逻辑关系。你把它理解成“电脑发命令 → CW-Lite 执行攻击 → 目标板响应 → CW-Lite 采集数据 → 电脑分析”的闭环。

实验环境架构图 电脑(Python 控制) ChipWhisperer Lite 目标板(XMEGA) USB 控制/数据 Glitch/采样 功耗/触发信号 OpenADC 模块 FPGA 逻辑 USB 接口 关键流程 1. 电脑下发攻击参数 2. CW-Lite 执行故障注入 3. 目标板响应并输出 4. CW-Lite 采集数据回传

这张图里,电脑通过 USB 控制 CW-Lite,CW-Lite 再通过排针与目标板交互。OpenADC 模块负责采样目标板的功耗信号,FPGA 负责生成 Glitch 脉冲。整个流程是闭环的——你写 Python 脚本,CW-Lite 执行,数据再回到电脑分析。

2.6 验证环境是否正常

环境搭好之后,跑一个最简单的测试脚本,确认所有组件都能正常工作:

import chipwhisperer as cw
import time

# 连接设备
scope = cw.scope()
target = cw.target(scope)

# 读取目标板 ID(如果能读到,说明通信正常)
id_string = target.read_id()
print("目标板 ID:", id_string)

# 采集一段空白波形(不执行任何操作)
scope.arm()
time.sleep(0.1)
scope.capture()
trace = scope.get_last_trace()
print("波形长度:", len(trace), "个采样点")

# 断开连接
scope.disconnect()
target.disconnect()
print("环境验证通过!")

预期结果:如果一切正常,你会看到目标板 ID(比如“XMEGA”),以及一段长度为 2000 的波形数据。波形可能是一条直线或轻微噪声——这没关系,说明 ADC 在工作。