1. 侧信道分析的现实痛点与Transformer的入场逻辑
1.1 侧信道分析到底在做什么
先说一句很多人不理解的话:一个加密设备被攻破,往往不是因为算法本身出了问题,而是因为物理世界泄露了秘密。
侧信道分析就是针对这种物理泄露的攻击方式。加密芯片在执行AES、SM4这类运算时,电源功耗会随着中间值的翻转而变化,电磁辐射也会留下痕迹,连运行时间、缓存命中率都可能成为攻击入口。这些泄露的物理信号被采集下来,形成一条条波形,也就是业内常说的“功耗迹线”(Power Trace)。分析者的目标,是从这些迹线中还原出密钥。
我最早接触这个方向时也犯过糊涂,觉得既然算法密码学上是安全的,为什么还要研究物理层面的攻击?后来在某个芯片安全评估项目上才真正意识到问题的严重性。某款物联网安全芯片的AES实现,理论上没有任何问题,但用功耗分析在几万条迹线上跑了一个简单的相关性攻击,密钥就被逐步拆出来了。那一刻你就明白,密码算法是数学,侧信道分析是物理,二者是两个维度的事情。
做过侧信道实战的人都知道,整个流程大致是:选目标设备、同步采集迹线、做预处理、找泄露点、跑统计攻击或建模型。传统方法主要分两类,一类是经典的差分功耗分析DPA和相关性功耗分析CPA,通过统计学手段逐字节攻击密钥;另一类是模板攻击,先在同一块开发板上建模板,再匹配目标设备的迹线。
这两类方法各有各的难处。DPA/CPA虽然不需要机器学习,但要求迹线对齐质量非常高,还要明确知道泄露点在哪个时间位置。模板攻击效果好,但前提是能拿到一台和攻击目标相同型号的设备来建模板,这在真实攻防里往往不成立。更麻烦的是,现代芯片大量引入掩码、随机延时、伪操作插入等防护措施,导致泄露位置的规律性被刻意打乱,传统统计方法的效率急剧下降。
1.2 传统方法的瓶颈在哪里
我见过不少团队在侧信道项目上卡住,卡住的点几乎都有共性。
第一个瓶颈是误对齐。芯片内部有时钟抖动和随机延时插入,采集到的迹线即使来自同一操作,波形在时间轴上也是错位的。传统方法需要对迹线做对齐预处理,比如用互相关搜索峰值、用滑动窗口做重采样。这步非常费手工,而且对抗干扰的能力有限。遇到做了随机延时的芯片,预处理本身就要消耗大量时间,效果还不稳定。
第二个瓶颈是特征维度高但标注困难。一条典型迹线可能包含几千甚至上万个采样点,而真正和密钥相关的信息可能只集中在个位数到几十个点的时间窗口里。传统方法要么靠经验确定兴趣区域,要么在全序列上硬跑统计。不管哪种,样本利用率都很低,需要采集大量迹线才能让攻击稳定成功。
第三个瓶颈是高阶防护。掩码防护的核心思路,是把中间值和随机掩码做异或,让每条迹线上的泄露值随机化,单点统计不再有效。要对抗掩码,就得对多个时间点的联合分布建模,也就是所谓的高阶分析。传统模板攻击计算二阶、三阶组合时,特征空间爆炸式增长,训练代价和存储开销都很难看。
这些瓶颈凑在一起,本质上是同一件事:迹线数据是典型的“高维、时序、小样本、强噪声”数据。传统统计方法擅长的是低维、对齐良好的数据;而深度学习,尤其是擅长处理时序的模型,天然更贴合这个场景。所以最近几年的趋势很明显——把深度学习引入侧信道分析,用CNN自动提取局部泄露特征,用RNN建模时序依赖,都在实际评估中取得了不错的成绩。
但CNN和RNN也有各自的短板,这就引出了Transformer。
1.3 Transformer为什么值得关注
先说结论:Transformer在侧信道分析里的核心吸引力,是它的全局注意力机制能跨时间点直接建立依赖关系,不需要像CNN那样靠堆叠层数来扩大感受野,也不像RNN那样存在长程信息衰减。
你可以把CNN理解成一种“只看局部”的模型,它擅长找出短窗口内功耗变化的纹理,但泄露信息分布在长时间范围内时,CNN常常需要靠很深的网络或很大的卷积核去覆盖。RNN虽然有循环结构来记忆历史,但实际训练中梯度衰减很厉害,长序列上的表现并不理想。
Transformer则是把整个序列同时拿来做注意力计算。任何一个时刻的token,都能直接通过注意力权重“看到”序列中的任意另一个时刻。对侧信道来说,这意味着模型能自动发现“某条迹线在第1200个采样点的功耗,和另一个掩码分量在第3200个采样点的翻转存在关联”,这种跨距离的关联,正是破解高阶防护时最需要的能力。
我在一个模拟掩码AES数据集上做过对比实验。同样的训练迹线条数,CNN模型的攻击成功率大约在七成左右,而用Transformer作为主干结构,成功率能稳定拉高到九成以上。尤其在噪声强度增大之后,Transformer的注意力机制对关键区域的自动聚焦明显更抗干扰。
但Transformer并不是没有代价。标准的自注意力机制,计算复杂度和序列长度的平方成正比。侧信道迹线动辄几千个点,直接按token方式送入Transformer,计算量和显存消耗都不太能接受。这也是很多团队尝试过Transformer之后又退回CNN的原因,不是效果不好,而是训练不起来。
EstraNet要解决的就是这个问题:在保留Transformer全局注意力优势的前提下,把复杂度从二次降到线性,让长迹线训练成为可能。
2. EstraNet的核心设计:线性复杂度从哪里来
2.1 标准Transformer在长序列上的代价
先算一笔账。标准自注意力的计算公式是 Attention(Q,K,V) = softmax(QK^T / sqrt(d)) V,假设序列长度是n,特征维度是d。QK^T这个矩阵乘法的计算量和n²成正比,需要O(n²)的时间和O(n²)的内存。n=5000时就是2500万个元素的计算,放在GPU上虽然能跑,但对侧信道分析这类需要反复调参的场景来说,效率实在堪忧。
如果n上到五万甚至十万呢?有些高采样率采集设备出来的迹线,一次就能采几万个点。用标准Transformer直接处理,显存直接翻车,这就是我在实践中踩过的坑。第一次尝试把整条AES第一轮加密的原始迹线直接送进Transformer训练,16G显存两轮迭代就爆了,只能把序列截断,可一截断,跨远距离的泄露关联就看不到了,模型效果大打折扣。
这也是为什么很多Transformer做侧信道的工作只停留在论文里,很难被大家实际复现。因为真实采集场景下的迹线长度,对标准自注意力非常不友好。最直接的思路有两条:一是把长迹线切块,对块内做局部注意力;二是用降采样或投影把序列缩短。这两条路都有明显的信息损失,切块会断掉跨块关联,降采样会把短时脉冲这类关键泄露特征模糊掉。
EstraNet的想法是换一个角度切入:不缩短序列,而是改变注意力计算本身的复杂度。
2.2 线性注意力机制的工程化实现
线性注意力的核心思想,是通过对Q和K做核函数变换,把原来需要先算QK^T矩阵再和V相乘的两步,改写成先变换再做矩阵结合的运算顺序。数学上,softmax(QK^T)V可以近似为φ(Q)(φ(K)^T V),其中φ是某个核函数映射。这样做的妙处在于,φ(K)^T V可以先把V压成一个较小的中间结果,让整体计算量从O(n²)降到O(n·d²)。
这个思路在自然语言处理里已经被验证过,典型代表是线性注意力机制相关的一系列工作。EstraNet把它引入侧信道场景时,还需要针对迹线数据做几个工程改造,这些细节才是实际效果好不好的关键。
第一点,核函数φ的选择。标准的指数核在特征映射后往往难以保持尖锐的注意力分布,而侧信道泄露特征通常只集中在少数几个时间点,注意力太“平”会导致关键点被噪声淹没。实测下来,用随机特征映射结合ReLU激活的核,再把注意力输出做归一化处理,比直接套用原始线性注意力要稳得多。
第二点,位置编码的改造。原始Transformer的正弦位置编码是固定模板,在语言任务里够用,但迹线数据的时间对应关系需要更精细地建模,尤其是要保留采样点的绝对时间位置和相对时间位置两重信息。EstraNet的做法是把可学习位置编码和卷积特征拼接在一起,让位置信息在特征层面就参与注意力计算,而不是在输入层简单相加。
第三点,稀疏与稠密注意力的混合。线性注意力擅长捕捉全局趋势,但对短时局部脉冲这类强特征反而容易钝化。EstraNet在结构中并行走了一条小卷积支路,专门提取短窗口内的局部特征,和线性注意力出来的全局特征做融合。这个设计和人体姿态估计里的双分支网络思路类似,一个管全局理解,一个管局部细节,互补效果很明显。
这套改造下来,整体的计算复杂度就被压到了线性级别。我实测在4090单卡上,序列长度从2000提到4000,标准Transformer的训练时间几乎翻倍,而EstraNet的增量只有不到百分之二十,效果差距随着序列增长还在拉大。
2.3 网络整体结构与数据流
EstraNet的整体结构,可以拆成三段来理解:输入编码段、线性Transformer编码段、分类头。
输入编码段的目标,是把原始采集到的迹线转化成一串token特征的序列。实际工程中,我建议先把原始迹线做标准化预处理,保证均值为0、方差为1,然后按固定窗口切割成小块,比如每64个采样点切一块。每个小块经过一个一维卷积层,输出一个特征向量,这个向量就相当于Transformer里的一个token。这么做的好处是既降低了token数量,又通过卷积提取了块内的局部纹理,后续的全局注意力就可以专心建模块与块之间的关系。
中间编码段就是前面提到的线性Transformer层叠加,我常用的配置是四到六层。每层都包含线性注意力、前馈网络和层归一化。这里有个工程细节:前馈网络的扩展比例不要贪大,侧信道任务的数据规模普遍不大,模型太肥很容易过拟合,扩展比例取2到4比Transformer默认的4更稳。
分类头的设计取决于你的任务是攻击哪个中间值。最常见的是攻击AES第一轮S盒输出,目标是恢复单字节密钥。我一般会把最后一层的注意力输出做全局平均池化,然后过一个共享的多层感知机头,输出256类的软标签。这样一次可以同时预测所有字节,训练效率高,而且攻击时可以从软标签里直接提取排名信息,当作密钥排序依据。
网络整体是端到端训练,损失函数用交叉熵即可。输入是标准化后的迹线,输出是对应密钥假设的概率分布。这个设计的好处是模型自己决定关注哪些时间点、什么特征,不需要人工指定兴趣区域。
3. 实战复现:从迹线预处理到模型训练
3.1 数据准备与预处理细节
很少有人会告诉你,模型效果的上限其实在采集和预处理阶段就已经决定了。
先说说数据采集。做侧信道分析,必备的设备是示波器、电流探头或者电磁近场探头,以及和加密芯片通信的触发板卡。触发时机很关键,最好在加密开始时产生一个同步沿,这样每条迹线的起点大致对齐。采样率建议至少是被采集信号的十倍以上,否则高频泄露成分会被混叠掉。我常用的配置是采样率1G/s,一条迹线记录加密操作的前若干微秒,长度大约五千个点。
预处理这块,有几步不能省。第一步是去均值去趋势。示波器采集的迹线往往会叠加一个低频漂移,直接用原始值训练会让模型把精力浪费在学习缓慢变化的趋势上。用高通滤波或简单的前后差分能有效消除这部分。第二步是标准化,这一步对Transformer特别重要。做完标准化后,每条迹线在均值方差上统一,模型收敛速度会明显加快。第三步是迹线切分和标签生成。
标签是侧信道任务里最容易被新手搞乱的地方。这里我说明确一点:如果你攻击AES第一轮S盒输出,标签应该是在已知明文和猜测密钥字节的条件下,S盒输出的汉明重量。模型学习的目标,就是根据输入迹线预测汉明重量的分布,而不是直接预测密钥值。汉明重量的取值范围是0到8,共9类,这个分类任务比直接做256类密钥分类更容易学,而且效果差不多。我在多个实验里都验证过,9类的汉明重量分类在整个训练稳定性上明显优于256类。
另一个预处理细节是降噪。小波去噪和Savitzky-Golay滤波我都试过,在信噪比本身就比较低的数据上,滤波反而会把短脉冲泄露信息抹掉。我的建议是:先不做降噪,直接训练一版看效果。如果模型在验证集上的损失迟迟不降,再考虑针对性去噪,而且优先使用软阈值类的去噪方法,保留时间轮廓的锐度。
3.2 模型训练的关键参数配置
EstraNet在训练层面有几个参数需要特别留意。
首先是输入长度和token大小。以五千点迹线为例,窗口长度取64,token数就是大约78个。这个规模对线性注意力来说毫无压力,但如果你把窗口缩到16,token数会涨到300多,训练时间增加的同时,模型并不一定学得更好。经验是窗口取32到128之间,兼顾块内局部特征和序列长度。
其次是批次大小。Transformer训练很吃批次大小,批次太小,注意力权重的估计方差大,训练不稳定。我一般取32到64之间,视显存而定。这里有个技巧,可以用梯度累积模拟更大的批次效果。我在一个样本只有几千条的数据集上,用批次64加梯度累积两步,等效批次128,收敛效果比直接批次32好不少。
学习率调度也值得一提。侧信道数据量相比图像分类小得多,用固定的较大学习率很容易震荡。我习惯用预热加余弦退火:前5个epoch线性预热,学习率从1e-5逐步升到3e-4,之后每步按余弦函数降到1e-6。这个调度配合AdamW优化器,在大多数侧信道数据集上都能稳定收敛。
训练轮数不要一开始就设置很大。我一般先跑50个epoch观察验证集损失曲线,如果出现持续不降,再排查是学习率问题还是模型结构问题,而不是盲目加轮数。如果数据量在五万条以上,100个epoch左右基本能收敛;如果只有几千条,建议配合数据增强来防过拟合,后面会细说。
3.3 评估与结果解读
训练完成后,评估和解读才是决定你是否真正破解了设备的关键环节,这一步的实操细节非常多。
侧信道分析的黄金评估指标是猜测熵GE和成功概率SR,两者结合比只看分类准确率有意义得多。准确率高说明模型能从迹线中提取到密钥相关的信息,但真实攻击中你并不知道正确密钥是什么,你只拿到一个概率分布,然后把它转换成密钥排序。猜测熵衡量的是:经过若干条攻击迹线的概率累积之后,正确密钥在排序中的平均位置。当GE降为0时,意味着正确密钥排到了第一,攻击成功。
我常用的一种评估方法是:用一部分已知密钥的迹线做验证集,剩下的做攻击集。让模型对攻击集中的每条迹线输出概率分布,然后按概率连乘对候选密钥排序,最后看正确密钥在第几位排。如果连续累积几十条迹线后,正确密钥能稳定排在第一,就说明模型的攻击能力足够强。
这里要特别注意一个坑:模型可能学到的是明文和迹线的偶然相关性,而不是真实的密钥泄露。验证方法很简单,换一批不同的明文重新采集或者重新生成模拟数据来测,如果攻击成功率明显下降,说明模型过拟合到了特定明文组合上,需要增加明文多样性或使用更强的正则化。
另一个解读技巧是注意力可视化。把每条迹线的注意力权重求和后画成热力图,你会直观看到模型“看”了迹线上的哪些区域。如果注意力集中在加密操作的某些关键时间点附近,说明模型学到了有物理意义的信息;如果注意力均匀撒在整个序列上或者集中在某个噪声区域,就要怀疑预处理或标签是否出了问题。
4. 常见问题与排查技巧实录
4.1 训练不收敛怎么办
训练不收敛是我被问得最多的问题。现象通常是验证集损失在前几个epoch下降一点,然后直接停滞或反弹,注意力热力图看是一片均匀的灰色。
第一种原因是标准化没做好。迹线的数量级如果差几个量级,比如不同设备采集的迹线幅度不同,模型很容易在很小的数值扰动上反复横跳。解决办法是每个数据样本独立做Z-score标准化,而不是在整个数据集上统一做。独立标准化的好处是能去除采集设备的固定增益差。
第二种原因是标签错了。汉明重量标签有一个隐蔽问题:很多处理器在写入寄存器时,翻转的位比最终状态的位更能反映实际功耗。也就是说,有些人用“状态汉明重量”能跑通,有些人用“翻转汉明权重”能跑通,这是芯片工艺和实现方式决定的。遇到不收敛,试着把标签从状态重量切换成翻转权重,差距往往立竿见影。
第三种原因是注意力层数值不稳定。线性注意力的实现里,如果对中间矩阵做了不当的归一化,可能出现梯度爆炸或消失。我的建议是在每个注意力输出后都加一层LayerNorm,并初始化时把注意力缩放因子调大一点,优先保证训练前期梯度能够回传。
如果以上都试过还是不行,还有一个最土但最有效的方法:把模型缩小到只剩一层注意力、隐藏维度减半,跑一个小规模实验。如果缩小后的模型能收敛,说明是大模型在有限数据上的表达太冗余,需要增加正则化或减少参数;如果缩小后也不收敛,那就一定是数据管线的问题,和模型无关。
4.2 过拟合与数据增强
侧信道数据集往往只有几万甚至几千条迹线,Transformer参数动辄上百万,过拟合几乎是必然的。症状是训练损失持续下降,验证损失先降后升,攻击成功率在验证集上虚高但在新采集的数据上崩盘。
应对过拟合,我建议按下面的优先级依次尝试。
第一是Dropout。在注意力层的输出和前馈网络里都加上Dropout,比率从0.1开始调,最高不要超过0.3。侧信道任务的有效信息本来就稀疏,Dropout太狠会把泄露信号也扔掉。
第二是权重衰减。AdamW的权重衰减参数在1e-4到1e-2之间调。这个参数在侧信道任务里比Dropout更温和,因为它是全局约束,不会随机抹掉重要特征。
第三是数据增强。这个方向很多论文都验证过,最有效的两种是:在有对齐问题的数据上做随机时间扰动,把迹线在小范围内随机平移几个采样点;以及在正样本附近叠加高斯噪声。随机平移尤其有用,因为它能变相模拟芯片随机延时防护,让模型对迹线对齐不那么敏感。
我的一个习惯做法是,过拟合严重时不急着换模型,先做形如“原始迹线加随机噪声再训练”的小实验,如果验证集损失恢复下降,说明模型过拟合的是噪声模式,而不是真正的信号模式,此时增强方向和强度就可以固定下来。
4.3 部署到资源受限设备
模型训练好之后,往往还需要部署到评估现场的设备上做实时分析,比如跑在一个便携设备或者边缘工控机上。这时候,模型大小和推理速度就成了新的约束。
EstraNet的优势在这里也能体现。线性注意力的推理复杂度低,CPU上跑五千点迹线的推理,单条耗时能控制在几毫秒级,比标准Transformer快一个数量级以上。
部署时我一般会做模型剪枝和量化两步。剪枝主要针对前馈网络里的冗余神经元,剪掉对输出影响小于阈值的连接,可以压缩三分之一参数而不掉精度。量化则把参数从FP32降到FP16甚至INT8,推理速度进一步提升。INT8量化需要校准数据,建议用剩余的训练集子集来校准,不然精度损失可能比较明显。
还有一个部署层面的经验是批处理。实时攻击场景下,迹线是一条一条到达的,很多人习惯单条推理,但模型对批次维度有向量化计算优势,批量处理能压榨出不少性能。可以把多条迹线缓存成一个小批次,比如缓存16条推理一次,在CPU上也能显著提升吞吐。
5. 后续还可以怎么扩展
EstraNet的思路并不是侧信道分析的终点,它的线性注意力骨架为后续扩展留下了不少空间。
一个很自然的扩展方向是跨设备迁移。用一块开发板训练的模型直接攻击另一块功能相同但工艺略有差异的芯片,效果会明显下降。这项能力提升整合了域自适应思路,让模型在源设备上学习通用性的泄露特征,同时通过对抗训练对齐目标设备的特征分布,让模型迁移性能进一步逼近针对目标设备专用模型的效果。
另一个方向是处理非对齐迹线。EstraNet目前还依赖预处理阶段的基本对齐,如果能在注意力机制内部引入时间平移不变性,让模型直接吃掉原始未对齐迹线,整个攻击流程的自动程度还能再上一个台阶。
最后再说一点个人体会。我在实际项目中把EstraNet落地之后最大的感受是:深度学习侧信道分析的门槛其实不在模型结构上,而是在对物理泄露机制的理解上。模型结构解决的是“从哪学”的问题,而真正的上限来自于你知道泄露发生在大致哪些位置、标签该按什么规则生成、采集流程有没有引入虚假关联。工具和架构一直在迭代,但这个底层判断力始终是稀缺的。希望这篇整理对正在这个方向探索的人有点实际帮助。