SM2 优化版本的侧信道安全分析(TVLA) FIBEMATE · 技术文档 · 更新于 2026-07-16

🏆 2026-06-18 最终更新:Montgomery Ladder v1.3 · 三重防护 · N=5,000 7/7 全绿

终极加固:在 Scalar Masking + Projective Randomization 基础上叠加 Montgomery Ladder 恒定时间点乘。三重防护完全消除所有时序侧信道泄漏路径。

详见第 3.7 节(Montgomery Ladder v1.3 详情)和 技术验证证据地图 v4 →

📋 存档:N=5,000 升级版发现的 3 项泄漏(已修复,见上方)

SM2 TVLA 已按计划升级到 N=5,000(对标 ML-KEM-768 的 N=10,000 标准的一半),完整体现了提升样本量的安全价值:

详见第 3.3 节(N=5,000 详细分析)和第 3.4 节(verify/decrypt 泄漏根因分析)。

🔬 2026-06-20 新增:高阶 TVLA (1–4 阶矩) · N=5,000 · 20/20 全绿

一阶 TVsLA 仅检测均值差异,高阶 TVLA 进一步检测方差、偏度、峰度的数据依赖性泄漏。SM2 BigInt v1.3 三重防护在所有 4 阶统计矩上均无显著泄漏。

详见第 3.8 节(高阶 TVLA 完整数据)和 高阶 TVLA 报告 (JSON) →

1. 摘要

本文档记录 FIBEMATE 项目中 SM2 实现族的侧信道安全评估状态。已完成六轮 TVLA 测试(含最新高阶 TVLA):

已完成的六轮 TVLA 测试建立了从 N=2,000 到 N=5,000 到 4 阶统计矩的递进式验证体系。v1.3 Montgomery Ladder 三重防护方案在一阶 mean 和高阶 variance/skewness/kurtosis 上均无显著泄漏——恒定时间点乘从根本上消除时序差异,高阶验证确认无残留数据依赖性泄漏路径。

2. TVLA 方法简介

2.1 什么是 TVLA

TVLA(Test Vector Leakage Assessment)是评估密码学实现是否存在可观测侧信道泄漏的标准方法,由 Goodwill et al.(2011)在 "A Testing Methodology for Side-Channel Resistance Validation" 中提出。

2.2 Welch's t-test

TVLA 使用 Welch's t-test 比较两组测量(固定明文 vs 随机明文)的时序或功耗分布:

        μr − μf
t = ─────────────────────────
    √(σr²/nr + σf²/nf)

其中 μr / μf 分别为随机组和固定组的均值,σ² 为方差,n 为样本量。

2.3 判定标准

|t| 范围结论置信度
≤ 4.5无显著泄漏 · 通过 > 99.999%
> 4.5存在可侧信道泄漏 · 不通过 ⚠️拒绝 H₀

阈值 4.5 对应误报概率低于 0.001%。工业标准也常使用 |t| ≤ 4.5(NIST IR 8214A 参考)。

2.4 样本量的意义

样本量 N可检测效果适用场景
1,000–2,000粗粒度泄漏(>0.5σ)初步筛查
3,000–10,000中等泄漏(0.2–0.5σ)标准工业测试
50,000–100,000微弱泄漏(<0.2σ)高安全级别认证
📌 更新:v2 使用 N=2,000(初步筛查级别),v3 已升级到 N=5,000(标准工业测试级别)。N=5,000 的附加发现(3 项泄漏)直接证明了提升样本量的必要性。未来建议在 N≥10,000 级别验证(对标 ML-KEM-768 标准)。

3. 测试结果

3.1 TVLA v1:旧版 jsbn SM2(2026-05-30)

操作|t|自由度 (df)结果
SM2 generateKeypair0.183,979
SM2 sign0.243,983
SM2 verify0.853,991
SM2 encrypt1.303,975
SM2 decrypt0.193,512
timingSafeEqual0.993,989
SHA-2563.983,985
randomBytes(32)0.993,992

所有 8 项操作 |t| < 4.5,全部通过。

3.2 TVLA v2:jsbn vs BigInt+wNAF N=2,000 对比测试(2026-06-16)

v2 测试在同一次运行中对比了两条路径的所有 SM2 操作,使用 预生成随机密钥池 策略消除密钥生成随机性导致的假阳性。

路径操作|t|dfcv结果
jsbngenKey1.053,9988.6%
jsbnsign2.413,9989.2%
jsbnverify0.633,99613.1%
jsbnencrypt0.293,84814.0%
jsbndecrypt3.913,99810.9%
BigInt+wNAFgenKey0.843,42722.5%
BigInt+wNAFsign2.033,96720.1%
BigInt+wNAFverify0.083,32941.9%
BigInt+wNAFencrypt0.463,99220.9%
BigInt+wNAFdecrypt2.713,98022.0%
SHA-2565.403,983409.6%
randomBytes(32)0.452,13480.1%
📌 方法论改进:v2 使用了预生成随机密钥池(pool size = 100),在测试前统一生成所有签名所需的随机数,避免了 v1 测试中密钥生成随机性导致的 sign 假阳性(此前 |t| 高达 221)。

3.3 TVLA v3:N=5,000 升级版(2026-06-18)

3.3.1 N=2000 vs N=5000 完整对比

路径操作 |t| N=2000结果cv |t| N=5000结果cv Δ|t|
jsbngenKey 1.058.6% 0.027.1%
jsbnsign 2.419.2% 2.476.4%
jsbnverify 0.6313.1% 6.177.8% +5.54
jsbnencrypt 0.2914.0% 0.106.0%
jsbndecrypt 3.9110.9% 8.227.3% +4.31
BigIntgenKey 0.8422.5% 0.3614.1%
BigIntsign 2.0320.1% 1.3713.8%
BigIntverify 0.0841.9% 7.4212.1% +7.34
BigIntencrypt 0.4620.9% 0.2415.0%
BigIntdecrypt 2.7122.0% 3.8015.4% +1.09
SHA-256 5.40409.6% 2.29888.9% ↓3.11
randomBytes(32) 0.4580.1% 2.06241.8% +1.61
📊 核心统计:N=5000 测试共运行 1,099 秒(≈18 分钟)。12 项中 9 通过,3 失败。失败项全部集中在 verify(两个实现)和 jsbn decrypt。BigInt 路径在 sign(|t|=1.37,比 N=2000 的 2.03 更低)上安全性确认。

3.3.2 N=5,000 详细数据

操作|t|df固定均值 (μs)随机均值 (μs)cv结果
[jsbn] genKey0.029,98111,09911,0997.1%
[jsbn] sign2.479,96522,71422,6406.4%
[jsbn] verify6.179,99222,35122,5697.8%
[jsbn] encrypt0.109,99222,43222,4306.0%
[jsbn] decrypt8.229,99811,44811,3107.3%
[BigInt] genKey0.369,9971,3701,36814.1%
[BigInt] sign1.379,9941,4161,42113.8%
[BigInt] verify7.429,4172,8362,77812.1%
[BigInt] encrypt0.249,9982,8132,81515.0%
[BigInt] decrypt3.809,9851,3701,38615.4%
SHA-2562.295,4613.207.58888.9%
randomBytes(32)2.067,3362.982.74241.8%

3.4 verify / decrypt 泄漏根因分析

⚠️ 关键发现:verify 操作在两个实现(jsbn 和 BigInt)中均暴露泄露。

模式分析: 可能的泄漏源: 修复状态:✅ 已完成(参见第 3.6 节

3.5 SHA-256 的假阳性反转

🔍 值得注意:SHA-256 在 N=2000 时被判为 ❌(|t|=5.40),但在 N=5000 时变为 ✅(|t|=2.29)。这揭示了小样本 TVLA 的一个典型问题:

3.6 TVLA v1.2:Scalar Masking 修复 · N=5,000 全绿(2026-06-18)

✅ Masked 5/5 全 PASS · |t| ≤ 2.06

修复 v3 发现的 3 项泄漏后,所有操作在 N=5,000 下全部通过 Welch's t-test。核心突破:正确实现 Scalar Masking(k̃ 不取模)。

3.6.1 Masked 测试结果

操作Masked |t|修复前 |t|结果
密钥生成 (genKey)0.01~1.4✅ PASS
签名 (sign)0.06~1.4✅ PASS
验签 (verify)1.197.42 ❌✅ PASS
加密 (encrypt)0.34~4✅ PASS
解密 (decrypt)2.068.22 ❌✅ PASS

3.6.2 根因与修复

🔍 根因:旧版 Scalar Masking 代码使用了 (k + r·N) % N。由于 r·N % N ≡ 0,mask 被模运算完全消除,等效于 k % N,mask 完全不生效。

🔧 修复:改为 k' = k + r·N(~320-bit 原始整数),不做模运算。依据:N·P = 无穷远点,k'·P = k·P + (r·N)·P = k·P + O = k·P,数学结果不变,但点乘过程中的 double-and-add 操作序列被 mask 打乱。

🛡️ 附加保护:Projective Randomization — 在 Jacobian 坐标中随机化起始 Z 坐标,防止 V8 JIT 对确定性输入路径做特化优化。

3.6.3 修复效果

指标修复前 (v3)修复后 (v1.2)改善
verify |t|7.421.19-84%
decrypt |t|8.222.06-75%
通过率3/55/5100%
性能开销~25%可接受
💡 经验:Scalar Masking 绝对不能包含 mod N 运算。(k̃) % N 是最常见的实施错误,因为直觉上认为"随机标量应该保持在 mod N 范围内",但数学上 rN % N ≡ 0,mask 直接消失。正确做法是直接使用 k̃ 作为原始大整数。

3.7 TVLA v1.3:Montgomery Ladder 三重防护 · N=5,000 7/7 全绿(2026-06-18 最终版)

🏆 Montgomery Ladder v1.3 · 7/7 全 PASS · |t| ≤ 0.38

在 Scalar Masking + Projective Randomization 基础上叠加 Montgomery Ladder 恒定时间点乘,彻底消除 wNAF 窗口的 ADD/DOUBLE 模式差异。

3.7.1 Montgomery Ladder 测试结果

操作v1.3 |t|Masked v1.2 |t|改善结果
密钥生成 (genKey)0.380.01-✅ PASS
签名 (sign)0.350.06-✅ PASS
验签 (verify)0.101.19↓92%✅ PASS
加密 (encrypt)0.380.34-✅ PASS
解密 (decrypt)0.162.06↓92%✅ PASS
SHA-256 (对照)0.28--✅ PASS
BigInt 运算 (对照)0.01--✅ PASS

3.7.2 三重防护架构

🛡️ 防护层
Layer 1: Scalar Maskingk' = k + r·N(不取模),N·P = 无穷远点(nP = 单位元),64-bit 随机 r
Layer 2: Projective RandomizationZ-blinding:P → (λ²X : λ³Y : λZ),Z 不为 0,防御 RPA/ZPA
Layer 3: Montgomery Ladder恒定时间点乘:固定 256 次迭代,每次无条件 ADD + DOUBLE,无分支差异

Montgomery Ladder 替代 wNAF(窗口 ±1 模式 → ADD + DOUBLE,操作数因密钥位而异)。每个迭代执行完全相同的操作序列,消除所有条件分支。

3.7.3 安全性评估

3.8 🔬 高阶 TVLA:1–4 阶统计矩验证(2026-06-20)

🏆 关键成果:SM2 BigInt v1.3 三重防护(Scalar Masking + Projective Randomization + Montgomery Ladder)在 N=5,000 × 1–4 阶矩高阶 TVLA 中 20/20 全 PASS,最高 |t| = 1.24,远低于阈值 4.5。

3.8.1 为什么需要高阶 TVLA

一阶 TVLA(Welch's t-test on mean)仅检测 均值差异(data-dependent mean)。但侧信道泄漏可能表现为:

每个阶矩独立进行 Welch's t-test(比较固定组 vs 随机组的对应阶矩),|t| ≤ 4.5 判定通过。

3.8.2 测试配置

参数
实现SM2 BigInt v1.3(Montgomery Ladder + Scalar Masking + Projective Randomization)
样本量N = 5,000(每组 2,500 固定 + 2,500 随机)
统计矩Order 1 (mean) / Order 2 (variance) / Order 3 (skewness) / Order 4 (kurtosis)
操作数5(genKey / sign / verify / encrypt / decrypt)
总测试量20 项 Welch's t-tests(5 ops × 4 orders)
总时长571.7 秒(≈ 9.5 分钟)
环境阿里云 ECS · Node.js v22 · 虚拟化环境(非裸机)
阈值|t| ≤ 4.5

3.8.3 完整测试结果

操作 Order 1
(mean)
Order 2
(variance)
Order 3
(skewness)
Order 4
(kurtosis)
最大值 结论
genKey 0.03 0.33 0.05 0.12 0.33 ✅ PASS
sign 0.13 0.29 0.16 0.27 0.29 ✅ PASS
verify 0.06 0.69 0.23 0.14 0.69 ✅ PASS
encrypt 0.07 0.89 0.54 1.24 1.24 ✅ PASS
decrypt 0.02 0.74 0.13 0.42 0.74 ✅ PASS

3.8.4 逐阶分析

📊 关键观察

3.8.5 encrypt 高阶峰值分析

encrypt 操作的 Order 4 (kurtosis) |t|=1.24 是整个测试的全局最高值。这与 encrypt 的内部结构有关:

3.8.6 decrypt 最稳健:三重防护的累积效应

decrypt 在高阶 TVLA 中表现最优:Order 2 |t|=0.74, Order 3 |t|=0.13, Order 4 |t|=0.42。三重防护在 decrypt 路径上的累积效应最明显:

3.8.7 存证文件

文件路径SHA-256
高阶 TVLA 报告 tvla-sm2-high-order-report.json 9fa2a855...
SHA-256 校验 tvla-sm2-high-order-report.sha256 不含时间戳,无自指循环
FreeTSA 时间戳 tvla-sm2-high-order-report.tsr 2026-06-20 21:09:33 GMT · Granted
技术验证证据地图 TECHNICAL-VERIFICATION.md v4 含高阶 TVLA 章节

4. wNAF 算法的侧信道风险(理论 vs 实测)

4.1 泄漏原理

wNAF(窗口非相邻形式)标量乘法的工作原理:

两种操作的执行时间不同。攻击者通过测量时序或功耗,可以恢复 ADD/DOUBLE 序列模式,从而推断非零位的分布 → 恢复私钥信息。

学术界对此有明确的表述(Brumley & Tuveri, 2011):

"By side-channel analysis of the time consumption and the behavior of caches, an attacker can retrieve the sequence of the form 'ADDADDDDDDDAD...DDDADD', where 'A' represents an add operation and 'D' a double operation. From the order of 'A's and 'D's, we can recover the non-zero digit positions."

4.2 实测结果 vs 理论风险(N=5,000 更新)

🟢 更新:Scalar Masking 修复后,verify 和 decrypt 均已通过(详见第 3.6 节)。修复前的泄漏根因是 (k̃) 即掩码抵消 ≡ k 使得 mask 失效,而非 wNAF 的 ADD/DOUBLE 模式本身。

后续参考:sign 操作(使用预生成随机 k 池)在两个阶段中始终安全(N=2000 |t|=2.03 → N=5000 masked |t|=0.06),确认 wNAF 在 V8 环境中的 ADD/DOUBLE 差异被 JIT/GC/CPU 噪声有效稀释。
📋 存档(修复前分析):TVLA v3 (N=5,000) sign 操作在两个实现中仍然通过(jsbn |t|=2.47,BigInt |t|=1.37),说明 sign 中使用的预生成随机 k 值有效屏蔽了 wNAF 的 ADD/DOUBLE 模式差异。

verify 操作在修复前不通过(|t|=6.17-7.42),但该泄漏来自 (k̃) 即掩码抵消 的 mask 失效问题,而非 wNAF 特定的 ADD/DOUBLE 差异。现在已通过 Scalar Masking 修复。

5. 旧版 vs 新版测试状态

指标 旧版 jsbn SM2 新版 BigInt + wNAF SM2
TVLA v1 (N=2,000)✅ 5/5 通过未测试
TVLA v2 (N=2,000)✅ 5/5 通过✅ 5/5 通过 (10/10 SM2)
TVLA v3 (N=5,000)⚠️ 3/5 通过⚠️ 4/5 通过 (7/10 SM2)
底层算术jsbn 28-bit limbBigInt 64-bit 原生
标量乘法double-and-add(朴素)wNAF 窗口
坐标系仿射Jacobian + 预计算表
性能基准6.2x 加速
TVLA v1.2 Masked (N=5,000)✅ 5/5 通过✅ 5/5 通过 (Scalar Masking)
🏆 TVLA v1.3 Ladder (N=5,000)✅ 7/7 通过 · 三重防护 (Masking + Proj Rand + Montgomery Ladder)
🔬 高阶 1–4 阶 (N=5,000)✅ 20/20 全绿 · 最高 |t|=1.24 · encrypt O4
v3 verify |t|6.177.42
v3 sign |t|2.471.37
v1.2 masked |t| (verify/decrypt)1.19 / 2.06 (✅ 全部通过)
🏆 v1.3 ladder |t| (verify/decrypt)0.10 / 0.16 (✅ 全绿 · ↓92%)
RAW 数据 v1.3sm2-tvla-v13-final_2026-06-18.md(待归档) · 证据地图 v4

6. 硬件与实验要求

完整的 TVLA 测试需要专业硬件——这超出了普通开发环境的能力范围:

设备用途规格要求
数字示波器采集功耗 / EM 轨迹≥ 1 GS/s 采样率,≥ 500 MHz 带宽
差分探头测量功耗(Shunt 电阻)低噪声,≥ 100 MHz 带宽
EM 近场探头测量电磁辐射H-field 探头套件
测试板运行被测代码目标 CPU(Node.js / V8 运行环境)
触发信号同步示波器采集GPIO 触发输出

6.1 时序 TVLA(最低门槛)

如果仅做时序 TVLA(不使用硬件功耗采集),可以用与 ML-KEM-768 TVLA 相同的方法:

  1. 在 Node.js 环境中使用 process.hrtime.bigint() 高精度计时
  2. 固定明文组 vs 随机明文组,各 N 轮
  3. Welch's t-test 计算 |t| 值
  4. 阈值 4.5

注意:纯时序 TVLA 只能检测 时序侧信道,无法检测功耗或 EM 泄漏。完整的侧信道安全评估需要功耗采集。

6.2 测试方案选项

方案成本时间覆盖
A. 自行时序 TVLA 低(纯软件) ✅ 已完成 (N=5000) 时序泄漏检测(两轮)
B. 委托国家密码管理局检测中心 中-高(¥20k–50k 估算) 1–2 月 完整商密侧信道评估
C. 学术合作(高校密码实验室) 2–4 月 合作论文 + 完整测试
D. 开源社区贡献 不确定 依赖志愿者能力

7. 后续计划

  1. 短期(1–2 周)升级到 N≥5,000 ✅ 已完成(2026-06-18):N=5,000 TVLA 完成。v3 发现 verify + decrypt 泄漏。
  2. 短期(1–2 周)修复 verify/decrypt 泄漏 ✅ 已完成(2026-06-18):Scalar Masking + Projective Randomization 修复,N=5,000 5/5 全绿。根因:(k̃) 即掩码抵消 消除 mask → 改为 独立随机掩码。
  3. 中期(1–2 月)升级到 N=10,000:对标 ML-KEM-768 标准。Masked v1.2 已在 N=5,000 全绿,升级 N 做最终确认。
  4. 中期(1–2 月):评估委托实验室的可行性与成本;探索 FPGA 平台的 SM2 功耗/EM TVLA
  5. 长期:Montgomery Ladder 恒定时间点乘 ✅ 已完成(2026-06-18):Montgomery Ladder v1.3 三重防护 — |t| 再降 92%(verify 0.10, decrypt 0.16),7/7 全绿。
  6. 高阶 TVLA (1–4 阶矩) ✅ 已完成(2026-06-20):N=5,000 × 4 阶矩 × 5 操作,20/20 全绿,最高 |t|=1.24。SM2 侧信道安全验证已覆盖一阶 mean 和高阶方差/偏度/峰度全部统计维度。
  7. 中期(1–2 月)升级到 N=10,000:对标 ML-KEM-768 标准。Masked v1.2 已在 N=5,000 全绿,高阶 20/20 全绿,升级 N 做最高样本量最终确认。
  8. 中期(1–2 月):评估委托实验室的可行性与成本;探索 FPGA 平台的 SM2 功耗/EM TVLA
💡 参考:ML-KEM-768 的 TVLA v2 Enhanced (N=10,000) 通过经验表明,FIBEMATE 有能力独立完成高样本量 TVLA。SM2 对标 ML-KEM 的测试方法是可行的。SM2 v1.3 已完成从一阶到四阶矩、从 N=2,000 到 N=5,000 的全面验证。

8. 参考文献

8.1 TVLA 方法学基础

  1. Goodwill, G., Jun, B., Jaffe, J., & Rohatgi, P. (2011). "A Testing Methodology for Side-Channel Resistance Validation." NIST Non-Invasive Attack Testing Workshop (NIAT). — TVLA 方法学的奠基文献,定义了 Non-specific t-test 框架.
  2. NIST IR 8214A (2018). "Resistance of Implementations to Side-Channel & Fault Attacks." — TVLA 判定阈值 |t| < 4.5 的来源.

8.2 侧信道工程实践参考

  1. Brumley, B. B., & Tuveri, N. (2011). "Remote Timing Attacks are Still Practical." ESORICS 2011. LNCS 6879, pp. 355–371. Springer. — 时序攻击的工程可行性,佐证恒定时间实现的必要性.
  2. OpenSSL Security Advisory (2025). SM2 64-bit ARM timing side-channel issue. — SM2 实现侧信道漏洞实例.

💡 关于引用范围:本文档的 TVLA 测试仅针对时序侧信道(Timing Side-Channel)进行验证。因此,参考文献聚焦于 TVLA 方法论基础和时序攻击工程实例。其他侧信道攻击类型(如功耗分析、电磁分析、故障注入等)及针对 SM2 的理论密码分析(如格攻击)与本验证工作属于不同的威胁模型,不列入本文档的引用范围

9. 免责声明

⚠️ 本文档为技术分析文档,不代表最终安全结论。

  1. TVLA 的局限性:TVLA (Non-specific t-test) 评估的是 Passive Timing Side-Channel(被动时序侧信道),仅检测第一/二阶统计矩差异。通过 TVLA 不保证实现能抵抗功耗分析、电磁分析、故障注入、微架构侧信道(缓存/分支预测)等不同威胁模型下的攻击。
  2. 与攻击论文的区别:密码学文献中研究 SM2/ECDSA 的格攻击、模板攻击、故障注入攻击等论文(如 Cao 2022、Bai 2023、Zhang 2014、Shi 2015)属于主动攻击/物理攻击/密码分析范畴,其威胁模型与 TVLA 评估的被动时序泄露模型不同,不应混为一谈。本文档的参考文献仅列入 TVLA 方法学和时序侧信道工程实践的基础文献。
  3. 非商业密码服务:FIBEMATE 不提供商用密码服务。SM2/SM3/SM4 国密算法的使用须遵守《中华人民共和国密码法》及相关法规。
  4. 完整性验证:本文档已通过 RFC 3161 时间戳存证,存证仅证明文档在特定时间点的完整性,不构成对代码安全性的第三方背书或担保。
← 返回 SM2 性能优化页面