jozef-sabo/bachelor-thesis-side-channel-attacks
GitHub: jozef-sabo/bachelor-thesis-side-channel-attacks
针对掩码标量乘法的分治侧信道攻击的 Python 实现,含迹生成器与四种优化变体,用于学术研究与实验。
Stars: 0 | Forks: 0
# 针对掩码标量乘法的侧信道攻击 — 源码重组实现
本仓库包含了 accompanies 学士论文*纠正侧信道攻击中的错误*(马萨里克大学,信息学院,2026)的源代码。它使用源码重组的方式,通过 Python 重新实现了 Roche、Imbert 和 Lomné 提出的分治侧信道攻击(CARDIS 2019),同时包含了四种拟定的优化方案以及一个支持参数化配置的迹生成器。
## 功能介绍
给定掩码标量 `d_l = r_l · E + d` 的多次带噪声观测值,其中 `E` 是结构形式为 `E = 2^K − E_0` 的椭圆曲线的阶(例如 secp256k1),该算法通过对掩码因子 `r_l` 的候选前缀进行 beam search,来逐位恢复出密钥标量 `d`。
## 仓库结构
```
algorithm/
article_algo.py # cleanroom baseline (Roche–Imbert–Lomné attack)
elliptic_curves.py # curve definitions (secp256k1, P-256, Curve25519, ...)
numbers_generator.py # CLI tool for generating synthetic noisy traces
improved_algorithm/
calibrated_error_rate_algo.py # ε_e calibration
boundary_retention_algo.py # inclusive / capped boundary retention
multi_bit_search_window_effective_guess_window_algo.py # multi-bit lookahead
traces/ # pre-generated trace datasets (.pkl)
```
## 环境要求
- Python 3.10+
- NumPy(仅用于 `numbers_generator.py --original` 模式下的迹生成)
```
pip install numpy
```
无其他第三方依赖——攻击本身仅使用标准库运行。
## 生成迹
```
cd algorithm
python numbers_generator.py secp256k1 10000 traces.pkl \
--error-rate 15 \
--multiplier-bits 64
```
参数:
| 参数 | 描述 |
|---|---|
| `curve` | `secp256k1`、`secp256r1`、`P256`、`W25519`、`Curve25519`、`Edwards25519` 中的一个 |
| `count` | 要生成的迹的数量 |
| `out_file` | 输出的 pickle 文件 |
| `-e, --error-rate` | 以整数百分比表示的比特错误率(默认为 `15`) |
| `-m, --multiplier-bits` | 掩码因子长度 `R`(默认为 `64`) |
| `-o, --original` | 使用原论文中的迹生成方法(正态分布阈值处理 + 受限的 `r` 区间),而不是均匀的伯努利噪声 |
## 运行基准攻击
```
from algorithm.article_algo import run_dataset
bits_recovered = run_dataset(
file_path="traces.pkl",
N=10000, # number of traces to use
L=32, # candidate-list size
t=16, # evaluation window size
)
print(bits_recovered)
```
该函数返回在监督式提前终止准则下,`d` 在出现第一个错误位之前正确恢复的最低有效位的数量。
## 运行优化变体
每个优化变体都暴露了一个 `run_dataset`,它具有与基准相同的参数,并额外包含其特有的调节参数。
**校准后的错误率** — 覆盖 `evaluate_probability` 内部假定的比特错误率:
```
from improved_algorithm.calibrated_error_rate_algo import run_dataset
run_dataset("traces.pkl", N=10000, L=32, t=16, error_rate_set=22) # ε_e = 0.22
```
**包含边界的保留策略** — 保留在截断边界处并列的候选者:
```
from improved_algorithm.boundary_retention_algo import run_dataset
run_dataset(
"traces.pkl", N=10000, L=32, t=16,
rs_with_same_prob_at_border="keep", # "keep" | "remove" | "not_touch"
three_fourths=False, # True enables the 7L/4 cap
)
```
**带有可选非对称提交的多比特搜索窗口**:
```
from improved_algorithm.multi_bit_search_window_effective_guess_window_algo import run_dataset
run_dataset(
"traces.pkl", N=10000, L=32, t=16,
d_add_window=4, # w_d — search window width
d_widening_window=4, # w_de — commitment window (≤ w_d)
)
```
## 迹文件格式
每个 `.pkl` 文件都是一个 Python 字典,包含以下字段:
| 键 | 描述 |
|---|---|
| `curve_size` | 曲线比特长度 `K` |
| `E` | 曲线阶 |
| `d` | 真实的密钥标量(用于监督评估) |
| `multiplier_size` | 掩码因子长度 `R` |
| `error_rate` | 比特错误率(整数百分比) |
| `blinded_with_errors` | 包含 `N` 个带噪声的掩码标量 `d̃_l` 的列表 |
| `multipliers` | 包含真实掩码因子 `r_l` 的列表 |
| `error_vectors` | 包含真实错误向量 `ε_l` 的列表 |
## 许可证
基于 MIT 许可证发布。详情请参阅 `LICENSE`。
标签:Python, 侧信道攻击, 学术研究, 密码学, 手动系统调用, 无后门, 椭圆曲线密码学, 逆向工具