第一章 背景
1.1 什么是侧信道攻击?
- 核心定义 :侧信道攻击(Side-Channel Attack, SCA)是一种不直接攻击密码算法的数学结构,而是通过观察系统在执行密码运算时泄露的物理信息(时间、功耗、电磁辐射、声音等)来推导秘密信息(如密钥)的攻击方法。
- 关键区分 :
- 传统密码分析 → 攻击算法本身的数学弱点(如差分分析、线性分析)
- 侧信道攻击 → 攻击算法的实现方式,利用物理世界的"副产品"
侧信道攻击的本质是信息泄露存在于物理实现层面,而非逻辑层面。
1.2 为什么侧信道攻击重要?
- 即使一个密码算法在数学上被证明是安全的(如 AES),其硬件/软件实现仍可能因侧信道泄露而被攻破
第二章 基本原理:信息为何会泄露?
泄露的根源
- 计算的物理本质 :任何计算都需要消耗能量、花费时间、产生电磁辐射。这些物理量往往与所处理的数据和操作相关。
- 数据依赖性 (Data Dependency):
- 处理
0x00和0xFF时的功耗可能不同(汉明重量不同) - 执行乘法和跳过乘法的时间不同(条件分支泄露)
- 访问不同缓存行会导致不同的延迟(缓存状态泄露)
- 处理
信息泄露的基本模型
- 设密钥为 (k),输入为 (x),侧信道观测为 (L)
- 泄露模型:L = f(k, x) + noise
- 攻击者的目标:通过大量观测L,结合已知/选择的 x,统计推断出密钥 k
第三章 常见侧信道攻击类型
3.1 时间攻击(Timing Attack)
- 原理:密码运算的执行时间依赖于输入数据或密钥的值
- 经典案例 :Kocher (1996) 对 RSA 的时间攻击
- RSA 中模幂运算的"平方-乘"算法:密钥位为 1 时执行乘法,为 0 时跳过
- 通过统计运算时间,推断密钥的每一位
3.2 功耗分析(Power Analysis)
- 简单功耗分析(SPA) :直接从单条功耗曲线中识别操作模式
- 例:RSA 平方-乘操作在功耗曲线上有明显的高低区分
- 差分功耗分析(DPA) :
- Kocher 等人 (1999) 提出
- 利用大量功耗曲线的统计差异提取密钥
- 基于汉明重量模型或汉明距离模型
3.3 电磁泄露攻击(EM Attack)
- 原理:电子设备运行时产生电磁辐射,其特征与内部计算相关
- 优势 :
- 非接触式(可在一定距离外采集)
- 可针对芯片的特定区域进行近场探测
- 某些场景下比功耗分析更有效(如多核处理器中隔离单核信号)
- 研究进展:已证明可通过电磁泄露攻击 AES、RSA 等算法实现
3.4 缓存攻击(Cache Attack)
- 原理:现代 CPU 使用多级缓存;访问缓存命中(cache hit)和缓存未命中(cache miss)的延迟差异巨大
- 主要技术 :
- Prime+Probe:攻击者填充缓存集 → 等待受害者执行 → 探测哪些缓存集被替换
- Flush+Reload:利用共享内存页,刷新某行 → 等待受害者访问 → 测量重新加载时间
- Evict+Time:驱逐特定缓存行 → 测量受害者执行时间变化
- 威胁模型:可在同一物理机或同一云实例中实施(跨虚拟机攻击)
3.5 其他类型
| 类型 | 泄露来源 | 备注 |
|---|---|---|
| 声学攻击 | 电子元件的声音振动 | Genkin 等 (2014) 攻击 RSA |
| 故障注入 | 人为引入错误,分析错误输出 | 属于主动攻击(Active Attack) |
| 光学攻击 | 芯片表面光发射 | 需要精密设备 |
| 数据残留 | 内存中的残留数据 | 冷启动攻击(Cold Boot Attack) |
第四章 典型真实攻击案例
AES 缓存时间攻击
- Bernstein (2005) :
- 对 OpenSSL 的 AES 实现发起远程时间攻击
- AES 的 T-table 查表操作依赖密钥和明文
- 不同输入导致不同的缓存命中/未命中模式 → 运算时间不同
- 通过统计分析恢复完整 AES-128 密钥
- Osvik 等 (2006) :
- 在同一系统上使用 Prime+Probe 攻击 AES
- 仅需约 65 毫秒即可提取完整密钥
第五章 · 攻击流程
5.1 通用侧信道攻击流程
Step 1: 目标识别与建模
→ 确定目标设备/软件、密码算法、泄露类型
Step 2: 数据采集
→ 采集侧信道信号(功耗曲线、时间戳、缓存状态等)
→ 同步采集对应的输入/输出(已知明文或密文)
Step 3: 信号预处理
→ 对齐、滤波、降噪、特征提取
Step 4: 密钥假设与统计分析
→ 对密钥的每个子部分(如一个字节),穷举所有候选值
→ 用泄露模型预测每个候选值应产生的侧信道信号
→ 计算预测值与实际观测值的统计相关性
Step 5: 密钥恢复
→ 相关性最高的候选值即为正确的子密钥
→ 组合所有子密钥 → 恢复完整密钥
第六章 · 防御机制
6.1 算法层防御
- 恒定时间实现(Constant-Time Implementation) :
- 确保所有操作的执行时间与数据无关
- 避免条件分支、数据依赖的查表、提前退出
- 例:使用位运算替代条件选择 →
result = (mask & a) | (~mask & b)
- 掩码技术(Masking / Boolean Masking) :
- 将敏感中间值 (v) 分割为多个随机份额:(v = v_1 \oplus v_2 \oplus \cdots \oplus v_d)
- 每个份额单独看是均匀随机的,不泄露 (v) 的信息
- 需要 (d) 阶掩码抵御 (d) 阶攻击(高阶掩码的实现复杂度和性能开销较大)
- 随机化(Shuffling / Randomization) :
- 随机打乱操作顺序(如 AES 中 16 个 SubBytes 的执行顺序随机化)
- 增加攻击者对齐信号的难度
6.2 硬件层防御
- 片上噪声生成器:增加信号的噪声水平,降低信噪比
- 电压/频率随机化:使功耗曲线的时间对齐更加困难
- 物理不可克隆函数(PUF):利用制造偏差生成设备唯一密钥,增强密钥保护
总结
-
"如果一个加密算法在数学上被证明是安全的,是否意味着它的实现一定安全?"
- 算法安全 vs 实现安全
-
"为什么在密码学实现中,
if (secret_bit == 1) { do_multiply(); }这样的代码是危险的?"- 时间泄露与条件分支的关系