DL-SCA/Deep-Learning-Based-Side-Channel-Attack-on-MT-TMVP

GitHub: DL-SCA/Deep-Learning-Based-Side-Channel-Attack-on-MT-TMVP

一个基于深度学习的 MT-TMVP 多项式乘法旁路攻击研究与防护验证框架。

Stars: 0 | Forks: 0

# 深度学习的MT-TMVP多项式乘法旁路攻击 本仓库包含以下论文的工程实现: 工程内容包括硬件设计、数据采集脚本、泄漏分析工具、深度学习攻击实现、防护RTL以及预计算结果。提供了复现论文中所有实验所需的一切。 ## 目录 1. [概述](#overview) 2. [工程结构](#repository-structure) 3. [环境要求](#requirements) 4. [快速入门:检查预计算结果](#quick-start-inspecting-pre-computed-results) 5. [完整复现指南](#full-replication-guide) - [步骤 1:比特流生成](#step-1-bitstream-generation) - [步骤 2:输入生成](#step-2-input-generation) - [步骤 3:迹捕获](#step-3-trace-capture) - [步骤 4:数据集验证](#step-4-dataset-verification) - [步骤 5:TVLA 泄漏评估](#step-5-tvla-leakage-assessment) - [步骤 6:DL-SCA 模型训练与评估](#step-6-dl-sca-model-training-and-evaluation) - [步骤 7:防护措施评估](#step-7-countermeasure-evaluation) 6. [预期结果](#expected-results) 7. [硬件验证](#hardware-verification) 8. [许可证](#license) ## 概述 MT-TMVP(Modular Tiled Toeplitz Matrix-Vector Product)是一种面向格基后量子密码的资源高效型多项式乘法器。本工作评估了在 Xilinx Artix-7 FPGA 上针对 NTRU(n=509, q=256, 三元私钥)实现的 Verilog MT-TMVP 实现的旁路安全性。 攻击流程包含三个阶段: 1. **泄漏检测**。TVLA 确认功率迹中存在可利用的信息泄漏。 2. **深度学习攻击**。残差 CNN 从单条功率迹中恢复私钥多项式的各个三元系数。 3. **防护措施评估**。应用三种组合硬件防护(算术掩码、随机延迟插入、哑轮计算),并重复攻击以评估防护效果。 ## 工程结构 ``` . ├── README.md # This file ├── LICENSE # MIT license ├── requirements.txt # Python dependencies ├── .gitignore │ ├── hardware/ │ ├── unprotected/ # Original MT-TMVP design │ │ ├── rtl/ │ │ │ ├── core/ # MT-TMVP arithmetic modules (6 files) │ │ │ │ ├── MatrixVectorMultiplier.v │ │ │ │ ├── TMVP2.v │ │ │ │ ├── TMVP2_main.v │ │ │ │ ├── TMVP3_main.v │ │ │ │ ├── TMVP_top.v │ │ │ │ └── dual_port_ram.v │ │ │ └── wrapper/ # CW305 board adapter │ │ │ ├── top.v │ │ │ ├── params.vh │ │ │ └── cw305/ # USB interface, CDC, clock config │ │ ├── constraints/ │ │ │ └── cw305_main.xdc │ │ └── vivado/ │ │ └── tmvp_cw305_minimal.tcl │ │ │ └── protected/ # Hardened MT-TMVP design │ ├── rtl/ │ │ ├── core/ # Modified modules + lfsr_prng.v (7 files) │ │ └── wrapper/ # Modified top.v (dummy rounds) │ ├── constraints/ │ │ └── cw305_main.xdc │ └── vivado/ │ └── tmvp_cw305_protected.tcl │ ├── software/ │ ├── generate_inputs.py # Step 2: exhaustive input generation │ ├── capture_traces.py # Step 3: power trace acquisition │ ├── verify_dataset.py # Step 4: dataset integrity checks │ ├── tvla.py # Step 5: TVLA leakage assessment │ ├── train_attack.py # Step 6: DL-SCA training and evaluation │ ├── comprehensive_analysis.py # Post-training validation │ └── evaluate_countermeasures.py # Step 7: protected design evaluation │ ├── verification/ │ ├── mt_tmvp.c # C reference (bit-identical to RTL) │ └── verify_mt_tmvp.py # Python verification against C and RTL │ └── results/ # Pre-computed results (JSON + reports) ├── unprotected/ │ └── attack_results.json ├── protected/ │ └── attack_results.json └── tvla/ └── tvla_report.md ``` **关于数据集的说明**:完整的迹数据集(59,049 条)和训练好的模型检查点由独立位置托管。请参见下方的 [数据集](#dataset) 章节。 ## 环境要求 ### 硬件(完整复现所需) | 组件 | 规格 | |---|---| | FPGA 开发板 | NewAE CW305(Xilinx Artix-7 XC7A100T) | | 采集板 | NewAE CW1173 ChipWhisperer-Lite | | 连接线 | 20 针 SMA 线连接 CW305 与 CW1173 | | 主机 PC | USB 2.0,8 GB+ 内存 | ### 软件 | 工具 | 版本 | |---|---| | Python | 3.9+ | | PyTorch | 2.0+(推荐 CUDA) | | Xilinx Vivado | 2020.2+(仅用于比特流生成) | | ChipWhisperer | 5.7+(仅用于迹捕获) | 安装 Python 依赖: ``` pip install -r requirements.txt ``` 对于 GPU 加速训练,请从 https://pytorch.org 安装对应的 PyTorch CUDA 版本。 ## 快速入门:检查预计算结果 无需硬件即可查看包含的结果。 ### 未防护实现 ``` python -c " import json with open('results/unprotected/attack_results.json') as f: d = json.load(f) print(f'Average test accuracy: {d[\"avg_test_accuracy\"]*100:.2f}%') print(f'All-correct rate: {d[\"all_correct_rate\"]*100:.2f}%') for r in d['per_coefficient']: m = r['test_metrics'] print(f' Coeff {r[\"coeff_idx\"]}: acc={m[\"accuracy\"]*100:.2f}%, F1={m[\"f1_macro\"]:.4f}') " ``` ### 防护实现 ``` python -c " import json with open('results/protected/attack_results.json') as f: d = json.load(f) print(f'Average test accuracy: {d[\"avg_test_accuracy\"]*100:.2f}%') print(f'All-correct rate: {d[\"all_correct_rate\"]*100:.2f}%') for r in d['per_coefficient']: m = r['test_metrics'] print(f' Coeff {r[\"coeff_idx\"]}: acc={m[\"accuracy\"]*100:.2f}%, F1={m[\"f1_macro\"]:.4f}') " ``` ### TVLA 报告 打开 `results/tvla/tvla_report.md` 可查看完整的泄漏评估,包括每轮测试统计、图表与解释。 ## 数据集 完整数据集位于: 包含以下项目: | 项目 | 描述 |---|--- | `dataset/traces/` | 59,049 个 `.npz` 文件(每个输入组合一个) | | `dataset/inputs/` | 预生成的 f/g 多项式、标签与预期输出 | | `models/` | 10 个训练好的 `.pth` 检查点(每个系数一个) | 每个 `.npz` 文件存储以下键值: | 键 | 形状 | 类型 | 描述 | |---|---|---|---| | `wave` | (1, 20000) | float64 | 功率迹(7.37 MHz 采样,20,000 个点) | | `labels` | (1, 10) | int64 | 三元系数标签 {-1, 0, 1} | | `dut_io_ram_f_data` | (1, 509) | int64 | 输入 f 多项式 | | `dut_io_ram_g_data` | (1, 509) | int64 | 输入 g 多项式 | | `dut_io_computed_data` | (1, 509) | int64 | 硬件输出 | ## 完整复现指南 以下步骤从比特流到最终结果完整复现实验。第 1 至 4 步需要 CW305 硬件;第 5 至 7 步可在预收集的数据集上运行。 ### 步骤 1:比特流生成 使用 Xilinx Vivado 生成 FPGA 比特流。 **未防护设计:** ``` cd hardware/unprotected/vivado vivado -mode batch -source tmvp_cw305_minimal.tcl ``` 生成 `top_cw305_a100.bit`。请将该文件下载到 CW305 中。 **防护设计:** ``` cd hardware/protected/vivado vivado -mode batch -source tmvp_cw305_protected.tcl ``` 生成 `top_cw305_protected.bit`。防护设计添加了 `lfsr_prng.v` 并修改了 `MatrixVectorMultiplier.v`(算术掩码)、`TMVP_top.v`(随机延迟)和 `top.v`(哑轮计算)。 ### 步骤 2:输入生成 生成全部 3^10 = 59,049 种三元输入组合。 ``` cd software python generate_inputs.py --output-dir ../dataset --seed 42 ``` 在 `dataset/inputs/` 中生成: - `all_f_combinations.npy` -- (59049, 509) 所有 f 多项式 - `all_g_data.npy` -- (59049, 509) 固定 g 多项式的重复 - `labels.npy` -- (59049, 10) 每个系数的三元标签 - `expected_outputs.npy` -- (59049, 509) 软件计算出的参考输出 - `config.json` -- 生成参数 随机种子(42)确保可复现。 ### 步骤 3:迹捕获 从 CW305 板卡捕获功率迹。 ``` python capture_traces.py \ --input-dir ../dataset \ --output-dir ../dataset \ --num-samples 20000 \ --gain 20.0 \ --clock 7.37e6 ``` 每条迹保存为 `dataset/traces/traces_.npz`。完整捕获 59,049 条迹大约需要 8 小时。 若需中断后恢复: ``` python capture_traces.py --input-dir ../dataset --output-dir ../dataset --resume-from 10000 ``` ### 步骤 4:数据集验证 验证捕获的数据集是否完整且正确。 ``` python verify_dataset.py --dataset ../dataset ``` 该步骤检查: - 所有 59,049 条迹文件是否存在且可加载。 - 所有迹中的 g 多项式是否一致。 - f 多项式是否与生成的组合匹配。 - 标签是否对应正确的三元值。 ### 步骤 5:TVLA 泄漏评估 运行测试向量泄漏评估以确认可利用的泄漏。 ``` python tvla.py --dataset ../dataset --output ../results/tvla --traces 1000 ``` 对每个目标系数执行 Welch t 检验(阈值 |t| > 4.5),比较按系数值分组的迹。生成每系数图表与汇总报告。 分析单个系数: ``` python tvla.py --dataset ../dataset --coefficient 0 --traces 2000 ``` ### 步骤 6:DL-SCA 模型训练与评估 训练深度残差 CNN 攻击模型。 ``` python train_attack.py \ --dataset ../dataset \ --output ../results/unprotected \ --epochs 100 \ --batch-size 256 \ --patience 15 ``` 为每个系数(共 10 个)训练一个 `DeepResidualCNN` 模型,采用 70/5/15 的训练/验证/测试划分(种子=42)。每个模型将迹分类为三元值 {-1, 0, 1}。 **模型架构:** | 层 | 输出形状 | 说明 | |---|---|---| | 输入 | (B, 1, 20000) | 原始归一化迹 | | 茎 | (B, 64, 5000) | Conv1d(1, 64, k=15)、BN、ReLU、MaxPool(4) | | ResBlock 1 + Pool | (B, 64, 1250) | 2× Conv1d(64, 64, k=7) + 残差连接、MaxPool(4) | | ResBlock 2 + Pool | (B, 64, 312) | 同上,MaxPool(4) | | ResBlock 3 + Pool | (B, 64, 78) | 同上,MaxPool(4) | | ResBlock 4 + Pool | (B, 64, 39) | 同上,MaxPool(2) | | 头 | (B, 3) | Conv1d(64, 128, k=5)、BN、ReLU、AdaptiveAvgPool(1)、Dropout(0.3)、Linear(128, 3) | **训练配置:** | 参数 | 值 | |---|---| | 优化器 | AdamW(lr=0.001,weight_decay=0.01) | | 调度器 | OneCycleLR(最大 lr=0.01,预热比例 0.1) | | 损失函数 | CrossEntropyLoss(标签平滑 0.1) | | 精度 | 混合精度(FP16,通过 torch.cuda.amp) | | 数据增强 | 高斯噪声(标准差 0.02) | | 早停 | 耐心=15,监控验证准确率 | 仅训练特定系数: ``` python train_attack.py --dataset ../dataset --output ../results/unprotected --coefficients 0 1 2 ``` 训练完成后,运行综合分析以验证结果: ``` python comprehensive_analysis.py --dataset ../dataset --results ../results/unprotected/attack_results.json ``` ### 步骤 7:防护措施评估 在防护后的设计采集的迹上评估攻击。 首先,按照步骤 2 至 4 使用防护后的 FPGA 配置采集迹。然后运行: ``` python evaluate_countermeasures.py \ --protected-dataset ../dataset_protected \ --original-dataset ../dataset \ --models-dir ../results/unprotected/models \ --original-results ../results/unprotected/attack_results.json \ --output-dir ../results/protected ``` 该步骤加载在未防护迹上训练的模型,并在防护迹上进行评估,生成对比报告。 ## 预期结果 ### 未防护实现 | 系数 | 测试准确率 (%) | F1 分数 | |---|---|---| | f[0] | 100.00 | 1.0000 | | f[1] | 99.99 | 0.9999 | | f[2] | 100.00 | 1.0000 | | f[3] | 99.99 | 0.9999 | | f[4] | 100.00 | 1.0000 | | f[5] | 100.00 | 1.0000 | | f[6] | 99.98 | 0.9998 | | f[7] | 100.00 | 1.0000 | | f[8] | 99.95 | 0.9995 | | f[9] | 100.00 | 1.0000 | | **平均** | **99.99** | **0.9999** | **全对率(ACR):99.91%**(8,858 条测试迹中 8,850 条全部系数正确) ### 防护实现 | 系数 | 测试准确率 (%) | F1 分数 | |---|---|---| | f[0] | 98.65 | 0.9864 | | f[1] | 97.64 | 0.9764 | | f[2] | 92.55 | 0.9256 | | f[3] | 95.09 | 0.9509 | | f[4] | 94.72 | 0.9470 | | f[5] | 93.99 | 0.9397 | | f[6] | 91.87 | 0.9185 | | f[7] | 93.70 | 0.9369 | | f[8] | 90.79 | 0.9077 | | f[9] | 97.64 | 0.9764 | | **平均** | **94.66** | **0.9466** | **全对率(ACR):57.94%**(较未防护下降 42 个百分点) ### TVLA 总结 | 测试 | 泄漏点数量 | 最大 |t| | 状态 | |---|---|---|---| | 随机 vs. 随机(健全性) | 0 | 3.94 | 通过 | | 固定 vs. 随机 | 2,818 | 16.53 | 泄漏 | | f 值(f[0]) | 1,543 | 17.81 | 泄漏 | | 输出字节 0 | 1,659 | 13.16 | 泄漏 | | 多字节(10 字节) | 8,803 | 15.77 | 泄漏 | | 汉明重量(g[0]) | 4,037 | 24.44 | 泄漏 | 阈值:|t| > 4.5(99.9999% 置信度)。 ### 防护措施细节 防护设计同时应用了三种措施: | 防护措施 | 目标 | 机制 | |---|---|---| | 算术掩码 | `MatrixVectorMultiplier.v` | 在 DSP 乘法前加入 LFSR 生成的随机掩码,累加后移除 | | 随机延迟 | `TMVP_top.v` | 在输入加载与计算之间插入 0 到 63 个随机等待周期 | | 哑轮计算 | `top.v` | 在真实计算前执行完整 TMVP 运算的随机数据哑轮 | **资源开销**:增加 16 个 DSP48E1 切片,延迟约增加 2 倍。 ## 硬件验证 C 语言参考实现 `verification/mt_tmvp.c` 的输出与 Verilog RTL 的输出按位一致。验证方法如下: ``` cd verification gcc -o mt_tmvp mt_tmvp.c -lm ./mt_tmvp python verify_mt_tmvp.py ``` 这确认了多项式乘法的功能正确性,与旁路测量设置无关。 ## 许可证 本项目根据 MIT 许可证发布。详见 [LICENSE](LICENSE)。
标签:CNN, FPGA, MT-TMVP, NTRU, RTL, TVLA, Verilog, Xilinx Artix-7, 侧信道分析, 侧信道攻击, 凭据扫描, 功耗分析, 单迹线攻击, 反制措施, 反取证, 可复现实验, 后量子密码, 哑运算, 多项式乘法, 学术artifact, 安全评估, 格密码, 残差网络, 泄漏分析工具, 泄漏评估, 深度学习, 深度学习攻击实现, 深度神经网络, 电力迹线, 硬件安全, 硬件掩码, 逆向工具, 随机延迟, 预计算结果