侧信道攻击与防护:密码算法物理实现的安全性实战

密码学 · 2026-06-05 · 6 阅读

前言

1996 年,Paul Kocher 发表了一篇开创性论文,展示了一个令人不安的事实:即使密码算法在数学上被证明是安全的,攻击者仍然可以通过观察算法物理执行过程中的"副作用"来恢复密钥。

这些副作用可能包括:

  • 执行时间的微小差异(计时攻击)
  • 功耗的波动(功耗分析)
  • 电磁辐射(电磁分析)
  • CPU 缓存的命中/未命中模式(缓存攻击)
  • 声学噪声(声学分析)
这就是侧信道攻击(Side-Channel Attack, SCA)。

2018 年,Spectre 和 Meltdown 漏洞震惊了整个 IT 行业——攻击者利用现代 CPU 的推测执行机制,通过缓存侧信道从其他进程甚至虚拟机中窃取敏感数据。这证明侧信道攻击不仅是智能卡等嵌入式设备的威胁,也是云计算、虚拟化环境中的现实风险。

本文将从基础原理出发,系统介绍主流侧信道攻击技术,然后重点讲解掩码(Masking)和隐藏(Hiding)两大防护策略,并结合国密 GM/T 0028 标准给出工程实践建议。

侧信道攻击的分类

按攻击手段分类

按入侵程度分类

类型描述典型工具
入侵型需要开盖、去除芯片钝化层探针台、聚焦离子束
非入侵型无需物理接触示波器、电磁探头
半入侵型接触芯片表面但不破坏激光注入设备

攻击技术详解

1. 计时攻击(Timing Attack)

原理:密码算法的执行时间可能依赖于密钥值。例如,RSA 的模幂运算中,如果指数的某一位为 1,则需要额外的乘法操作。通过精确测量执行时间,攻击者可以逐位恢复密钥。

经典案例

Kocher 在 1996 年的研究表明,通过数千次精确计时测量,可以恢复 RSA 私钥。

2. 差分功耗分析(DPA)

原理:CMOS 电路在处理不同数据时消耗的功耗不同。DPA 通过采集大量功耗迹(power trace),利用统计方法找出功耗与密钥中间值之间的相关性。

DPA 攻击流程

SM4 的 DPA 攻击实例

SM4 的非线性变换通过 S 盒实现。攻击者可以针对 S 盒的输出进行 DPA 攻击:

CODE
SM4 第一轮:
  X1 ⊕ X2 ⊕ X3 ⊕ RK0 → S盒 → 循环左移 → ⊕ X0 = X4

攻击点: S盒输出
  → 猜测 RK0 的低 8 位
  → 计算 S盒输出的假设值
  → 与实际功耗进行相关性分析

根据《功耗侧信道分析》(欧长海等,科学出版社,2026)中的实验数据,对未加防护的 SM4 软件实现,约 5000 条功耗迹即可恢复完整密钥。

3. 缓存攻击(Cache Attack)

原理:现代 CPU 使用多级缓存来加速内存访问。当数据在缓存中时(cache hit),访问速度快;不在时(cache miss),需要从主存加载。攻击者通过观察访问时间差异,可以推断数据是否在缓存中。

Flush+Reload 攻击流程

CODE
步骤 1: Attacker 将目标内存行从缓存中清除(clflush)
步骤 2: 等待 Victim 执行密码算法
步骤 3: Attacker 重新访问该内存行,测量访问时间
  → 短时间 = Victim 访问了该地址(cache hit)
  → 长时间 = Victim 未访问该地址(cache miss)
步骤 4: 根据访问模式推断密钥相关的内存访问模式

对 AES 的缓存攻击:AES 的软件实现通常使用查找表(T-Table)来加速 S 盒和列混合运算。攻击者通过监控 T-Table 的缓存访问模式,可以恢复轮密钥。

4. 差分故障分析(DFA)

原理:攻击者在密码算法执行过程中引入故障(如电压毛刺、时钟毛刺),导致计算结果出错。通过对比正确密文和故障密文,可以推导出密钥信息。

对 RSA-CRT 的 DFA 攻击

CODE
RSA-CRT 解密: m = m_q + q * ((m_p - m_q) * q^(-1) mod p)

如果故障注入导致 m_p 出错(变为 m_p'),但 m_q 正确:
  m' = m_q + q * ((m_p' - m_q) * q^(-1) mod p)

则:  gcd(m - m', N) = q

直接分解 N,完全恢复私钥!

2003 年,Boneh 等人利用 DFA 成功攻击了未加防护的 RSA-CRT 实现。

防护技术

防护策略总览

方案一:掩码(Masking)

核心思想:将敏感中间值拆分为多个随机份额(share),每个份额单独处理,使得任何单条功耗迹都不包含完整的密钥信息。

布尔掩码原理

对于一个 n 位的中间值 x,将其拆分为 m+1 个份额:

CODE
x = x₀ ⊕ x₁ ⊕ x₂ ⊕ ... ⊕ xₘ

其中 x₁, ..., xₘ 是随机数,x₀ = x ⊕ x₁ ⊕ ... ⊕ xₘ。

SM4 S 盒的掩码实现(一阶)

高阶掩码:一阶掩码只能抵抗一阶 DPA 攻击。高阶 DPA 攻击会同时利用多个份额的信息。n 阶掩码需要将所有 n+1 个份额一起处理,复杂度急剧增加。

根据 ISO/IEC 17825 标准,安全等级评估中:

  • 一阶攻击:约 1000 条功耗迹
  • 二阶攻击:约 100,000 条功耗迹
  • 三阶攻击:约 10,000,000 条功耗迹

方案二:隐藏(Hiding)

核心思想:消除功耗/时间与数据之间的相关性,而不是拆分数据。

时间隐藏——随机延迟

洗牌(Shuffling):在分组密码的轮函数中,随机打乱 S 盒计算的顺序:

PYTHON
def shuffled_sbox_round(state, round_key, sbox):
    """洗牌 S 盒计算顺序"""
    indices = list(range(len(state)))
    random.shuffle(indices)  # 随机计算顺序
    
    result = list(state)
    for i in indices:
        result[i] = sbox[state[i] ^ round_key[i]]
    
    return result

功耗隐藏——双轨预充电逻辑(WDDL)

在硬件层面,使用特殊的逻辑门设计,确保无论处理 0 还是 1,功耗消耗都相同:

CODE
WDDL (Wave Dynamic Differential Logic):
  → 每个周期分为预充电阶段和求值阶段
  → 预充电阶段:所有节点充电到中间电平
  → 求值阶段:根据输入放电到正确电平
  → 每个逻辑门的充放电量恒定,与输入无关

方案三:故障注入防护

针对 DFA 等主动攻击,需要在算法层面加入检测机制:

GM/T 0028 标准中的侧信道要求

GM/T 0028-2014《密码模块安全技术要求》定义了 4 个安全等级,对抗侧信道攻击的要求逐级提升:

安全等级侧信道要求
一级无特殊要求
二级抵抗简单计时分析
三级抵抗 SPA 和简单功耗分析
四级抵抗 DPA/CPA 和高级侧信道分析
GB/T 18336(对应国际 ISO/IEC 17825)规定了侧信道攻击测试方法,包括:
  • 泄漏检测法(Leakage Detection Test)
  • 抗攻击能力测试法(Attack Rating Test)

工程实践建议

软件实现侧信道防护清单

  • 恒定时间实现:所有密码算法的核心操作必须是恒定时间的
- 避免密钥相关的分支 - 避免密钥相关的内存访问模式 - 使用恒定时间比较函数

  • 随机化
- S 盒计算顺序随机化(洗牌) - 添加随机延迟(注意不要影响功能正确性) - 随机化内存地址映射

  • 掩码方案
- 对称密码(SM4):至少一阶布尔掩码 - 公钥密码(SM2):标量乘法中的标量盲化

  • 代码审查检查项
BASH
# 检查密钥相关的分支
   grep -rn "if.*key" crypto_impl/
   # 检查密钥相关的数组索引
   grep -rn "sbox\[key" crypto_impl/
   # 检查非恒定时间比较
   grep -rn "memcmp\|bcmp" crypto_impl/

硬件实现侧信道防护清单

  • 逻辑设计
- 采用 WDDL 或 SABL 等恒定功耗逻辑 - 差分信号传输减少电磁泄漏

  • 物理防护
- 有源屏蔽层(Active Shield) - 电压/时钟毛刺检测电路 - 温度/光照传感器

  • 随机数
- 使用物理真随机数生成器(TRNG) - 符合 GM/T 0005-2012《随机性检测规范》

总结

侧信道攻击是密码系统面临的最隐蔽也最危险的威胁之一。攻击者不需要破解数学难题,只需要"观察"密码设备运行时的物理特征就能恢复密钥。

核心防护思路可以总结为两句话:

  • 掩码:把秘密拆成多份,让攻击者无法从任何单份中获取信息
  • 隐藏:让功耗/时间变得随机,让攻击者无法建立相关性
在实际工程中,软件实现应优先保证恒定时间特性,结合洗牌和随机延迟;硬件实现则需要从逻辑设计和物理防护两个层面入手。

记住:密码算法的数学安全性只是基础,物理实现的安全性同样重要,甚至更加重要——因为数学上安全的算法,可能因为一行代码写得不对就被攻破。

参考来源