第23课:功耗分析防护

阶段四侧信道防护 — 功耗分析是最常见的侧信道攻击。本课从逻辑层到物理层,全面介绍功耗分析防护技术。

1. 功耗泄露模型

CMOS 电路的功耗与数据相关:

P = P_static + P_dynamic = P_leakage + C·V²·f·α

其中 α(翻转活动因子)与处理的数据直接相关。攻击者利用这种相关性提取密钥。

2. 逻辑层防护:双轨预充电逻辑

标准 CMOS:1→0 和 0→1 翻转的功耗不同。双轨逻辑让每次操作消耗相同功耗:

单轨信号:x ∈ {0, 1}(功耗与转换相关)

双轨信号:(x_t, x_f) ∈ {(1,0), (0,1), (0,0)},其中 (1,0)=逻辑1, (0,1)=逻辑0, (0,0)=预充电

每个时钟周期:预充电→求值,总是恰好一个信号翻转,功耗恒定!

✅Verilator验证通过
// dual_rail_and.v - 双轨预充电 AND 门
module dual_rail_and (
    input  wire a_t, a_f,   // 双轨输入 A
    input  wire b_t, b_f,   // 双轨输入 B
    input  wire precharge,  // 预充电信号
    output reg  z_t, z_f    // 双轨输出 Z = A AND B
);

    // 预充电阶段:输出置为 (0, 0)
    // 求值阶段:计算 AND
    always @(*) begin
        if (precharge) begin
            z_t = 1'b0;
            z_f = 1'b0;
        end else begin
            // AND: z_t = a_t AND b_t, z_f = a_f OR b_f
            z_t = a_t & b_t;
            z_f = a_f | b_f;
        end
    end

endmodule
✅Verilator验证通过
// dual_rail_xor.v - 双轨预充电 XOR 门
module dual_rail_xor (
    input  wire a_t, a_f,
    input  wire b_t, b_f,
    input  wire precharge,
    output reg  z_t, z_f
);

    always @(*) begin
        if (precharge) begin
            z_t = 1'b0;
            z_f = 1'b0;
        end else begin
            // XOR: z_t = (a_t AND b_f) OR (a_f AND b_t)
            //      z_f = (a_t AND b_t) OR (a_f AND b_f)
            z_t = (a_t & b_f) | (a_f & b_t);
            z_f = (a_t & b_t) | (a_f & b_f);
        end
    end

endmodule

3. 架构层防护:去耦与噪声

✅Verilator验证通过
// noise_generator.v - 功耗噪声注入器
module noise_generator #(
    parameter WIDTH = 32
)(
    input  wire              clk,
    input  wire              rst_n,
    input  wire              enable,
    output wire [WIDTH-1:0]  noise_out
);

    // 多个 LFSR 并行,产生伪随机噪声
    reg [7:0] lfsr0, lfsr1, lfsr2, lfsr3;

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            lfsr0 <= 8'hA5; lfsr1 <= 8'h3C;
            lfsr2 <= 8'hF0; lfsr3 <= 8'h69;
        end else if (enable) begin
            // 8位 LFSR 反馈
            lfsr0 <= {lfsr0[6:0], lfsr0[7] ^ lfsr0[5] ^ lfsr0[4] ^ lfsr0[3]};
            lfsr1 <= {lfsr1[6:0], lfsr1[7] ^ lfsr1[6] ^ lfsr1[5]};
            lfsr2 <= {lfsr2[6:0], lfsr2[7] ^ lfsr2[6] ^ lfsr2[4]};
            lfsr3 <= {lfsr3[6:0], lfsr3[7] ^ lfsr3[5] ^ lfsr3[3]};
        end
    end

    assign noise_out = {lfsr0, lfsr1, lfsr2, lfsr3};

endmodule

4. 物理层防护

1. 用双轨逻辑实现完整的 AES S-Box,与标准实现比较面积和延迟。

2. 模拟功耗噪声注入的效果:添加噪声后,DPA 攻击需要多少额外的轨迹?

3. 设计一个时钟抖动模块:随机化时钟周期 ±10%。

4. 分析:双轨预充电逻辑在 FPGA 上实现的特殊挑战(查找表结构 vs. 标准单元)。

🏆 成就解锁:功耗盾牌

你已掌握从逻辑层到物理层的功耗分析防护技术:双轨预充电、噪声注入、去耦和屏蔽。多层防护是抵抗 DPA 的关键!

获得徽章:🛡️ POWER_SHIELD

💡 扩展阅读与参考资源

🔧 实践环境搭建

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

# 安装 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!");

🔧 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

📖 推荐阅读

⚖️ 性能评估框架

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

指标单位说明
面积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!");

🔧 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

📖 推荐阅读

⚖️ 性能评估框架

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

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

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