第四章 简单功耗分析:从芯片的“呼吸”中读懂秘密
各位同学,欢迎来到侧信道攻击的实战第一站。今天咱们聊的“简单功耗分析”,也就是SPA,可以说是整个侧信道领域的敲门砖。你不需要昂贵的设备,不需要复杂的数学,只需要一台示波器,就能从芯片的功耗波形里,读出它正在执行的指令——甚至直接提取出密钥。
听起来像科幻?其实原理非常朴素。我刚开始接触这个领域时,也觉得不可思议。直到我在实验室里,亲眼看着一条条波形和指令集一一对应上,才真正相信:芯片的功耗,就是它最诚实的“心跳”。
4.1 功耗分析基础:为什么芯片会“漏电”?
要理解SPA,先得明白一个核心问题:芯片在执行不同操作时,为什么功耗会不一样?
答案藏在CMOS电路里。CMOS是数字芯片最主流的工艺,它的功耗模型其实很简单——动态功耗占大头。说白了,就是晶体管在翻转(从0变1,或从1变0)的那一瞬间,会消耗电流。不翻转的时候,静态功耗非常小。
你想想看,一个加法器执行一次加法,和一条空操作NOP指令,内部有多少晶体管在翻转?差别巨大。这个功耗差异,就是SPA攻击的物理基础。
核心观点: 功耗波形 = 芯片内部活动的“实时监控”。指令不同,数据不同,功耗就不同。SPA就是直接“看”这个波形,来推断芯片在干什么。
4.2 CMOS电路功耗模型:从物理到波形
我们来拆解一下CMOS的功耗构成。我个人习惯把功耗分为三类,这样在分析波形时思路会更清晰:
| 功耗类型 | 产生原因 | SPA相关性 |
|---|---|---|
| 动态功耗 | 晶体管翻转时,对负载电容充放电 | 主要分析对象。指令/数据变化越剧烈,功耗尖峰越高 |
| 短路功耗 | 翻转瞬间,PMOS和NMOS同时导通 | 次要因素,但会叠加在动态功耗上,影响波形细节 |
| 静态功耗 | 漏电流,晶体管关断不彻底 | 通常忽略。但在低功耗芯片中,漏电流差异也可能被利用 |
在实际波形上,你看到的就是一条连续的曲线。高电平代表高功耗(大量翻转),低电平代表低功耗(空闲或NOP)。
我的经验: 刚开始做SPA时,别急着分析复杂算法。先拿一个简单的单片机,跑一个循环:先执行100次加法,再执行100次NOP。你会看到波形上出现明显的“高功耗区”和“低功耗区”。这个实验我建议每个人都做一遍,能帮你建立最直观的“功耗-指令”对应关系。
4.3 SPA攻击原理与实验:手把手教你“读心术”
SPA的原理一句话就能说清:直接观察单条或多条功耗轨迹,从中提取出与操作或数据相关的信息。
为什么叫“简单”?因为它不需要统计平均,不需要差分分析。你盯着波形看,就能看出名堂。比如,RSA算法中的平方和乘法操作,功耗特征明显不同。攻击者只要识别出波形中“平方”和“乘法”的序列,就能直接推导出私钥的比特位。
我给大家画一张SPA攻击的流程图,方便理解整个攻击链路:
4.3.1 实验:识别RSA的平方-乘法
咱们来一个具体的实验。假设目标芯片在执行RSA模幂运算。算法是:从左到右扫描密钥位,每位都做一次平方,如果当前位是1,再多做一次乘法。
波形上会是什么样?
- 平方操作: 波形呈现一个固定的、重复的功耗模式。
- 乘法操作: 波形呈现另一个不同的功耗模式,通常比平方更复杂,功耗尖峰更高。
攻击者只要把波形里“平方”和“乘法”的序列识别出来,密钥就一目了然。比如波形序列是:平方、平方+乘法、平方、平方+乘法、平方+乘法……对应的密钥位就是:0、1、0、1、1……
注意: 实际攻击中,波形可能因为噪声、时钟抖动等原因不那么清晰。我曾经遇到过一个案例,芯片内部有随机延迟插入,导致波形对齐困难。这时候就需要一些预处理技巧,比如重采样或互相关对齐。但原理不变——你只要能看到“两种不同的操作模式”,攻击就成功了一半。
4.4 SPA防御方法:让芯片的“心跳”变得难以捉摸
了解了攻击原理,防御思路就清晰了。核心目标只有一个:让不同操作的功耗特征尽可能一致,让攻击者无法从波形上区分出指令或数据。
我总结了几种常见的防御手段,按效果和成本排序:
| 防御方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 操作平衡 | 让所有分支操作执行时间、功耗模式相同 | 对SPA效果显著 | 可能增加执行时间,算法设计复杂 |
| 随机延迟插入 | 在操作中插入随机长度的空操作或等待 | 破坏波形对齐,增加攻击难度 | 不能消除功耗差异,只是让识别更困难 |
| 掩码技术 | 用随机数掩盖中间值,使功耗与真实数据无关 | 同时防御SPA和DPA | 需要额外的随机数生成和计算开销 |
| 恒定功耗逻辑 | 设计电路时,确保每个时钟周期翻转的晶体管数量恒定 | 从物理层面消除差异 | 设计难度大,面积和功耗开销高 |
我的建议: 如果你是做嵌入式开发的,优先考虑“操作平衡”和“随机延迟”。这两者实现相对简单,对SPA的防御效果立竿见影。比如在RSA实现中,把“平方-乘法”算法改成“平方-乘法-总是乘法”的蒙哥马利阶梯,就能让每次迭代都执行相同的操作序列,波形上再也分不清哪次是平方、哪次是乘法。
4.4.1 避坑指南:我曾经踩过的坑
讲几个我亲身经历过的防御误区,你们以后设计时一定要避开:
- 只加随机延迟,不改算法: 我曾经见过一个产品,只在乘法操作前加了随机延迟。攻击者虽然波形对不齐,但通过统计多次波形,还是能看出“有延迟”和“无延迟”两种模式,进而推断出密钥。随机延迟只能增加成本,不能根除问题。
- 忽略数据依赖: 有些防御只关注操作平衡,但没考虑数据本身对功耗的影响。比如,处理0x00和0xFF时,总线翻转数量完全不同。即使操作序列一样,功耗波形还是有差异。这时候需要结合掩码技术。
- 过度依赖硬件: 恒定功耗逻辑听起来很美,但实际芯片中很难做到绝对恒定。我测试过一款号称“SPA免疫”的专用芯片,结果在特定频率下,还是能测出微小的功耗差异。软件层面的防御,往往是性价比更高的选择。
4.5 本章小结
SPA攻击,说白了就是“眼见为实”。你不需要复杂的统计工具,只需要一双能看懂波形的眼睛。CMOS电路的功耗模型告诉我们,芯片的每一次“呼吸”都暴露了它的内部活动。而防御的核心,就是让这些“呼吸”变得均匀、不可预测。
记住:没有绝对安全的系统,只有不断升级的攻防。 理解SPA,不是为了让你去破解别人的设备,而是让你在设计自己的系统时,能多一份对物理世界的敬畏。