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的核心思想是什么?我总结成一句话:猜一个密钥,分两组,看差异

具体步骤:

  1. 采集:让设备加密N个不同的明文,同时记录N条功耗轨迹。
  2. 猜测:针对密钥的某一位(比如第1个字节),枚举所有可能的256个值。
  3. 分组:对于每个猜测值,计算一个中间值(比如S盒输出)。根据这个中间值的某一位(比如最低位),把N条轨迹分成两组:Group0(该位为0)和Group1(该位为1)。
  4. 差分:计算两组轨迹的平均值,然后相减。如果猜对了,差分波形上会出现明显的尖峰;如果猜错了,差分波形就是一条平线(噪声)。

为什么能成功? 因为正确的分组,把“功耗有差异”的轨迹分开了。错误的猜测,相当于随机分组,两组平均后差异被抵消了。

我画了一张图,帮你理解DPA的流程:

DPA攻击流程 步骤1:采集功耗轨迹 N个明文 → N条轨迹 步骤2:猜测密钥字节 枚举256个可能值 步骤3:计算中间值 如S盒输出 步骤4:根据中间值某一位分组 Group0(该位=0) vs Group1(该位=1) 步骤5:求两组平均轨迹 Avg0 和 Avg1 步骤6:计算差分 Diff = Avg1 - Avg0 结果:有尖峰 → 猜对了;无尖峰 → 猜错了

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