1. 侧信道攻击与防护:从基础到前沿的实战思考
在密码学领域,我们常常把算法本身的安全性视为铜墙铁壁,认为只要密钥足够长、算法足够复杂,数据就固若金汤。然而,现实世界中的密码设备——无论是你手机里的安全芯片,还是服务器机房里的加密卡——在运行时都会“说话”。它们通过功耗的细微波动、电磁辐射的微弱信号,甚至运算时间的微小差异,无意识地泄露着内部秘密。这就是侧信道攻击(Side-Channel Attack, SCA)的威力所在,它绕过了数学上的坚固防线,直接从物理实现的“后门”长驱直入。
我接触侧信道分析有十多年了,从最初用示波器捕捉单片机AES运算的功耗曲线,到后来研究更复杂的电磁和缓存攻击,一个深刻的体会是:算法安全不等于实现安全。设计一个能抵抗侧信道攻击的密码实现,其复杂度和挑战性不亚于设计算法本身。传统的防护手段,比如掩码(Masking),通过将秘密数据拆分成多个随机份额来隐藏真实值,确实有效,但代价高昂。性能开销随着份额数呈平方级增长,更棘手的是,它依赖于一个在实践中很难完美满足的强假设:所有份额的泄露必须是统计独立的。芯片上的毛刺(Glitches)、硬件路径的差异,都可能打破这个假设,让防护功亏一篑。
因此,寻找一种在安全性、性能和物理假设之间取得更好平衡的方案,一直是工业界和学术界努力的方向。今天我想深入探讨的,就是一种颇具潜力的思路:基于未知明文与并行实现的泄漏弹性伪随机函数(Leakage-Resilient PRF)。这个方案的核心思想非常巧妙——它不再执着于让泄露“不可区分”,而是转向让攻击者“无从下手”。通过预计算并保密加密所用的明文,结合硬件上的并行计算单元,它构建了一个让标准差分功耗分析(DPA)失效的环境。这就像把一场公开的拳击赛,变成了一场在漆黑房间里、对手还不断移动的格斗,攻击者连目标在哪都难以锁定。接下来,我将结合自己的工程经验,拆解这个方案的设计逻辑、实现要点、安全边界以及那些容易踩坑的细节。
2. 方案核心:用“未知”与“并行”构筑防御基石
2.1 从经典GGM到CHES 2012:防护思路的演进
要理解新方案的妙处,得先看看它试图改进什么。基础来源于经典的GGM(Goldreich-Goldwasser-Micali)PRF构造,其过程像一个二叉决策树:用一个初始密钥k0加密两个固定的明文p0和p1,根据输入x的每一位是0还是1,选择加密结果作为下一轮的密钥,最终输出最后一轮的密钥。这个过程需要执行128次AES-128才能产生一个128位输出,效率较低。
为了提高效率,CHES 2012年的方案做了一个大胆的改动:它在每一轮(除了最后一轮)并行加密大量(例如256个)精心挑选的明文。这些明文具有特殊的结构,例如pj = {j-1}^{Ns},其中Ns是并行处理的S盒数量(如AES-128中Ns=16)。这样,树的深度从128降到了17(16轮+1轮白化),吞吐量大幅提升。
它的安全逻辑在于“混淆”。当所有Ns个S盒并行运算时,功耗泄露是它们各自泄露的叠加。由于所有S盒的输入明文是相同的(经过特殊构造),攻击者试图针对某一个密钥字节进行DPA时,他预测的功耗模型会同时受到其他Ns-1个未知密钥字节的干扰。这Ns-1个干扰项构成了密钥相关的算法噪声,无法像随机噪声那样通过平均化消除。结果就是,攻击者计算出的相关性曲线无法清晰地将正确的密钥字节区分出来,所有密钥字节的猜测得分会混杂在一起。
注意:这里“密钥相关的算法噪声”是关键。在传统DPA中,攻击者通过改变明文,使目标中间值(如S盒输出)变化,从而在功耗中观察到模式。这里的噪声源于其他并行运行的、密钥未知的相同操作,其变化与目标密钥字节相关,因此无法被平均掉,直接破坏了DPA依赖的统计分离能力。
然而,这个方案有几个阿喀琉斯之踵:
- 安全参数
Ns受限于算法:对于AES-128,Ns=16,理论上的密钥排列复杂度Ns! ≈ 2^44,在现代计算能力下并非不可逾越。 - 依赖“相似泄露”假设:它要求所有并行S盒的泄露模型(即功耗与数据的函数关系)高度相似。这在工艺偏差存在的实际芯片中很难严格保证。
- 仅防护第一轮:其安全论证主要针对第一轮S盒的输出泄露。如果攻击者能够瞄准后续轮次或密文,防护可能被绕过。
2.2 新方案的核心创新:引入“未知明文”
新方案的核心改进,是用一个更易满足且更强的假设——未知明文,替换了脆弱的“相似泄露”假设。整个流程分为两步,如下图所示意:
[泄漏弹性PRG] -> [秘密明文池 p0...p_{2^m-1} & 更新后的密钥 k'] | v [基于树的PRF] (使用秘密明文池和k‘) | v [输出白化] -> [最终PRF输出]第一步:预计算与秘密明文生成这是整个方案的“弹药准备”阶段。它使用一个泄漏弹性的伪随机数生成器(Leakage-Resilient PRG),例如基于[25]的构造,来生成一批(2^m个)秘密的、随机的明文p0, p1, ..., p_{2^m-1},同时更新初始密钥得到k‘。这个PRG本身是设计来抵抗侧信道攻击的,确保在生成这些明文的过程中,不会泄露关于密钥或内部状态的信息。
第二步:并行树状PRF计算此阶段与CHES 2012方案结构类似,但使用的是上一步生成的、对外部攻击者保密的明文池。PRF的输入x被分成若干组,每组m位,用于从秘密明文池中选择一个明文。密钥k‘和选中的明文被送入一个并行实现的块密码(如AES)中进行加密。这个过程迭代进行,最终经过一个白化步骤输出结果。
为什么“未知明文”是更强的假设?
- 直接废掉标准DPA:DPA的前提是攻击者知道或能控制明文。现在明文是秘密的,攻击者连构建预测模型所需的输入都没有了。
- 迫使攻击升级为模板攻击:攻击者必须转而使用模板攻击(Template Attack),即先通过分析一个已知密钥的“剖析设备”来建立泄露模型(模板),再用这个模型去攻击目标设备。这需要更强的攻击前提(获取一个可控的、同型号的参考设备)和更复杂的分析。
- 验证难度平方级增长:即使攻击者通过复杂分析得到了一个可能的密钥候选,他也无法验证其正确性,因为他缺少用于验证的明文-密文对。他必须同时恢复出至少一个秘密明文和密钥,这相当于将攻击的搜索空间平方了。
- 防护范围扩大到所有中间值:“混淆”效应不再依赖于明文的特殊结构,因此对于算法内部任何位置的并行计算泄露都有效,而不仅仅是第一轮S盒。
2.3 并行实现的关键作用
“未知明文”与“并行实现”是相辅相成的。并行化在这里不是单纯为了性能,更是安全架构的一部分。
- 创造算法噪声:
Ns个处理单元同时运算,其泄露在物理探针上汇聚成一个综合的信号。攻击者无法从这锅“大杂烩”中分离出针对特定密钥字节的信号。Ns越大,这锅汤就越“稠”,分离越困难。 - 实现高效的“混淆”:在未知明文的前提下,并行化使得攻击者即便使用模板攻击��也需要为
Ns个密钥字节的联合分布建立模板。这个模板的维度极高((8*Ns+1)^2对于双变量泄露),构建和匹配的计算复杂度爆炸式增长。 - 与预计算阶段解耦:预计算(生成秘密明文)可以离线、安全地进行。在线PRF计算阶段只需进行高效的并行加密,适合对延迟和吞吐要求高的场景。
3. 安全性深度剖析:当理论遇到“嘈杂”的现实
纸上谈兵终觉浅,任何安全方案都必须经过严苛的实践检验。我们通过模拟攻击,来看看这个方案在几种典型攻击模型下的表现。
3.1 攻击模型与评估指标
我们假设攻击者能获取到加密过程中的功耗轨迹,并采用最强大的模板攻击作为评估手段。评估主要看两个指标:
- 猜测熵(Guessing Entropy):正确密钥在所有候选密钥中的平均排序位置。值越小(越接近1),说明攻击越成功;值越大(越接近密钥空间的一半),说明方案越安全。
- 排序分布(Rank Distribution):正确密钥排在特定名次(如第1、第10、第100名)的概率分布。这比平均猜测熵更能反映攻击的实际成功率。
泄露模型我们首先采用最经典的汉明重量模型,即泄露值L与数据位中‘1’的个数成线性关系:L(data) = HW(data)。对于一个并行处理Ns个字节的系统,单点泄露观测值t_i近似为所有S盒输出汉明重之和:t_i = Σ_{j=1}^{Ns} HW(S(k_j ⊕ p_{i,j}))。
3.2 未知明文方案 vs. 已知/特殊明文方案
我们通过模拟对比了三种场景:
- 场景A(基准):已知随机明文,S盒泄露独立。这是传统DPA的理想情况。
- 场景B(CHES 2012):已知特殊构造的明文(
p_{i,1} = p_{i,j}),并行S盒泄露。 - 场景C(新方案):未知随机明文,并行S盒泄露。
模拟结果揭示的规律:
- 场景A:攻击效率很高,猜测熵随着轨迹数增加迅速下降至1。
Ns增大仅略微增加所需轨迹数,因为攻击者可对每个密钥字节进行分治攻击。 - 场景B:当
Ns较小(≤8)时,猜测熵最终会停滞在(Ns+1)/2附近。这意味着攻击者最好的情况也只能将正确密钥的范围缩小到大约一半。但当Ns=16时,停滞点高于(Ns+1)/2,因为密钥相关的算法噪声太大,甚至导致一些错误密钥的得分排在正确密钥之前。 - 场景C(我们的焦点):结果令人振奋。即使攻击者能获取无噪声的完美泄露轨迹,正确密钥的排序分布也非常接近均匀随机分布。对于
Ns=16,中位排名在102左右(完全均匀是128),最小密钥字节的中位排名约为6,最大密钥字节的中位排名约为240。这意味着,即使攻击者看到了所有可能的信息,他最好的策略也近乎于瞎猜。
实操心得:评估侧信道防护方案时,不能只看“平均猜测熵”这一个数字。一定要分析排序分布,特别是“最小排名”和“最大排名”的分布。这能告诉你,攻击者“运气最好时”能多快找到部分密钥,以及“必须付出多大代价”才能确保恢复全部密钥。在新方案中,最大排名中位数高达240,意味着攻击者为了有50%的概率找到排位最靠后的那个密钥字节,需要枚举约
C(240, 16) * 16! ≈ 2^107种可能性,这在实际中是不可行的。
3.3 模型误差:安全性的隐藏引擎
为什么未知明文方案能产生接近均匀的排序分布?核心在于模型误差。
在模板攻击中,攻击者需要为每一个可能的密钥候选值k*,预先建立一个泄露模板D_{k*}。在未知明文且并行的情况下,攻击者面临的真实设备泄露分布D*是Ns个密钥字节联合作用的结果。而攻击者在构建模板时,由于不知道其他Ns-1个密钥字节的真实值,他无法准确模拟出这种联合分布。他构建的每一个模板D_{k*_j}都是基于一个错误假设(其他字节是某个固定值或随机值)的近似。
误差分析表明:
- 在已知特殊明文(场景B)下,模型误差相对较小,对于小的
Ns,正确密钥的模板距离真实分布最近。 - 在未知明文(场景C)下,模型误差急剧增大。攻击者需要建模的是一个双变量的联合分布(例如,明文汉明重与S盒输出汉明重),这本身就比单变量分布对误差更敏感。更关键的是,密钥相关的算法噪声使得这个联合分布的形状极度依赖于完整的密钥集合,导致基于单个密钥字节候选构建的模板与真实分布
D*的差距非常大,而且所有候选模板的差距都差不多。这就使得攻击者计算出的后验概率对于所有密钥候选都近乎相等,排序结果也就接近随机。
这给了我们一个重要的工程启示:有时,故意引入一种攻击者无法准确建模的、与密钥相关的“混乱”,比追求完美的“隐匿”更能提升安全边界。未知明文+并行实现,正是巧妙地制造了这种攻击者无法剥离的混乱。
4. 实现考量与实战陷阱
理论很美好,但把方案落地到芯片或FPGA上,才是真正的挑战。以下几个问题是你在工程实现时必须面对的。
4.1 泄露模型偏差:汉明重量模型够用吗?
我们的分析基于汉明重量模型,但实际芯片的泄露可能是高度非线性的。我们用模拟测试了多种泄露函数:
- 身份函数(id):泄露值等于数据值本身(假设理想情况)。
- 汉明重量函数(hw):我们的基准模型。
- 汉明重量加二次项(quad):模拟某些非线性特性。
- 经过AES S盒的非线性汉明重量(nlhw):模拟更复杂的变换。
结论是令人放心的:对于攻击AES S-box输出这样的非线性目标函数,泄露函数本身的非线性(quad, nlhw)带来的优势有限。在高Ns(高算法噪声)的场景下,不同泄露函数导致的攻击效果差异变得微乎其微。这意味着,基于汉明重量模型进行安全评估是保守且合理的,它为实际中可能出现的更复杂的泄露提供了一定的安全余量。
4.2 距离泄露与组合攻击:硬件时序的陷阱
这是硬件实现中最危险的陷阱之一。考虑一种情况:寄存器在连续两个时钟周期先后存储了共享秘密的两个份额(s⊕m, m)。虽然数据本身被掩码了,但寄存器从s⊕m翻转到m这个过程产生的功耗,与汉明距离HD(s⊕m, m) = HW(s)相关!这直接泄露了原始秘密s,导致掩码完全失效。
在我们的新方案中,未知明文再次扮演了救星角色。模拟显示,即使存在这种距离泄露,在未知明文和并行计算的双重作用下,攻击效果甚至比标准的双变量攻击还要差。因为距离泄露依赖于连续操作的相关性,而在并行处理大量未知数据的混沌环境中,这种相关性被极大地稀释和掩盖了。
避坑指南:在设计抗侧信道硬件时,除了关注数据本身的泄露,必须严格审查数据通路和寄存器文件的时序。避免任何可能使相邻周期操作数产生依赖的硬件结构。如果使用掩码,确保两个份额的存储和读取在物理和时序上充分隔离。新方案虽然对此类泄露有韧性,但绝不意味着可以忽视���好的硬件设计实践。
4.3 模板估计的实践限制:数据不够怎么办?
模板攻击在理论上是最强攻击,但实践中它有个致命弱点:需要海量的剖析数据来构建高维度的准确模板。对于我们的方案,模板的维度是(8*Ns+1)^2。当Ns=16时,理论上需要构建一个覆盖2^128种输入组合的模板,这显然不可能。
攻击者可能会退而求其次,试图为单个S盒构建模板,然后通过卷积来合成联合分布的模板。但这里有个问题:每个单S盒模板的估计误差,在卷积合成时会被指数级放大。我们的模拟证实了这一点:当Ns=4时,即使用2^22条轨迹去估计模板,其产生的模型误差已经比密钥相关算法噪声本身带来的误差还要大,导致攻击效果反而更差。
这对设计者的启示是:提高并行度Ns,不仅增加了算法噪声,还指数级地提高了攻击者实施高精度模板攻击的数据和计算门槛。这是一种双重加固。
5. 进阶攻击路径与方案性能权衡
没有绝对的安全,只有不断提高的攻击成本。一个严谨的方案必须考虑更狡猾的攻击者可能采取的路径。
5.1 迭代攻击与密钥验证困境
对于CHES 2012方案,文献[20]提出了一种迭代攻击:由于正确密钥字节总是排在候选列表的最前面,攻击者可以每次确定一个密钥字节,然后用它来为下一轮攻击建模并消除部分噪声,从而逐步降低Ns。
在新方案中,攻击者理论上也可以尝试类似策略,但难度陡增:
- 列表枚举,而非只取第一:由于排序接近均匀,攻击者不能只相信排名第一的候选。他必须枚举排名靠前的一批候选(比如前
R个),在下一轮为每个候选构建新的模板分支。这导致攻击树快速膨胀。 - 模板需重建:每确定(或假设)一个密钥字节,整个联合泄露分布就变了,攻击者必须为剩余字节重新构建模板,计算量巨大。
- 验证死锁:即使攻击者历经千辛万苦,得到了一个可能的密钥集合(顺序可能还是乱的),他依然无法验证。因为他没有哪怕一个(明文,密文)对。他必须同时猜测密钥和至少一个秘密明文,将搜索复杂度从
O(2^{key})提升到了O(2^{key} * 2^{plaintext})。
我们估算,对于Ns=16,即使攻击者采用这种复杂的迭代策略,想以2^{-16}的概率恢复正确密钥集,也需要约2^60次基本操作,之后再以16! ≈ 2^44的复杂度进行排序。总计超过2^100的计算量,且仍无法验证结果。这在实践中已可视为安全。
5.2 性能、面积与安全的权衡
新方案的主要开销在于预计算阶段和存储。
- 预计算:需要运行一个泄漏弹性的PRG来生成秘密明文池。这个PRG本身需要是抗侧信道的,可能会引入一些性能开销,但这是一次性的或可低频进行的操作。
- 存储:需要存储
2^m个秘密明文。例如,若m=8,则需要存储256个128位明文,即4KB的SRAM。这对于现代嵌入式安全芯片(如智能卡、TPM)来说是可接受的。 - 在线性能:在线PRF计算与CHES 2012方案类似,具有高并行度和高吞吐量的优点。树的深度为
128/m + 1,通过选择m可以在存储和速度之间取得平衡。
与掩码方案的对比:
- 安全假设:掩码要求“泄露独立”,难以验证;本方案要求“明文保密”和“并行计算”,更易实现和验证。
- 性能开销:高阶掩码的性能开销是
O(d^2)(d为阶数);本方案的在线开销是固定的,与Ns线性相关,预计算开销可摊销。 - 适用场景:掩码更通用,可保护任意算法;本方案特别适合需要高性能PRF/流密码生成的场景,如会话密钥派生、磁盘加密的IV生成等。
6. 总结与工程建议
回顾这个基于未知明文与并行实现的泄漏弹性PRF方案,它的核心智慧在于转换防御战场。它不追求在泄露的“信号层面”完全隐藏信息(那很难且代价高),而是在“分析层面”为攻击者制造无法逾越的障碍——未知的输入、无法解耦的并行噪声、难以构建的准确模型。
给密码工程师的几点实战建议:
- 评估与建模:在考虑采用此类方案前,必须对你的目标平台进行细致的泄露特性分析。使用汉明重量模型进行初步安全评估是安全的起点,但最终要通过实际测量(如TVLA测试)来确认防护有效性。
- 并行化设计:
Ns是核心安全参数。在面积和功耗允许的情况下,尽可能增大并行度。这不仅提升性能,更是指数级提升攻击成本。考虑使用SIMD指令集(软件)或多核协处理器(硬件)。 - 秘密明文的管理:秘密明文池的安全是整个方案的基石。必须确保:
- 生成过程(泄漏弹性PRG)本身是抗侧信道的。
- 存储区域(如SRAM)要有防物理探测(如金属屏蔽层)和防故障注入(如存储校验)的措施。
- 明文池应定期更新,更新过程同样需要抗侧信道保护。
- 防御深度:不要单独依赖这一种防护。可以将其与轻量级的随机延迟、操作数洗牌(Shuffling)结合,形成纵深防御。例如,在并行单元内部对字节操作进行随机排序,可以进一步增加攻击者建模的难度。
- 标准化与验证:目前这类构造尚未进入主流密码标准。在关键系统中使用前,建议邀请第三方专业团队进行全面的侧信道评估和渗透测试,包括尝试本节提到的各种进阶攻击路径。
这个方案展示了侧信道防护研究的一个有前途的方向:通过算法和系统级的协同设计,利用密码学本身的性质(如未知输入、并行计算)来“以毒攻毒”,化解物理泄露的威胁。它可能不是所有场景的银弹,但对于那些需要高性能、高安全性的对称密码原语实现,无疑提供了一个极具吸引力的新选择。在实际项目中,我通常会建议在性能敏感且算法固定的模块(如硬件加速引擎)中尝试此类设计,往往能取得比单纯堆叠掩码更好的综合收益。