2. 功能安全基础
好,咱们正式开始动手。这一章的目标很明确——把实验环境搭起来,让 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 硬件连接步骤
- 断电操作:先把 CW-Lite 的 USB 拔掉。我曾经带电插拔目标板,结果烧了一个 IO 口……从那以后我养成了断电再插拔的习惯。
- 对准排针:目标板的 20pin 排针对准 CW-Lite 的母座。注意方向——板子上的丝印三角形标记对准 CW-Lite 上的“J1”标记。
- 检查跳线:确认电压跳线(VTarget)在 3.3V 位置。如果目标板是 1.8V 的,记得先改跳线再上电。
- 上电:插上 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 安装步骤
- 安装 Python 3.8-3.11:ChipWhisperer 目前对 3.12 支持不太好,我踩过这个坑。
- 创建虚拟环境:
python -m venv cw_env source cw_env/bin/activate # Linux/Mac cw_env\Scripts\activate # Windows - 安装 ChipWhisperer 库:
这会自动安装 numpy、matplotlib、pyusb 等依赖。pip install chipwhisperer - 安装驱动(Windows 用户注意):
- 下载 Zadig 工具(开源驱动安装器)。
- 将 CW-Lite 的 USB 驱动从“USB 串行设备”改为“WinUSB”或“libusb-win32”。
- 不改驱动的话,Python 库无法通过 USB 与设备通信。
- 验证安装:
如果打印出版本号,恭喜你,环境搭好了。python -c "import chipwhisperer as cw; print(cw.__version__)"
驱动安装避坑:Zadig 里选择设备时,一定要选“ChipWhisperer Lite”或“CW-Lite”,别选成别的 USB 设备。我曾经手滑把鼠标的驱动改了……结果鼠标动不了了。
2.5 实验环境整体架构
下面这张图展示了整个实验环境的逻辑关系。你把它理解成“电脑发命令 → CW-Lite 执行攻击 → 目标板响应 → 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 在工作。