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, 安全评估, 格密码, 残差网络, 泄漏分析工具, 泄漏评估, 深度学习, 深度学习攻击实现, 深度神经网络, 电力迹线, 硬件安全, 硬件掩码, 逆向工具, 随机延迟, 预计算结果