3. 功耗分析基础:CMOS电路功耗模型、动态功耗与静态功耗、数据依赖型功耗
做侧信道攻击,说白了就是跟芯片的「小动作」打交道。芯片在干活的时候,会不自觉地泄露一些物理信息——功耗就是其中最典型的一种。你想想看,一个电路在算不同数据的时候,它消耗的能量其实是不一样的。我们就是利用这个差异,把密钥给「猜」出来。
这一节,我带你从最底层的CMOS电路功耗模型讲起。别怕,咱们不搞复杂的公式推导,重点是把原理讲透,让你知道「为什么功耗会跟数据有关」。
3.1 CMOS电路的功耗模型
现在的智能卡芯片,绝大多数都是用CMOS工艺做的。CMOS的全称是互补金属氧化物半导体,它由PMOS和NMOS两种管子组成。这两种管子像一对搭档,一个开的时候另一个就关,所以静态时几乎不耗电。
但芯片一旦开始工作,情况就变了。CMOS电路的功耗主要分两块:动态功耗和静态功耗。咱们做侧信道攻击,主要盯着动态功耗看,因为它是数据依赖的。
核心观点:动态功耗 ≈ 开关活动 × 负载电容 × 电压² × 频率。其中「开关活动」就是数据依赖的关键。
我刚开始接触侧信道时,总觉得功耗分析就是测电流。后来踩过坑才明白,如果不理解这个模型,你连波形都看不懂。嗯,这里要注意,静态功耗虽然小,但在先进工艺下也不能完全忽略。
3.2 动态功耗:芯片干活时的「呼吸」
动态功耗发生在电路状态翻转的时候。比如一个反相器,输入从0变1,输出就从1变0。这个过程中,PMOS和NMOS会短暂地同时导通,形成短路电流。同时,负载电容也会被充电或放电。
动态功耗的公式很简单:
P_dynamic = α × C_L × V_DD² × f
其中:
- α:开关活动因子(0到1之间),表示每个时钟周期内节点翻转的概率
- C_L:负载电容,包括门电容和互连线电容
- V_DD:电源电压
- f:工作频率
说白了,α就是数据依赖的根源。不同的数据,会导致不同的比特位翻转,从而产生不同的功耗。
实战经验:我在做AES攻击时,发现S盒输出的汉明重量(即1的个数)跟功耗波形高度相关。这就是因为S盒输出不同,导致后续寄存器翻转的位数不同,α值就变了。
3.3 静态功耗:芯片待机时的「漏气」
静态功耗,也叫漏电流功耗。即使电路不翻转,管子也不是完全关断的,总会有微弱的电流漏过去。在早期的0.18μm工艺下,静态功耗几乎可以忽略。但到了28nm以下,漏电流越来越大,静态功耗占比就上来了。
静态功耗的公式:
P_static = I_leakage × V_DD
I_leakage包括亚阈值漏电流、栅极漏电流和源漏穿通漏电流。这些漏电流跟温度、电压、工艺角都有关系。
注意:静态功耗虽然不直接依赖数据,但它会叠加在动态功耗上,形成基线噪声。如果你的测量设备精度不够,这个基线噪声可能会淹没有用的信号。我曾经因为电源纹波太大,导致静态功耗波动,差点把攻击结果搞废了。
3.4 数据依赖型功耗:侧信道攻击的「命门」
这才是咱们最关心的部分。数据依赖型功耗,说白了就是芯片在处理不同数据时,消耗的能量不一样。为什么会这样?
原因有两个:
- 汉明重量模型:数据总线上的比特位翻转次数不同。比如数据从0x00变成0xFF,8个比特全部翻转,功耗最大;从0x00变成0x01,只有1个比特翻转,功耗最小。
- 汉明距离模型:前后两个状态之间的比特差异。这个模型更精确,因为它考虑了寄存器的初始状态。
我个人的习惯是,在攻击初期先用汉明重量模型快速定位,再用汉明距离模型做精细分析。你想想看,如果连哪个比特在翻转都搞不清楚,那攻击就无从下手了。
3.5 功耗模型与攻击的关系
理解了功耗模型,你就知道侧信道攻击的本质了:
- 简单功耗分析(SPA):直接看功耗波形,识别出不同的操作(比如乘法、加法、条件分支)。
- 差分功耗分析(DPA):用统计方法,找出功耗波形跟中间数据之间的相关性。
- 相关功耗分析(CPA):用相关系数来量化功耗与数据之间的线性关系。
这些攻击方法,底层都依赖同一个事实:功耗是数据的函数。没有这个前提,侧信道攻击就不存在。
一句话总结:CMOS电路的动态功耗随数据变化,这个变化虽然微小,但足够被我们捕捉和分析。这就是侧信道攻击的物理基础。
3.6 知识体系结构图
下面这张图,把这一节的核心逻辑串起来了。你可以把它当作一个思维导图来用。
这张图从CMOS功耗模型出发,分出了动态和静态两条线。动态功耗里的开关活动因子α,直接导致了数据依赖型功耗。而数据依赖型功耗,正是SPA、DPA、CPA这些攻击方法的基础。你顺着这个逻辑走一遍,就能把整个知识体系串起来了。
好了,这一节的内容就到这儿。功耗模型是侧信道攻击的根基,理解透了,后面的攻击方法学起来就顺了。下一节咱们会聊功耗采集的硬件设置,包括示波器怎么接、采样率怎么设、怎么降噪——这些都是实战中绕不开的细节。