阶段四侧信道防护 — 故障注入攻击通过在密码运算中引入错误,利用错误结果推导密钥。Bellcore 攻击只需一个 CRT-RSA 故障即可分解模数。防护故障注入是密码硬件安全的重要维度。
| 方法 | 精度 | 成本 | 可检测性 |
|---|---|---|---|
| 电压毛刺 | 低(微秒级) | 低 | 中等 |
| 时钟毛刺 | 中(纳秒级) | 低 | 中等 |
| 电磁脉冲 | 中(10ns级) | 中 | 低 |
| 激光注入 | 高(亚微米级) | 高 | 极低 |
| 温度攻击 | 低 | 低 | 低 |
如果 CRT-RSA 计算中 p 或 q 的子运算发生故障:
攻击者同时获得正确结果 m 和错误结果 m',则:
在 AES 第 9 轮注入故障,通过正确/错误密文对推导最后一轮的轮密钥。
// 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
// 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
// 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
1. 模拟 Bellcore 攻击:在 RSA-CRT 解密中注入一个位翻转,验证 gcd 攻击。
2. 实现完整的 AES DFA 检测:在每轮结束后验证奇偶校验。
3. 设计电压监测器:检测 Vcc 上的毛刺,触发故障报警。
4. 分析:三模冗余(TMR)与双模冗余的故障检测率比较。TMR 能纠正故障吗?
你已掌握故障注入攻击的原理和多种检测/防护技术。故障防护是密码硬件安全的最后一道防线!阶段四完成,你已是侧信道防护专家!
获得徽章:🔧 FAULT_HUNTER
推荐使用以下工具链进行课程实践:
# 安装 Verilator
sudo apt install verilator
# 安装 Icarus Verilog(可选)
sudo apt install iverilog
# 安装 GTKWave(波形查看器)
sudo apt install gtkwave
# 验证安装
verilator --lint-only --version
iverilog -V
密码学硬件实现的关键性能指标:
这些指标之间通常存在 trade-off,设计时需根据应用场景权衡。
本课涉及的核心概念和技术关系:
Verilog 仿真调试的常用方法:
// 调试示例
initial begin
$dumpfile("sim.vcd");
$dumpvars(0, uut);
end
// 断言验证
assert property (@(posedge clk) valid |-> data !== 'x)
else $error("Invalid data when valid!");
# 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
密码硬件的性能评估维度:
| 指标 | 单位 | 说明 |
|---|---|---|
| 面积 | GE / LUT | 等效门数或查找表数量 |
| 频率 | MHz | 最大时钟频率 |
| 吞吐量 | Gbps | 每秒处理的数据量 |
| 延迟 | 周期数 | 从输入到输出的周期 |
| 能效 | pJ/bit | 每比特能耗 |
| 面积效率 | Gbps/GE | 单位面积吞吐量 |
不同应用场景对指标优先级不同:IoT 偏重面积和能效,服务器偏重吞吐量。
本课涉及的核心概念和技术关系:
Verilog 仿真调试的常用方法:
// 调试示例
initial begin
$dumpfile("sim.vcd");
$dumpvars(0, uut);
end
// 断言验证
assert property (@(posedge clk) valid |-> data !== 'x)
else $error("Invalid data when valid!");
# 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
密码硬件的性能评估维度:
| 指标 | 单位 | 说明 |
|---|---|---|
| 面积 | GE / LUT | 等效门数或查找表数量 |
| 频率 | MHz | 最大时钟频率 |
| 吞吐量 | Gbps | 每秒处理的数据量 |
| 延迟 | 周期数 | 从输入到输出的周期 |
| 能效 | pJ/bit | 每比特能耗 |
| 面积效率 | Gbps/GE | 单位面积吞吐量 |
不同应用场景对指标优先级不同:IoT 偏重面积和能效,服务器偏重吞吐量。