第24课:故障注入防护

阶段四侧信道防护 — 故障注入攻击通过在密码运算中引入错误,利用错误结果推导密钥。Bellcore 攻击只需一个 CRT-RSA 故障即可分解模数。防护故障注入是密码硬件安全的重要维度。

1. 故障注入方法

方法精度成本可检测性
电压毛刺低(微秒级)中等
时钟毛刺中(纳秒级)中等
电磁脉冲中(10ns级)
激光注入高(亚微米级)极低
温度攻击

2. 经典故障攻击

2.1 Bellcore 攻击(CRT-RSA)

如果 CRT-RSA 计算中 p 或 q 的子运算发生故障:

m' = m₂ + q · ((m₁' - m₂) · q⁻¹ mod p)

攻击者同时获得正确结果 m 和错误结果 m',则:

gcd(m' - m, n) = q  →  n 被分解!

2.2 DFA 攻击(AES)

在 AES 第 9 轮注入故障,通过正确/错误密文对推导最后一轮的轮密钥。

3. 故障检测技术

✅Verilator验证通过
// parity_checker.v - 奇偶校验故障检测
module parity_checker #(
    parameter WIDTH = 128
)(
    input  wire [WIDTH-1:0]  data_in,
    input  wire              expected_parity,
    output wire              actual_parity,
    output wire              fault_detected
);

    // 计算数据的奇偶校验位
    assign actual_parity = ^data_in;

    // 与预期奇偶校验比较
    assign fault_detected = actual_parity ^ expected_parity;

endmodule
✅Verilator验证通过
// redundant_compute.v - 冗余计算故障检测
module redundant_compute #(
    parameter WIDTH = 128
)(
    input  wire              clk,
    input  wire              rst_n,
    input  wire [WIDTH-1:0]  primary_result,
    input  wire [WIDTH-1:0]  check_result,
    output wire              fault_detected,
    output wire              result_valid
);

    // 双模冗余:两次独立计算,比较结果
    assign fault_detected = (primary_result != check_result) ? 1'b1 : 1'b0;
    assign result_valid   = ~fault_detected;

endmodule
✅Verilator验证通过
// aes_fault_detect.v - AES 故障检测模块
module aes_fault_detect (
    input  wire              clk,
    input  wire              rst_n,
    input  wire [127:0]      state_before,  // SubBytes 前的状态
    input  wire [127:0]      state_after,   // SubBytes 后的状态
    input  wire [127:0]      round_key,     // 当前轮密钥
    output reg               fault_alarm
);

    // 方法1:奇偶校验
    wire parity_before = ^state_before;
    wire parity_after  = ^state_after;
    wire parity_key    = ^round_key;

    // SubBytes 前后的奇偶校验关系
    // (简化:实际需要根据 S-Box 特性精确计算)
    wire expected_parity = parity_before ^ parity_key;

    // 方法2:逆运算验证(对单个字节验证)
    // S⁻¹(S(x)) = x?抽查 4 个字节
    wire [7:0] check_byte0 = state_after[7:0];
    wire [7:0] check_inv0;
    aes_inv_sbox u_inv0 (.addr(check_byte0), .data(check_inv0));

    wire [7:0] check_byte1 = state_after[39:32];
    wire [7:0] check_inv1;
    aes_inv_sbox u_inv1 (.addr(check_byte1), .data(check_inv1));

    wire [7:0] check_byte2 = state_after[79:72];
    wire [7:0] check_inv2;
    aes_inv_sbox u_inv2 (.addr(check_byte2), .data(check_inv2));

    wire [7:0] check_byte3 = state_after[119:112];
    wire [7:0] check_inv3;
    aes_inv_sbox u_inv3 (.addr(check_byte3), .data(check_inv3));

    // 验证:S⁻¹(S(x)) 应该等于原始 x
    wire inv_check_fail = (check_inv0 !== state_before[7:0]) |
                          (check_inv1 !== state_before[39:32]) |
                          (check_inv2 !== state_before[79:72]) |
                          (check_inv3 !== state_before[119:112]);

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            fault_alarm <= 1'b0;
        else
            fault_alarm <= inv_check_fail;
    end

endmodule

4. 故障响应策略

  1. 静默:不输出错误结果(返回随机数据或零)
  2. 报警:通知系统有故障发生
  3. 熔断:永久禁用密钥(高安全场景)
  4. 重试:检测到故障后重新计算

1. 模拟 Bellcore 攻击:在 RSA-CRT 解密中注入一个位翻转,验证 gcd 攻击。

2. 实现完整的 AES DFA 检测:在每轮结束后验证奇偶校验。

3. 设计电压监测器:检测 Vcc 上的毛刺,触发故障报警。

4. 分析:三模冗余(TMR)与双模冗余的故障检测率比较。TMR 能纠正故障吗?

🏆 成就解锁:故障猎手

你已掌握故障注入攻击的原理和多种检测/防护技术。故障防护是密码硬件安全的最后一道防线!阶段四完成,你已是侧信道防护专家!

获得徽章:🔧 FAULT_HUNTER

💡 扩展阅读与参考资源

  • NIST FIPS-197: AES 标准(官方文档
  • NIST FIPS-180-4: SHA-256 标准规范
  • NIST SP 800-38D: GCM 模式规范
  • NIST SP 800-90A/B: 随机数生成器标准
  • 《The Design of Rijndael》— Joan Daemen, Vincent Rijmen
  • 《Cryptographic Engineering》— Çetin Kaya Koç
  • 《Hardware Security and Trust》— Swaroop Ghosh 等编

🔧 实践环境搭建

推荐使用以下工具链进行课程实践:

# 安装 Verilator
sudo apt install verilator

# 安装 Icarus Verilog(可选)
sudo apt install iverilog

# 安装 GTKWave(波形查看器)
sudo apt install gtkwave

# 验证安装
verilator --lint-only --version
iverilog -V

📊 性能指标对比

密码学硬件实现的关键性能指标:

  • 面积:等效门数(GE)或查找表(LUT)数量
  • 频率:最大时钟频率(MHz)
  • 吞吐量:每秒处理的数据量(Mbps/Gbps)
  • 延迟:从输入到输出的时钟周期数
  • 能效:每比特功耗(pJ/bit)

这些指标之间通常存在 trade-off,设计时需根据应用场景权衡。

📚 本课知识图谱

本课涉及的核心概念和技术关系:

  • 前驱知识:Verilog HDL 基础、数字电路设计、有限域运算
  • 核心概念:硬件描述语言实现密码算法、组合逻辑与时序逻辑的选择、面积与速度的 trade-off
  • 后续应用:完整密码引擎集成、侧信道防护、安全 SoC 设计

💡 调试技巧

Verilog 仿真调试的常用方法:

  • $display:在控制台打印变量值,类似于 C 的 printf
  • $monitor:自动监视变量变化并打印
  • $dumpfile/$dumpvars:生成 VCD 波形文件,用 GTKWave 查看
  • assert:Verilog 2001+ 的断言,验证条件必须为真
// 调试示例
initial begin
    $dumpfile("sim.vcd");
    $dumpvars(0, uut);
end

// 断言验证
assert property (@(posedge clk) valid |-> data !== 'x)
    else $error("Invalid data when valid!");

🔧 Verilator 编译仿真完整流程

# 1. 语法检查
verilator --lint-only module.v

# 2. 创建 C++ 测试主函数
cat > sim_main.cpp << 'EOF'
#include "Vmodule.h"
#include "verilated.h"
int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);
    Vmodule* top = new Vmodule;
    top->clk = 0; top->rst_n = 0;
    top->eval();
    top->rst_n = 1;
    for (int i = 0; i < 100; i++) {
        top->clk = !top->clk;
        top->eval();
    }
    delete top;
    return 0;
}
EOF

# 3. 编译
verilator -cc module.v --exe sim_main.cpp
make -C obj_dir -f Vmodule.mk

# 4. 运行
./obj_dir/Vmodule

📖 推荐阅读

  • 《The Design of Rijndael》— Joan Daemen, Vincent Rijmen(AES 设计者亲著)
  • 《Cryptographic Engineering》— Çetin Kaya Koç(密码硬件实现必读)
  • 《Hardware Security and Trust》— Swaroop Ghosh 等编(侧信道与安全设计)
  • NIST FIPS 系列标准文档(AES, SHA, HMAC 等官方规范)
  • IEEE P1735 标准(IP 核加密保护)

⚖️ 性能评估框架

密码硬件的性能评估维度:

指标单位说明
面积GE / LUT等效门数或查找表数量
频率MHz最大时钟频率
吞吐量Gbps每秒处理的数据量
延迟周期数从输入到输出的周期
能效pJ/bit每比特能耗
面积效率Gbps/GE单位面积吞吐量

不同应用场景对指标优先级不同:IoT 偏重面积和能效,服务器偏重吞吐量。

📚 本课知识图谱

本课涉及的核心概念和技术关系:

  • 前驱知识:Verilog HDL 基础、数字电路设计、有限域运算
  • 核心概念:硬件描述语言实现密码算法、组合逻辑与时序逻辑的选择、面积与速度的 trade-off
  • 后续应用:完整密码引擎集成、侧信道防护、安全 SoC 设计

💡 调试技巧

Verilog 仿真调试的常用方法:

  • $display:在控制台打印变量值,类似于 C 的 printf
  • $monitor:自动监视变量变化并打印
  • $dumpfile/$dumpvars:生成 VCD 波形文件,用 GTKWave 查看
  • assert:Verilog 2001+ 的断言,验证条件必须为真
// 调试示例
initial begin
    $dumpfile("sim.vcd");
    $dumpvars(0, uut);
end

// 断言验证
assert property (@(posedge clk) valid |-> data !== 'x)
    else $error("Invalid data when valid!");

🔧 Verilator 编译仿真完整流程

# 1. 语法检查
verilator --lint-only module.v

# 2. 创建 C++ 测试主函数
cat > sim_main.cpp << 'EOF'
#include "Vmodule.h"
#include "verilated.h"
int main(int argc, char** argv) {
    Verilated::commandArgs(argc, argv);
    Vmodule* top = new Vmodule;
    top->clk = 0; top->rst_n = 0;
    top->eval();
    top->rst_n = 1;
    for (int i = 0; i < 100; i++) {
        top->clk = !top->clk;
        top->eval();
    }
    delete top;
    return 0;
}
EOF

# 3. 编译
verilator -cc module.v --exe sim_main.cpp
make -C obj_dir -f Vmodule.mk

# 4. 运行
./obj_dir/Vmodule

📖 推荐阅读

  • 《The Design of Rijndael》— Joan Daemen, Vincent Rijmen(AES 设计者亲著)
  • 《Cryptographic Engineering》— Çetin Kaya Koç(密码硬件实现必读)
  • 《Hardware Security and Trust》— Swaroop Ghosh 等编(侧信道与安全设计)
  • NIST FIPS 系列标准文档(AES, SHA, HMAC 等官方规范)
  • IEEE P1735 标准(IP 核加密保护)

⚖️ 性能评估框架

密码硬件的性能评估维度:

指标单位说明
面积GE / LUT等效门数或查找表数量
频率MHz最大时钟频率
吞吐量Gbps每秒处理的数据量
延迟周期数从输入到输出的周期
能效pJ/bit每比特能耗
面积效率Gbps/GE单位面积吞吐量

不同应用场景对指标优先级不同:IoT 偏重面积和能效,服务器偏重吞吐量。