Skip to content

如何分析加密代码的恒定时间执行以防止时序攻击

解决加密实现中的侧信道泄露问题:通过扫描汇编指令或字节码,检测是否存在与秘密数据相关的条件分支或非恒定时间操作(如除法),从而规避时序攻击风险。

为什么需要这个技能

在密码学实现中,如果一段代码的执行时间取决于处理的秘密数据(如私钥、口令),攻击者可以通过高精度测量执行时间地推断出秘密信息的位数。这种漏洞被称为“时序攻击(Timing Attack)”。

典型的危险操作包括:

  • 秘密数据的除法/取模:许多 CPU 的除法指令执行时间取决于操作数的大小。
  • 基于秘密数据的条件分支if (secret == x) 会导致指令流水线不同的跳转行为。
  • 秘密索引的内存访问:会导致缓存命中/缺失,产生可测量的时延差异。

本技能提供一套分析工具和方法论,帮助开发者在编译后的二进制或字节码层面验证代码是否实现了“恒定时间(Constant-Time)”执行。

适用场景

  • 实现加密算法:当你正在编写签名、加密或密钥派生函数时。
  • 安全审计:评审 signverifyencryptdecrypt 等核心函数。
  • 漏洞修复:针对类似 KyberSlash 或 Lucky Thirteen 等时序漏洞进行加固。
  • 合规检查:需要验证代码是否符合恒定时间编程指南(如 Cryptocoding Guidelines)。

核心工作流

  1. 环境准备:根据语言安装对应的编译器或工具链(如 gcc, rustc, javac.NET SDK)。
  2. 运行分析器:使用 ct_analyzer 扫描源代码或编译产物。
    bash
    # 基础分析
    uv run {baseDir}/ct_analyzer/analyzer.py <source_file>
    
    # 针对编译语言进行跨架构测试(推荐)
    uv run {baseDir}/ct_analyzer/analyzer.py --arch x86_64 crypto.c
    uv run {baseDir}/ct_analyzer/analyzer.py --arch arm64 crypto.c
  3. 结果分诊:分析器会标记出所有潜在的非恒定时间指令(如 SDIV, JE)。由于工具不具备数据流分析能力,你需要手动判断:该指令的操作数是否依赖于秘密数据?
    • 如果操作数是公开的长度(Length)或常量 误报 (False Positive)
    • 如果操作数来源于私钥或明文 真实漏洞 (True Positive)
  4. 实施修复:将条件分支改为位掩码操作(Bit Masking)或使用 cmov 指令;将除法改为巴雷特约减(Barrett reduction)。

下载和安装

下载 constant-time-analysis 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐