systemslibrarian/crypto-lab-hqc-timing

GitHub: systemslibrarian/crypto-lab-hqc-timing

基于浏览器的交互式教学实验室,演示后量子 HQC 方案中非常数时间 BCH 解码器的时序侧信道攻击及常数时间防御。

Stars: 0 | Forks: 0

# crypto-lab-hqc-timing ## 它是什么 这是一个关于时序侧信道的交互式演示,该信道曾多次对 HQC(Hamming Quasi-Cyclic)构成威胁。HQC 是 NIST 在 2025 年选定进行标准化的基于编码的密钥封装机制。一个后量子方案即使在困难的数学问题之上建立安全性,仍然可能通过*其解码器运行的时间长短*泄漏出私钥。本实验室重现了已记录的攻击方式:非常数时间的代码解码器在耗时上会根据其必须纠正的错误权重而有所不同,而选择密文时序预言机将这种相关性转化为对私钥的完全恢复。本实验室允许你运行攻击,观察逐位置时序图如何揭示秘密错误支持集,然后开启常数时间解码器,看着信号——以及攻击——消失。时序模型是抽象的(解码器工作量与错误权重成正比,外加测量噪声),因此无需完整的 HQC 实现即可观察到侧信道,但攻击结构反映了真实的攻击。 ## 何时使用 - **教授 PQC 的侧信道攻击** —— 证明“后量子安全”的数学原理并不等同于安全的实现。 - **解释 constant-time 编程** —— 具体演示为什么依赖于秘密的时序是可被利用的,以及如何通过扁平化来进行防御。 - **填补基于编码的攻击空白** —— 作为格侧信道演示的补充,涵盖基于编码的密码体系(HQC/BIKE/McEliece)。 - **推动实现审查** —— 说明为什么必须检查编译后的二进制文件(而不仅仅是源代码)是否具备 constant-time 行为。 - **请勿将其视为对真实 HQC 的破解** —— 这是一个带有抽象时序模型和微小参数的教学模拟。 ## 在线演示 [**https://systemslibrarian.github.io/crypto-lab-hqc-timing/**](https://systemslibrarian.github.io/crypto-lab-hqc-timing/) 设置秘密错误权重、测量噪声以及每个位置需要平均的定时查询次数,然后运行时序预言机攻击。图表显示每个码字位置的平均解码时间;低于阈值线的位置将被猜测为秘密错误位置(绿色表示正确,红色表示错误)。恢复面板将恢复出的支持集与真实秘密进行对比,并报告位准确率和查询次数。切换 constant-time 防御并重新运行:现在每个位置执行相同的工作,柱状图变得平坦,恢复率降至相当于抛硬币的概率。在实验室下方,一条时间线展示了四次真实的 HQC 时序泄漏(2020 年 BCH 解码器、2022 年拒绝采样、2024 年除法指令、2026 年编译器诱导),随后是一份关于如何关闭该信道的指南/禁忌。 ## 哪里会出问题 - **随错误权重扩展的解码器运行时间** —— 最初的 2020 年攻击正是利用了这一点;BCH 解码器在错误较少时完成得更快,从而泄漏了秘密支持集。 - **在 constant-time 解码器下依然存在的泄漏** —— 2022 年的拒绝采样攻击表明,如果重新加密步骤仍然基于秘密数据进行分支,仅仅修复解码器是不够的。 - **可变时间的 CPU 指令** —— 2024 年的“Divide and Surrender”攻击利用了一条其时序取决于操作数的除法指令;修复方法是手动 Barrett reduction。 - **编译器重新引入的泄漏** —— 在 2026 年,优化重写将源代码级别的 constant-time 代码变成了依赖于秘密的控制流,从而实现了缓存时序的完全解密预言机;constant-time 的源代码并不能保证 constant-time 的二进制文件。 - **“足够快”的思维** —— 当攻击者可以发起数千次查询时,亚微秒级的时序差异是可测量的,因此近似的 constant-time 并不是 constant-time。 ## 现实世界中的用法 - **HQC 标准化** —— NIST 在 2025 年选择 HQC 作为基于编码的 KEM,在基于格的 ML-KEM 之外提供了算法多样性;其实现安全性目前正受到密切关注。 - **Constant-time BCH/Reed-Muller 解码** —— 标准的缓解措施,在每次解码时执行最坏情况下的工作而不考虑秘密,这是在 2020 年攻击发生后采用的。 - **Barrett/Montgomery reduction** —— 在 2024 年的攻击之后,用于替换采样例程中的可变时间除法。 - **二进制级别的 constant-time 验证** —— 检查编译输出中是否存在依赖于秘密的分支的工具和 CI 检查,其动力来自于 2026 年的编译器诱导泄漏。 - **选择密文加固(FO 转换)** —— Fujisaki-Okamoto 转换提供了 CCA 安全性,但正如拒绝采样攻击所表明的那样,其重新加密步骤本身必须是 constant-time 的。 ## 技术 Vite + TypeScript,零运行时依赖。`src/engine.ts` 实现了时序模拟和时序预言机攻击;`src/data.ts` 包含攻击时间线和防御措施;`src/ui.ts` 是交互式实验室。暗黑模式在首次加载时遵循你的操作系统偏好,并且可以切换及持久化保存。UI 是移动优先的(44 像素点击目标,流式排版,堆叠布局),支持键盘访问(跳转链接,可见的焦点环,每个区域都有 ARIA 标签),并遵循 `prefers-reduced-motion`、`forced-colors` 和打印设置。 ``` npm install npm run dev # local dev server npm run build # type-check + production build to dist/ ``` GitHub Pages 部署在每次推送到 `main` 时通过 `.github/workflows/deploy.yml` 运行(构建 → 上传构建产物 → 部署)。 “所以,你们或吃或喝,或做什么,一切都要为上帝的荣耀而行。” —— 《哥林多前书》10:31
标签:侧信道攻击, 后量子密码, 密码学, 密钥恢复, 常量时间编程, 手动系统调用, 教学演示, 时序攻击, 自动化攻击