3、功耗分析基础:CMOS电路功耗模型、简单功耗分析(SPA)、差分功耗分析(DPA)原理
各位同学,咱们今天聊点硬核的——功耗分析。你可能会问:为什么侧信道攻击要盯着功耗看?说白了,芯片在工作时,它的“呼吸”会出卖它。我做了这么多年安全评估,见过太多设计精良的系统,最后栽在功耗这根“毛细血管”上。
3.1 CMOS电路的功耗模型
先说说CMOS电路是怎么“喘气”的。CMOS,全称是互补金属氧化物半导体。嗯,名字挺长,但原理不复杂。
CMOS电路里,功耗主要分三块:
- 动态功耗:电路翻转时产生的。这是大头,占了80%以上。
- 静态功耗:电路不干活时也在漏电。工艺越先进,漏电越严重。
- 短路功耗:翻转瞬间,PMOS和NMOS同时导通的那一刹那。
我个人习惯把动态功耗看作“干活时的汗水”,静态功耗就是“站着不动也在流汗”。你想想看,一个门电路从0变1,或者从1变0,都要给电容充放电。这个充放电的电流,就是我们能捕捉到的信号。
动态功耗的公式很简单:
P_dynamic = α × C_L × V_DD² × f
其中:
- α 是翻转活动因子(0到1之间)
- C_L 是负载电容
- V_DD 是供电电压
- f 是时钟频率
关键点:功耗和电压的平方成正比。这意味着,电压稍微波动一下,功耗变化就很明显。攻击者就是利用这个特性。
我在项目中遇到过一件事。有个客户说他们的芯片功耗“很稳定”,结果我们用高精度示波器一测,发现每个时钟周期里,功耗波形都有细微差异。为什么?因为数据不同,翻转的门电路数量不同。这就是功耗分析的物理基础。
3.2 简单功耗分析(SPA)
SPA,说白了就是“用眼睛看波形”。你不需要复杂的统计工具,拿个示波器,盯着功耗轨迹看就行。
SPA能干什么?
- 识别指令序列(比如:乘法指令功耗大,空操作功耗小)
- 区分分支跳转(条件成立和不成立,功耗不一样)
- 发现密钥的某些特征(比如DES算法中的轮数)
举个例子。我曾经分析过一个智能卡,它在执行RSA模幂运算时,功耗波形长这样:
时间轴 →
高功耗段:████████████████████
低功耗段:░░░░░░░░░░░░░░░░░░░░
高功耗段:████████████████████
低功耗段:░░░░░░░░░░░░░░░░░░░░
看到没?高功耗段对应“乘法并取模”,低功耗段对应“平方并取模”。攻击者只要数一数高功耗段的数量,就能知道密钥里有多少个1。这就是SPA的威力——简单,但致命。
避坑指南:我曾经以为SPA只能对付老旧的8位单片机。后来发现,ARM Cortex-M系列在某些场景下,功耗波形也能直接读出指令序列。别小看它。
SPA的局限性也很明显:它依赖肉眼观察,只能提取粗粒度的信息。如果密钥被掩码保护了,或者算法本身功耗均衡,SPA就抓瞎了。这时候,我们需要更强大的工具——DPA。
3.3 差分功耗分析(DPA)原理
DPA,这才是真正的“大杀器”。它不依赖单个波形,而是收集成千上万条功耗轨迹,用统计学方法把信号从噪声里“捞”出来。
DPA的核心思想是什么?我总结成一句话:猜一个密钥,分两组,看差异。
具体步骤:
- 采集:让设备加密N个不同的明文,同时记录N条功耗轨迹。
- 猜测:针对密钥的某一位(比如第1个字节),枚举所有可能的256个值。
- 分组:对于每个猜测值,计算一个中间值(比如S盒输出)。根据这个中间值的某一位(比如最低位),把N条轨迹分成两组:Group0(该位为0)和Group1(该位为1)。
- 差分:计算两组轨迹的平均值,然后相减。如果猜对了,差分波形上会出现明显的尖峰;如果猜错了,差分波形就是一条平线(噪声)。
为什么能成功? 因为正确的分组,把“功耗有差异”的轨迹分开了。错误的猜测,相当于随机分组,两组平均后差异被抵消了。
我画了一张图,帮你理解DPA的流程:
DPA的数学本质是什么?是计算两组数据的均值差异。如果差异显著(t检验的p值很小),说明我们的分组有意义——也就是密钥猜对了。
注意:DPA需要对齐功耗轨迹。如果每次采样的时间偏移不一样,差分信号会被“抹平”。我见过有人采集了10万条轨迹,因为没对齐,一个尖峰都没出来。白干了。
3.4 三种方法的对比
我把这三种方法放在一起,给你一个直观的对比:
| 方法 | 需要的轨迹数 | 抗噪声能力 | 能提取的信息 | 典型应用场景 |
|---|---|---|---|---|
| SPA | 1~10条 | 弱 | 指令序列、算法结构 | 识别算法、逆向工程 |
| DPA | 1000~100000条 | 强 | 密钥字节、中间值 | 破解AES、DES密钥 |
| CPA(相关功耗分析) | 100~10000条 | 中等 | 密钥字节 | 与DPA类似,但更高效 |
嗯,这里要注意:DPA虽然强大,但它不是万能的。如果芯片有随机延时插入、频率抖动、或者掩码保护,DPA的难度会指数级上升。我曾经花了两周时间,才攻破一个加了随机延时的AES实现——那感觉,就像在暴风雨里听蚊子叫。
3.5 实战中的小技巧
最后,分享几个我在项目中积累的经验:
- 采样率要够:至少是时钟频率的4倍。比如芯片跑20MHz,采样率至少80MS/s。
- 触发要精准:用加密开始的信号作为触发,确保每条轨迹的起点一致。
- 先做SPA,再做DPA:先用SPA看看波形里有没有明显的特征,再决定要不要上DPA。
- 别忘了去噪:简单的均值滤波就能提升信噪比。我习惯先做5点滑动平均。
个人经验:有一次我分析一个蓝牙芯片,功耗波形里全是射频干扰。后来我在电源线上串了一个10Ω电阻,再用差分探头测量电阻两端的电压——效果立竿见影。有时候,硬件上的小改动,比软件算法管用得多。
好了,功耗分析的基础就讲到这里。记住:CMOS功耗模型是理论基础,SPA是入门功夫,DPA是进阶利器。下一章,我们会深入DPA的实战细节,包括如何选择“区分函数”、如何计算相关系数。到时候,我会拿一个真实的AES-128案例,手把手带你走一遍。
公众号:蓝海资料掘金营,微信deep3321