raghavpathak30/Timing-attack-dss
GitHub: raghavpathak30/Timing-attack-dss
一个展示 DSS 模运算时间侧信道攻击原理的 Python 教育模拟项目,演示非恒定时间实现如何通过统计分析泄露私钥。
Stars: 0 | Forks: 0
# Timing-attack-dss
一个基于 Python 的模拟项目,演示针对 DSS 风格模运算的时间侧信道攻击。展示了非恒定时间实现在噪声条件下如何通过统计相关性分析泄露私钥。
## 目录
- [概述](#overview)
- [漏洞原理](#vulnerability-explained)
- [攻击步骤](#attack-steps)
- [项目结构](#project-structure)
- [安装说明](#setup-instructions)
- [使用方法](#usage)
- [示例输出](#example-output)
- [现实影响](#real-world-implications)
- [参考资料](#references)
## 概述
**数字签名标准 (DSS)** ——以及类似的基于离散对数的方案——要求签名者计算:
```
s = k⁻¹ · (H(m) + x · r) mod q
```
其中 `x` 是长期 **私钥**。如果底层模运算是通过朴素方式实现的(例如,使用减法循环而不是恒定时间归约),那么循环迭代的次数——以及执行时间——就会泄露关于 `x` 的信息。
本项目将该漏洞提炼为核心操作:
```
result = (x · r) mod q
```
并一步步展示了能够收集时间测量的攻击者,如何利用 Pearson 相关性分析 **完全恢复私钥**。
## 漏洞原理
### 泄露操作
一个朴素的模归约如下所示:
```
value = x * r
while value >= q: # each iteration takes measurable time
value -= q
```
**迭代次数**恰好为 `floor(x · r / q)`。该数值与 `x` 相关:对于较大的 `x`,乘积 `x · r` 较大,因此需要更多的减法,操作耗时更长。
### 为何这很重要
能够测量执行时间(例如,通过网络延迟、缓存状态、功耗或直接计时)的攻击者,可以利用这些测量值重建私钥,即使在存在现实噪声的情况下也能实现。
### 恒定时间替代方案
安全的实现使用内置的 `%` 运算符(或无分支的 Montgomery 归约),无论输入如何,其运行时间都是恒定的,从而消除了泄露通道。
## 攻击步骤
攻击分五个步骤进行:
1. **收集时间测量数据。** 对许多随机 nonce `r ∈ [1, q)` 运行易受攻击的操作,并记录每次的执行时间。加入现实的高斯噪声以模拟硬件抖动。
2. **构建预测模型。** 对于每个密钥候选 `x_guess`,计算预测的迭代次数:
predicted_cost(x_guess, r) = floor(x_guess · r / q)
3. **计算 Pearson 相关性。** 对于每个 `x_guess`,计算所有 `N` 个样本中预测成本向量与观测时间向量之间的 Pearson 相关系数。
4. **选择最佳候选。** 最大化绝对相关性的 `x_guess` 即为恢复出的密钥。当猜测正确时,预测完美地模拟了泄露的计算,从而产生接近 1.0 的相关性。
5. **报告与可视化。** 打印恢复出的密钥,与真实值进行核对,并绘制时间分布和相关性图景。
## 项目结构
```
timing-attack-dss/
│
├── attack.py # Main attack script (CLI entry point)
├── utils.py # Cryptographic simulation & dataset utilities
├── visualize.py # Histogram and correlation plots
│
├── dataset/
│ └── sample_data.csv # Generated timing dataset (5 000 samples)
│
├── plots/
│ ├── timing_histogram.png # Timing distribution plot
│ └── correlation_vs_guesses.png # Correlation landscape plot
│
├── requirements.txt # Python dependencies
└── README.md
```
## 安装说明
### 前置条件
- Python 3.9 或更高版本
### 安装
```
# Clone the repository
git clone https://github.com/raghavpathak30/Timing-attack-dss.git
cd Timing-attack-dss
# 安装依赖
pip install -r requirements.txt
```
## 使用方法
### 使用默认设置运行
```
python attack.py
```
生成 5 000 个时间样本,对所有 65 520 个密钥候选运行完整的相关性扫描,打印恢复出的密钥,并保存两张图表。
### 命令行选项
```
usage: attack.py [-h] [--key-bits BITS] [--samples N] [--noise STD]
[--q Q] [--save-dataset PATH] [--load-dataset PATH]
[--no-plot] [--quiet] [--normalize-timing]
options:
--key-bits BITS Approximate key-space bit-length (default: 16)
--samples N Number of timing samples to generate (default: 5000)
--noise STD Gaussian noise std-dev in ns (default: 5.0)
--q Q Override the group order prime q (default: 65521)
--save-dataset PATH Path to save the generated dataset CSV
--load-dataset PATH Load an existing dataset instead of generating
--no-plot Skip generating visualisation plots
--quiet Suppress progress output
--normalize-timing Normalize timing values before correlation
```
### 示例
```
# 针对更难噪声环境的 Larger dataset
python attack.py --samples 10000 --noise 20.0
# 使用 pre-generated dataset
python attack.py --load-dataset dataset/sample_data.csv
# Minimal output,无图表
python attack.py --no-plot --quiet
```
## 示例输出
```
[*] Generated secret key: 35645 (keep this secret!)
[+] Dataset saved → dataset/sample_data.csv (5000 samples)
============================================================
DSS Timing Side-Channel Attack
============================================================
Group order q : 65521
Dataset size : 5000 samples
True secret key : 35645
============================================================
[+] Timing histogram saved → plots/timing_histogram.png
[*] Testing 65520 key candidates …
[+] Recovered key : 35645
[+] Actual key : 35645
[+] Status : SUCCESS
[+] Best |corr| : 1.000000
[+] Correlation plot saved → plots/correlation_vs_guesses.png
============================================================
Attack Complete
============================================================
Actual key : 35645
Recovered key : 35645
Status : SUCCESS
============================================================
```
### 生成的图表
| 时间分布 | 相关性图景 |
|---|---|
| `plots/timing_histogram.png` | `plots/correlation_vs_guesses.png` |
直方图显示了由可变长度归约循环导致的非均匀(双峰/偏斜)时间分布。相关性图显示在实际密钥值处有一个尖锐的峰值。
## 现实影响
### 历史漏洞利用
| CVE / 攻击 | 系统 | 年份 |
|---|---|---|
| [Kocher 时间攻击](https://www.paulkocher.com/doc/TimingAttacks.pdf) | RSA / DH | 1996 |
| OpenSSL RSA 时间攻击 (CVE-2003-0147) | OpenSSL | 2003 |
| Lucky Thirteen (CVE-2013-0169) | TLS CBC-MAC | 2013 |
| [Minerva](https://minerva.crocs.fi.muni.cz/) | ECDSA (智能卡) | 2019 |
| [TPM-FAIL](https://tpm.fail/) | TPM 2.0 ECDSA | 2019 |
### 为何这在今天很重要
1. **通过远程测量恢复密钥** ——即使是网络级计时(配合统计平均)也可能足以破解非恒定时间实现。
2. **侧信道弹性很难** ——编译器、CPU 和缓存即使在“已修复”的代码中也可能重新引入非恒定时间行为。
3. **形式化验证** ——诸如 ct-verif 和 Jasmin 等工具现在被用于在汇编级别 *证明* 恒定时间行为。
### 缓解措施
- 使用恒定时间算术库(例如 `libsodium`、`BoringSSL`)。
- 避免在加密代码中出现依赖于数据的分支和内存访问。
- 作为最后的手段,添加虚假操作或随机延迟(盲化)。
- 使用静态分析工具审计加密代码。
## 参考资料
- Kocher, P. (1996). *Timing Attacks on Implementations of Diffie-Hellman, RSA, DSS, and Other Systems.*
- Brumley, D. & Boneh, D. (2005). *Remote Timing Attacks Are Practical.*
- FIPS 186-5. *Digital Signature Standard (DSS)*. NIST, 2023.
- Bernstein, D. J. (2005). *Cache-timing attacks on AES.*
标签:DSS, meg, Python, 主机安全, 仿真模拟, 侧信道攻击, 信号处理, 信息安全, 安全测试, 密码学, 密码管理, 密钥恢复, 手动系统调用, 攻击性安全, 教育演示, 数字签名安全, 无后门, 时序攻击, 模运算, 相关分析, 算法安全, 统计攻击, 网络安全, 逆向工具, 隐私保护, 隐私泄露, 隐私计算, 非恒定时间