ChipWhisperer实战:STM32F303目标板的波形采集与AES加密分析

张开发
2026/4/12 17:11:29 15 分钟阅读

分享文章

ChipWhisperer实战:STM32F303目标板的波形采集与AES加密分析
1. 硬件准备与连接指南CW308 UFO开发板是嵌入式安全研究的绝佳平台特别是搭配STM32F303目标板使用时。我第一次接触这套设备时被它的模块化设计惊艳到了——就像乐高积木一样可以灵活组合各种处理器模块。STM32F303芯片基于ARM Cortex-M4内核72MHz主频配合硬件浮点运算单元让它成为执行AES加密等安全算法的理想选择。关键硬件清单CW308 UFO主板带20pin排针接口STM32F303目标板需正确插入主板插槽ChipWhisperer Lite/Pro捕获板USB数据线建议使用带磁环的抗干扰线材示波器探头可选用于额外信号监测连接步骤其实比想象中简单将STM32F303目标板插入CW308主板的DIP插槽注意防呆缺口方向用排线连接捕获板的HS2接口与主板的20pin接口通过USB线将捕获板连接到电脑给主板供电可通过捕获板供电或外接电源我遇到过最典型的连接问题是信号干扰这时可以尝试缩短所有连接线长度在电源线上加装磁环确保所有接插件完全插入远离手机、路由器等无线设备2. 固件开发实战详解为STM32F303编写AES加密固件时我建议采用模块化设计。下面这个项目结构是我经过多次优化后的版本特别适合初学者理解stm32f303-aes/ ├── Makefile ├── include/ │ ├── aes.h │ └── simpleserial.h ├── src/ │ ├── main.c │ └── simpleserial-aes.c └── firmware/ (链接到ChipWhisperer安装目录)Makefile的黄金配置TARGET stm32f303-aes SRC $(wildcard *.c) SRC $(wildcard src/*.c) EXTRAINCDIRS include/ FIRMWAREPATH /opt/chipwhisperer/hardware/victims/firmware include $(FIRMWAREPATH)/simpleserial/Makefile.simpleserial通信协议方面Simpleserial v2.1比v1.1更实用主要体现在支持最大255字节数据传输v1.1仅限16字节新增子命令字段方便扩展功能更灵活的错误处理机制一个典型的命令回调函数应该这样写uint8_t encrypt_handler(uint8_t cmd, uint8_t scmd, uint8_t len, uint8_t *data) { trigger_high(); // 触发采集 uint8_t cipher[16]; aes_encrypt(data, cipher); // 实际加密操作 trigger_low(); // 结束采集 simpleserial_put(r, 16, cipher); // 返回结果 return 0x00; }3. 波形采集技巧大全在Jupyter Notebook中配置采集环境时这些参数直接影响采集质量scope.gain.db 25 # 增益设置建议20-30 scope.clock.adc_mul 4 # 每个时钟周期采样点数 scope.adc.samples 2500 # 总采样点数 scope.adc.offset 500 # 触发位置偏移常见采集问题排查表现象可能原因解决方案波形幅度太小增益过低逐步增加scope.gain.db值波形削顶增益过高降低增益或调整目标板供电电压波形抖动时钟不同步检查连接线确保时钟信号稳定无触发信号固件未正确设置trigger检查固件中的trigger_high/low调用我常用的采集流程优化技巧先用单次采集模式观察波形调整offset使关键操作位于采样窗口中央逐步增加采样点数直到覆盖完整加密过程最后批量采集时启用进度条监控from tqdm.notebook import trange traces [] for i in trange(1000, desc采集进度): # 采集代码...4. AES加密的波形特征分析当STM32F303执行AES加密时电源波形会呈现明显的10轮特征。通过DWT周期计数器我测得单次加密约消耗3200个时钟周期72MHz主频下约44.4μs。典型波形分段解析初始密钥加载约200周期轮密钥加操作每轮约300周期字节代换明显的峰值脉冲行移位功耗变化平缓列混淆出现规律性波动这是我常用的分析代码框架import numpy as np import matplotlib.pyplot as plt traces np.load(aes_traces.npy) avg_trace np.mean(traces, axis0) plt.figure(figsize(12,4)) plt.plot(avg_trace) plt.xlabel(采样点) plt.ylabel(电压(mV)) plt.title(AES加密平均功耗波形) plt.show()关键点定位技巧使用np.diff()计算波形一阶差分找突变点对多条轨迹做对齐处理Dynamic Time Warping重点关注S盒查找操作对应的功耗尖峰5. 数据存储与高级分析原始波形数据建议采用二进制格式存储我对比过几种格式格式优点缺点适用场景.npy加载快Python原生支持非跨平台快速原型开发.trs专业格式含元数据需要专用库长期存档.h5支持压缩结构清晰依赖h5py库大数据集TRS文件生成示例from trsfile import trs_open, Trace from trsfile.parametermap import TraceParameterMap with trs_open(data.trs, w) as trs: param_map TraceParameterMap() param_map[plaintext] plaintext_array[0] trs.append(Trace(SampleCoding.FLOAT, trace_array[0], param_map))进阶分析我推荐这些方法差分功耗分析(DPA) - 针对密钥恢复模板攻击 - 需要已知密钥训练数据时序分析 - 检测侧信道泄露故障注入 - 研究错误行为6. 实战中的经验分享调试STM32F303目标板时我踩过几个典型的坑时钟配置问题 有一次发现波形周期异常最后发现是忘记启用DWT周期计数器。正确的初始化应该是CoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; DWT-CYCCNT 0; DWT-CTRL | DWT_CTRL_CYCCNTENA_Msk;电源噪声干扰 当发现波形毛刺过多时可以在目标板电源引脚加装0.1μF去耦电容使用线性稳压电源替代开关电源缩短接地线长度确保良好接触采集同步技巧在加密函数开始前设置GPIO触发信号使用scope.trigger模块的Rising Edge模式适当调整触发延迟(scope.trigger.delay)这些实战经验往往比理论更管用特别是在赶项目进度时。建议新手先从少量采集100-1000条开始逐步验证每个环节再开展大规模数据采集。

更多文章