shamanthwick/pqc-tls-1.3
GitHub: shamanthwick/pqc-tls-1.3
这是一个基于 Python 的后量子 TLS 1.3 实现项目,使用 NIST 标准的 ML-KEM 和 ML-DSA 替换传统算法,并提供了详细的性能对比分析。
Stars: 0 | Forks: 0
# 🚀 Post-Quantum TLS 1.3 (PQC-TLS)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
## 📋 任务 2 目标
**开发一个采用 NIST PQC(后量子密码学)标准进行证书和密钥交换的 TLS 版本,并评估其性能。**
### 我们构建的内容
一个完整的 **Post-Quantum TLS 1.3** 实现,具有以下特点:
- ✅ 使用 **ML-KEM-768** (CRYSTALS-Kyber) 替换 X25519 进行密钥交换
- ✅ 使用 **ML-DSA-65** (CRYSTALS-Dilithium) 替换 ECDSA/RSA 进行签名
- ✅ 评估性能:延迟、带宽、安全级别
- ✅ 对比经典 TLS 与后量子 TLS
### 需求
1. ✅ 从 [tls13.xargs.org](https://tls13.xargs.org) 获取现有的 TLS 1.3 实现
2. ✅ 使用 **NIST PQC 标准** 替换经典密码学:
- **密钥交换**:CRYSTALS-Kyber (ML-KEM)
- **签名**:CRYSTALS-Dilithium (ML-DSA) 或 SPHINCS+ (SLH-DSA)
3. ✅ 评估性能:
- 延迟对比
- 通信开销(密钥/证书大小)
- 安全级别(经典 vs. 后量子)
## 🎯 NIST PQC 标准
2024 年 8 月,NIST 确定了首批后量子密码学标准:
| 算法 | 标准 | 用途 | 安全级别 |
|-----------|----------|---------|----------------|
| **ML-KEM** (CRYSTALS-Kyber) | FIPS 203 | 密钥封装 | Level 3/5 |
| **ML-DSA** (CRYSTALS-Dilithium) | FIPS 204 | 数字签名 | Level 2/3/5 |
| **SLH-DSA** (SPHINCS+) | FIPS 205 | 数字签名(备份) | Level 1/3/5 |
### 为什么选择这些算法?
- **ML-KEM**:速度快,密钥小 - 非常适合密钥交换
- **ML-DSA**:主要签名标准 - 验证效率高
- **SLH-DSA**:保守的备份方案 - 基于哈希函数(非常保守的安全性)
## 🏗️ 项目架构
```
┌─────────────────────────────────────────────────────────┐
│ Classical TLS 1.3 │
│ - X25519 Key Exchange │
│ - RSA/ECDSA Signatures │
│ - AES-GCM / ChaCha20 Encryption │
└─────────────────────────────────────────────────────────┘
↓
[REPLACE CRYPTO]
↓
┌─────────────────────────────────────────────────────────┐
│ Post-Quantum TLS 1.3 │
│ - ML-KEM (Kyber) Key Exchange │
│ - ML-DSA (Dilithium) Signatures │
│ - AES-GCM / ChaCha20 Encryption (unchanged) │
└─────────────────────────────────────────────────────────┘
↓
[PERFORMANCE EVAL]
↓
┌─────────────────────────────────────────────────────────┐
│ Comparison Report │
│ - Latency: Classical vs. PQC │
│ - Bandwidth: Key sizes, certificate sizes │
│ - Security: 128-bit vs. 256-bit quantum security │
└─────────────────────────────────────────────────────────┘
```
## 🚀 快速开始
### 步骤 1:安装依赖
```
# 安装 PQCrypto 库
pip install pqcrypto
# 对于 Kyber (ML-KEM)
pip install kyber
# 对于 Dilithium (ML-DSA)
pip install dilithium
# 对于 SPHINCS+ (SLH-DSA)
pip install sphincs
# TLS 和加密工具
pip install cryptography pyopenssl
```
### 步骤 2:运行 PQC-TLS 演示
```
# 运行经典 TLS 1.3 (baseline)
python src/classic_tls.py
# 运行后量子 TLS 1.3
python src/pqc_tls.py
# 运行性能比较
python src/performance_eval.py
```
### 步骤 3:查看结果
```
# 查看性能比较
cat results/performance_comparison.md
# 查看详细指标
cat results/metrics.json
```
## 📊 TLS 1.3 握手流程
### 经典 TLS 1.3 (X25519 + RSA/ECDSA)
```
Client Server
| |
|--- Client Hello (X25519 key share) ----------->|
| |
|<-- Server Hello (X25519 key share) ------------|
|<-- [Encrypted] Certificate (RSA/ECDSA) --------|
|<-- [Encrypted] Certificate Verify -------------|
|<-- [Encrypted] Server Finished ----------------|
| |
|--- [Encrypted] Client Finished ---------------->|
|--- [Encrypted] Application Data --------------->|
```
### 后量子 TLS 1.3 (ML-KEM + ML-DSA)
```
Client Server
| |
|--- Client Hello (Kyber key share) ------------>|
| |
|<-- Server Hello (Kyber key share) -------------|
|<-- [Encrypted] Certificate (Dilithium) --------|
|<-- [Encrypted] Certificate Verify (ML-DSA) ----|
|<-- [Encrypted] Server Finished ----------------|
| |
|--- [Encrypted] Client Finished ---------------->|
|--- [Encrypted] Application Data --------------->|
```
## 🔐 密码学替换方案
| TLS 组件 | 经典方案 | 后量子方案 | 标准 |
|---------------|-----------|--------------|----------|
| **密钥交换** | X25519 (ECDH) | ML-KEM-768 (Kyber-768) | FIPS 203 |
| **签名** | RSA-2048 / ECDSA P-256 | ML-DSA-65 (Dilithium-3) | FIPS 204 |
| **备份签名** | - | SLH-DSA-128s (SPHINCS+-128s) | FIPS 205 |
| **加密** | AES-256-GCM | AES-256-GCM(保持不变) | - |
| **哈希** | SHA-384 | SHA-384(保持不变) | - |
## 📈 性能指标
### 密钥大小对比
| 算法 | 公钥大小 | 私钥大小 | 密文/签名 |
|-----------|-----------------|------------------|---------------------|
| **X25519** | 32 字节 | 32 字节 | - |
| **ML-KEM-768** | 1,184 字节 | 2,400 字节 | 1,088 字节 |
| **RSA-2048** | 256 字节 | 256 字节 | 256 字节(签名) |
| **ML-DSA-65** | 1,952 字节 | 4,032 字节 | 3,309 字节(签名) |
| **ECDSA P-256** | 64 字节 | 32 字节 | 64 字节(签名) |
### 安全级别
| 算法 | 经典安全性 | 量子安全性 |
|-----------|-------------------|------------------|
| **X25519** | 128 位 | 64 位 |
| **ML-KEM-768** | 256 位 | 128 位 |
| **RSA-2048** | 112 位 | 0 位 |
| **ML-DSA-65** | 256 位 | 128 位 |
### 预期性能影响
| 指标 | 经典 TLS | PQC-TLS | 开销 |
|--------|---------------|---------|----------|
| **握手延迟** | ~50ms | ~70-100ms | +40-100% |
| **Client Hello 大小** | ~300 字节 | ~1,500 字节 | +400% |
| **证书大小** | ~2 KB | ~5-10 KB | +150-400% |
| **签名验证** | ~1ms | ~5-10ms | +400-900% |
## 📁 项目结构
```
Task2-PQC-TLS/
├── src/
│ ├── classic_tls.py ← Classical TLS 1.3 implementation
│ ├── pqc_tls.py ← Post-quantum TLS 1.3 implementation
│ ├── kyber_kem.py ← ML-KEM key encapsulation
│ ├── dilithium_sig.py ← ML-DSA signatures
│ ├── sphincs_sig.py ← SLH-DSA signatures (backup)
│ ├── certificate.py ← X.509 certificate generation
│ ├── performance_eval.py ← Performance comparison
│ └── utils.py ← Helper functions
├── tests/
│ ├── test_kyber.py
│ ├── test_dilithium.py
│ └── test_tls_handshake.py
├── results/
│ ├── performance_comparison.md
│ ├── metrics.json
│ └── latency_graph.png
├── references/
│ ├── nist_pqc_standards.pdf
│ └── tls13_spec.pdf
├── README.md ← This file
└── TASK2_REPORT.md ← Detailed technical report
```
## 🔬 实现细节
### 1. ML-KEM 密钥封装 (Kyber)
```
from pqcrypto.kem.kyber768 import generate_keypair, encapsulate, decapsulate
# 服务器生成密钥对
public_key, private_key = generate_keypair()
# 客户端封装密钥
ciphertext, shared_secret_client = encapsulate(public_key)
# 服务器解封装密钥
shared_secret_server = decapsulate(private_key, ciphertext)
# 双方现在共享相同的密钥
assert shared_secret_client == shared_secret_server
```
### 2. ML-DSA 签名 (Dilithium)
```
from pqcrypto.signature.dilithium3 import generate_keypair, sign, verify
# 生成签名密钥对
public_key, private_key = generate_keypair()
# 签署证书
signature = sign(private_key, certificate_data)
# 验证签名
is_valid = verify(public_key, certificate_data, signature)
```
### 3. 带有 PQC 的 X.509 证书
```
# 证书结构 (X.509 v3)
certificate = {
"version": "v3",
"serial_number": "...",
"signature_algorithm": "ML-DSA-65",
"issuer": "CN=PQC Server",
"validity": {...},
"subject": "CN=tls13.server",
"subject_public_key_info": {
"algorithm": "ML-DSA-65",
"public_key": dilithium_public_key # 1,952 bytes
},
"extensions": {...},
"signature": dilithium_signature # 3,309 bytes
}
```
## 📖 参考资料
1. **TLS 1.3 Demo**: https://tls13.xargs.org
2. **NIST PQC Standards**: https://www.nist.gov/news-events/news/2024/08/nist-releases-first-3-finalized-post-quantum-encryption-standards
3. **Let's Encrypt Certificates**: https://letsencrypt.org
4. **FIPS 203 (ML-KEM)**: https://csrc.nist.gov/pubs/fips/203/final
5. **FIPS 204 (ML-DSA)**: https://csrc.nist.gov/pubs/fips/204/final
6. **FIPS 205 (SLH-DSA)**: https://csrc.nist.gov/pubs/fips/205/final
## 📬 提交信息
- **课程:** Formal Verification of Security Protocols
- **机构:** IIT Roorkee
- **教师:** Prof. Raghvendra Singh Rohit
- **任务:** Task 2 - Post-Quantum TLS 1.3
- **许可证:** MIT License
**Made with ❤️ for Formal Verification at IIT Roorkee**
标签:CRYSTALS-Dilithium, CRYSTALS-Kyber, CVE, FIPS 203, FIPS 204, FIPS 205, IIT Roorkee, MIT协议, ML-DSA, ML-KEM, NIST PQC, Python, SPHINCS+, TLS 1.3, 后量子密码学, 密码学, 密钥交换, 带宽分析, 延迟测试, 形式化验证, 性能评估, 手动系统调用, 抗量子计算, 数字签名, 无后门, 网络安全, 逆向工具, 隐私保护