第一章:ChipWhisperer概述
硬件安全与侧信道攻击简介
说到硬件安全,很多人第一反应是「加密算法够强就行」。其实不然。我见过太多产品,算法选的是AES-256,理论上牢不可破,结果实际用起来,功耗波形一采集,密钥就暴露了。
为什么会这样?因为芯片在执行运算时,电流消耗会随着处理的数据变化。你想想看,CPU内部翻转的晶体管数量不同,耗电自然不一样。这种物理层面的泄露,软件层面根本防不住。
侧信道攻击,说白了就是利用这些物理泄露来破解秘密。常见的侧信道包括:
- 功耗分析:采集芯片运行时的电流变化
- 电磁辐射分析:捕捉芯片周围的电磁场波动
- 时序分析:测量不同输入下的执行时间差异
- 故障注入:通过电压毛刺或激光干扰芯片运行
其中功耗分析是最容易上手、效果也最直接的。我在帮客户做安全评估时,十次里有八次先用功耗分析试试水——往往第一次就能抓到问题。
核心观点:硬件安全不是加密算法的选择题,而是物理实现的必答题。算法再强,物理泄露不堵住,等于白搭。
ChipWhisperer平台介绍
ChipWhisperer是什么?它是一套专门用来做侧信道攻击和防护研究的开源硬件平台。NewAE Technology公司做的,我用了好几年,确实顺手。
这套平台包含几个核心部件:
- 捕获板(Capture Board):负责采集功耗波形,自带ADC和放大器
- 目标板(Target Board):运行被攻击的固件,通常是AVR或ARM芯片
- 编程器(Programmer):烧录固件到目标板上
- 软件工具链:Python库 + Jupyter Notebook环境
我最喜欢ChipWhisperer的一点是,它把实验室里那套昂贵的示波器+探针方案,压缩到了几百美元的桌面设备上。而且所有软件开源,想改哪里改哪里。
| 组件 | 功能 | 我常用的型号 |
|---|---|---|
| 捕获板 | 高速采样(最高200MS/s) | CW-Husky |
| 目标板 | 运行待测固件 | CW308T系列 |
| 编程器 | 烧录固件 | 板载编程器 |
小提示:如果你是第一次接触,建议直接买ChipWhisperer Lite套装。几百块钱,该有的都有了。我当年就是拿Lite版入的门,到现在还在用。
功耗分析攻击原理
功耗分析攻击的原理,其实不复杂。芯片在执行不同指令、处理不同数据时,消耗的电流会有微小差异。我们用高精度ADC把这些差异记录下来,然后从波形里反推出密钥。
常见的攻击方式有两种:
- 简单功耗分析(SPA):直接看单条波形,识别出不同操作。比如AES的轮运算在波形上会呈现重复的模式。
- 差分功耗分析(DPA):采集大量波形,用统计方法找出与密钥相关的微小差异。这招对付加了噪声的防护也管用。
我举个例子。假设AES加密中有一个S盒查找操作:output = SBox[input XOR key]。如果我们能猜对key的一个字节,那么所有输入对应的output就是确定的。而output的比特位会直接影响功耗——1比0耗电多一点点。采集几千条波形,按某个比特位分组求平均,两组波形之间的差异峰值,就出现在S盒执行的那个时刻。峰值越高,说明猜的key越对。
# 伪代码示意:DPA攻击流程
for key_guess in range(256):
# 假设key_guess是密钥的一个字节
# 计算所有输入对应的S盒输出
outputs = SBox[inputs XOR key_guess]
# 按outputs的最低位分组
group0 = traces[outputs.bit0 == 0]
group1 = traces[outputs.bit0 == 1]
# 计算两组波形的平均差异
diff = mean(group1) - mean(group0)
# 差异最大的key_guess就是正确答案
if max(abs(diff)) > threshold:
print(f"密钥字节 = {key_guess}")
注意:DPA攻击需要波形对齐。如果每次采样的触发点有偏移,统计结果会大打折扣。我曾经花了一整天调试对齐参数,最后发现是触发信号没接好——嗯,硬件连接永远是第一位的。
实验环境搭建与硬件连接
搭建环境这件事,说简单也简单,说坑也多。我按步骤来,你跟着做就行。
第一步:安装软件
ChipWhisperer的软件环境基于Python。我建议用Anaconda管理,省心。
# 创建虚拟环境
conda create -n chipwhisperer python=3.8
conda activate chipwhisperer
# 安装ChipWhisperer库
pip install chipwhisperer
# 验证安装
python -c "import chipwhisperer as cw; print(cw.__version__)"
第二步:硬件连接
连接顺序很重要。我习惯这样:
- 先把目标板插到捕获板的扩展接口上
- 用USB线连接捕获板到电脑
- 给目标板供电(如果是独立供电的话)
- 检查LED指示灯——正常应该亮绿色
第三步:验证通信
打开Jupyter Notebook,运行以下代码:
import chipwhisperer as cw
# 连接设备
scope = cw.scope()
target = cw.target(scope)
# 检查连接状态
print(f"Scope connected: {scope.connect_status}")
print(f"Target connected: {target.connect_status}")
# 发送一个测试命令
target.write("Hello ChipWhisperer\n")
response = target.read()
print(f"Response: {response}")
如果看到返回信息,说明环境搭好了。
避坑指南:我曾经遇到过USB线质量不好导致采样数据出错的情况。换了一根带磁环的线,问题就解决了。嗯,别小看线材的影响。
硬件连接完成后,建议先跑一下官方自带的示例程序。比如AES加密的功耗采集demo,能跑通就说明一切正常。我第一次跑通时,看到波形图上清晰的AES轮运算模式,那种感觉——嗯,就像你第一次点亮LED一样兴奋。
好了,第一章的内容就到这里。硬件连接搞定后,下一章我们会真正动手采集第一条功耗波形,看看AES加密在示波器上长什么样。