QSP是一个基于格密码学的综合性安全系统,专注于提供抗量子计算攻击的加密通信、身份认证和资产保护功能。该系统利用格密码的抗量子特性,结合P2P网络、可靠UDP和Shamir秘密共享,项目由暨南大学杨昊文、熊逸航完成。
| 姓名/昵称 | GitHub ID | 贡献内容 | 联系方式 |
|---|---|---|---|
| 熊逸航 | ARS4EVER | 代码编写、测试维护、漏洞修复 | [email protected] |
| 杨昊文 | amonadam | 项目架构、代码编写、测试维护 | [email protected] |
- 后量子密码标准 - 100% 遵守 NIST FIPS 203 (Kyber512) 和 FIPS 204 (Dilithium2) 标准
- 安全握手 - 基于
Dilithium Sign(Kyber_Ciphertext)混合架构,完美抵御中间人攻击 (MITM) - 极简业务流 -
REQ-RESP单轮交互,配合 JSON 序列化和 AES-GCM,实现高吞吐量 - 无缝 Shamir 门限 - 数据容灾由业务层
Splitter/Reconstructor接管,密码层与业务层完全解耦 - 本地加密与离线验证 - 基于 PBKDF2HMAC 和 AES-256-GCM 的透明加密,防范物理设备被攻破
- 邀请码瘦身 - 采用公钥指纹验证机制,大幅减少邀请码大小,提升传输效率
- NAT 穿透 - 支持 UDP 打洞和心跳保活,实现真正的去中心化 P2P 连接
- 可靠 UDP - 集成 SACK 和拥塞控制,提供接近 TCP 的可靠性和 UDP 的低延迟
QSP提供以下核心功能:
- ✅ 抗量子加密:使用 NIST 标准的 Kyber 和 Dilithium 算法
- ✅ P2P 网络通信:支持 NAT 穿透和 UDP 打洞
- ✅ Shamir 秘密共享:将文件分割成多份,需要指定数量的份额才能恢复
- ✅ 本地金库加密:使用 AES-256-GCM 保护本地数据
QSP-main/
├── GUI/
│ └── main_window.py # 现代化 GUI 界面
├── data/
│ ├── keys/ # 身份密钥 (AES-256-GCM 加密存储)
│ │ ├── node_identity.dat # 加密的节点身份文件
│ │ ├── .vault_salt # 密钥派生盐值
│ │ └── .vault_verifier # 密码验证器
│ ├── shares/ # 资产份额和清单
│ │ ├── {文件哈希}_share_X.dat
│ │ └── .qsp_identity.pem # 节点身份证书
│ └── restored/ # 恢复的资产
│ └── recovered_{文件名}
├── image/ # 图像资源
│ └── logo.jpg # 项目 Logo
├── src/
│ ├── app/ # 应用层 (Phase 10)
│ │ ├── app_protocol.py # 应用层消息协议
│ │ ├── app_router.py # 应用层消息路由
│ │ ├── backup_manager.py # 资产备份管理器
│ │ ├── recovery_manager.py # 资产恢复管理器
│ │ ├── ui_bridge.py # UI 桥接器
│ │ └── vault_crypto.py # 本地金库加密引擎
│ ├── core/ # 核心协议层
│ │ ├── challenge_auth.py # 挑战认证协议
│ │ ├── messages.py # 协议消息定义
│ │ ├── recovery_host.py # 恢复主机逻辑
│ │ └── recovery_participant.py # 恢复参与者逻辑
│ ├── crypto_lattice/ # 格密码模块 (Phase 1)
│ │ ├── wrapper.py # 统一适配器 (ML-DSA + ML-KEM)
│ │ ├── keygen.py # 密钥生成
│ │ ├── signer.py # 标准签名器 (DilithiumSigner)
│ │ └── encryptor.py # 密钥封装 (KyberKEM)
│ ├── network/ # 网络通信模块 (Phase 2)
│ │ ├── secure_channel.py # 安全通道
│ │ ├── secure_link.py # 安全链接 (含心跳)
│ │ ├── p2p_manager.py # P2P 管理
│ │ ├── rudp.py # 可靠 UDP
│ │ ├── protocol.py # 通信协议
│ │ └── congestion.py # 拥塞控制
│ ├── secret_sharing/ # 秘密共享模块
│ │ ├── splitter.py # Shamir 分割器
│ │ ├── reconstructor.py # Shamir 重构器
│ │ └── gf256.py # GF(256) 有限域运算
│ ├── utils/ # 工具函数
│ │ ├── data_handler.py # 数据处理工具
│ │ └── logger.py # 日志工具
│ └── config.py # 全局配置
├── tests/ # 测试代码目录
├── main.py # 主程序入口
├── requirements.txt # 依赖包列表
└── README.md # 本文档
pip install -r requirements.txt# 运行所有核心测试
python -m unittest discover tests -v
# 运行特定模块测试
python -m unittest tests.test_wrapper tests.test_keygen_phase2 tests.test_signer_phase2 tests.test_encryptor_phase2 tests.test_config_phase2 tests.test_secure_channel_phase2 tests.test_holepunch_phase5 tests.test_p2p_multiplexing tests.test_rudp_sack tests.test_congestion_phase4 tests.test_secure_link_phase6 tests.test_keepalive_phase8 tests.test_vault_encryption_phase10 tests.test_large_file_streaming tests.test_recovery_streaming_phase7 tests.test_app_protocol tests.test_app_protocol_phase2 tests.test_app_router tests.test_c10_two_way_auth tests.test_c4_c9_security tests.test_c8_challenge_auth tests.test_c8_clock_sync_replay tests.test_c8_phases3_4 tests.test_c9_typo_detection tests.test_ui_sync_phase5 tests.test_integration_final -vpython main.py-
抗量子安全
- NIST FIPS 203 ML-KEM-512 (Kyber512)
- NIST FIPS 204 ML-DSA-44 (Dilithium2)
-
身份认证
- Dilithium 标准签名
- 公钥指纹验证
- 中间人攻击拦截
-
数据加密
- AES-256-GCM
- 前向安全性
- 本地金库加密
-
门限容灾
- Shamir Secret Sharing
- (t, n) 门限方案
- 流式重构
-
网络安全
- UDP 打洞和 NAT 穿透
- 可靠 UDP 与 SACK
- 延迟梯度拥塞控制
- 心跳保活机制
- Python 3.9+
- dilithium-py
- kyber-py
- cryptography
- numpy
- customtkinter
- pillow
- 操作系统:Windows / macOS / Linux
- Python 版本:3.9 或更高
- 网络:需要互联网连接(用于 P2P 通信)
打开终端/命令提示符,运行:
python --version确保显示 Python 3.9+。
在项目目录下运行:
pip install -r requirements.txt如果遇到 pip 启动器错误(如 "Fatal error in launcher"),使用:
python -m pip install -r requirements.txt运行主程序:
python main.py启动后,会弹出一个对话框,要求输入本地金库主密码:
- 这个密码用于加密本地存储的敏感数据
- 请牢记此密码!(如果忘记,本地数据将无法恢复)
- 如果不输入,系统会使用默认密码(不推荐)
系统采用 NIST FIPS 204 ML-DSA-44 (Dilithium) 数字签名算法实现身份认证:
- 身份生成:基于格密码学的后量子签名密钥对,公钥大小 1312 字节,私钥 2528 字节
- 身份验证:采用公钥指纹验证机制,有效缩小证书体积,提升验证效率
- 挑战-响应协议:实现双向认证流程,防止中间人攻击(MITM)
- 身份存储:通过 PBKDF2HMAC-SHA256 密钥派生,结合 AES-256-GCM 加密本地身份凭证
技术特点:
- 基于模块格上的短整数解(SIS)问题,抗量子计算攻击
- 签名大小约 2420 字节,安全强度等价于 AES-128
- 支持确定性与概率性签名生成
- 本地身份文件加密存储于 data/keys/node_identity.dat
采用创新的 公钥指纹 + 网络坐标 邀请码机制:
- 邀请码结构:包含节点 ID、公钥哈希、公网 IP 和端口信息
- 安全发现:通过 STUN 服务器获取公网坐标,支持 IPv4/IPv6 双栈
- 身份验证:建立连接前验证 Dilithium 签名,确保节点身份真实性
- 轻量传输:邀请码体积压缩,便于在多种渠道传输
通信通道建立采用 NIST FIPS 203 ML-KEM-512 (Kyber) 密钥封装算法:
- 密钥交换:Kyber512 封装机制,公钥 800 字节,密文 768 字节
- 前向保密:每次会话生成新的密钥材料,确保历史通信安全
- 完美前向保密:长期密钥泄露不影响已建立会话的安全性
- 实现细节:模块格上的学习带误差(MLWE)问题提供量子安全保障
应用层数据传输采用认证加密算法:
- 加密算法:AES-256-GCM 提供机密性、完整性和认证性
- 认证标签:128 位认证标签,防止消息篡改
- 随机 Nonce:96 位 Nonce,确保密文不可预测性
- 数据分片:大文件分片传输,提高传输可靠性
自定义传输层协议实现可靠数据传输:
- 选择性确认 (SACK):基于 SACK 机制的重传策略,减少冗余数据传输
- 延迟梯度拥塞控制:Hybrid 混合拥塞控制算法,结合延迟梯度与丢包率
- 心跳保活:周期性心跳检测,维护连接状态
- 乱序重组:支持数据包乱序到达与重组
性能指标:
- 支持最大 1400 字节 MTU
- 拥塞窗口动态调整,适应网络变化
- 丢包率小于 0.1% 时吞吐量接近 TCP
数据容灾基于 Shamir's Secret Sharing 算法:
- 数学基础:GF(256) 有限域上的多项式插值
- 门限参数:(t, n) 方案,t 为恢复门限,n 为参与者总数
- 查表加速:预计算 GF(256) 乘法/加法表,提升性能 10 倍以上
- 信息论安全:少于 t 个份额无法获取任何明文信息
完整的备份流程包含以下步骤:
- 文件加密:首先使用 AES-256-GCM 加密源文件
- 秘密分割:将加密后的文件分割为 n 个份额
- 份额签名:每个份额使用 Dilithium 私钥签名,确保完整性
- 分发存储:通过 P2P 网络将份额分发至已连接节点
- 清单生成:生成包含元数据的清单文件,用于恢复
安全特性:
- 每个份额独立加密存储
- 支持任意大小文件的流式处理
- 进度实时反馈与断点续传
数据恢复流程实现多方协同:
- 清单导入:读取元数据清单,确定所需份额数量
- 网络寻呼:向 P2P 网络广播份额请求
- 份额验证:验证每个收到份额的 Dilithium 签名
- 秘密重构:收集 ≥ t 个有效份额,通过拉格朗日插值重构原始文件
- 完整性校验:重构后验证文件哈希值
容错能力:
- 最多可容忍 n - t 个节点失效
- 支持网络节点动态加入/退出
- 份额来源不可预测,提升安全性
本地敏感数据采用金库式加密保护:
- 密钥派生:PBKDF2HMAC-SHA256,迭代次数 100000+
- 盐值管理:随机生成 16 字节盐值,存储于 data/keys/.vault_salt
- 验证机制:派生验证哈希,存储于 data/keys/.vault_verifier
- 加密模式:AES-256-GCM 认证加密,提供完整性保证
- 防暴力破解:高迭代次数的密钥派生,显著增加破解难度
- 防篡改:GCM 模式提供认证标签,数据被篡改可立即检测
- 零知识验证:密码验证过程不暴露任何密码相关信息
- 数据隔离:敏感数据与普通数据存储隔离
实现完整的 NAT 穿透方案:
- STUN 协议:会话遍历 UDP NAT,获取公网映射地址
- 打洞流程:双向同时发送探测包,建立 UDP 会话
- NAT 类型:支持 Full Cone、Restricted Cone、Port Restricted Cone、Symmetric NAT
- 心跳保活:维持 NAT 端口映射,防止会话超时
- 去中心化:无中心服务器的P2P 网络架构
- 动态发现:支持节点动态加入与离开
- 连接复用:单端口多连接,支持多路复用
- 状态监控:实时连接状态监控与自动重连
A: 使用 python -m pip 代替 pip,例如:
python -m pip install -r requirements.txt如果想永久修复,可以重新安装 pip:
python -m pip install --upgrade --force-reinstall pipA: 很遗憾,本地金库密码无法找回。你需要:
- 删除
data/keys/目录下的密钥文件 - 删除
data/shares/目录下的份额文件 - 重新启动应用,设置新密码
⚠️ 注意:之前本地存储的数据将无法恢复
A: 请检查:
- 对方节点是否在线
- 邀请码是否正确(完整复制,不要有多余空格)
- 网络是否允许 UDP 通信(某些防火墙可能阻止)
- 双方是否都在同一版本的系统上
A: 可能原因:
- 存储份额的节点不在线
- 网络连接问题
- 检查清单文件是否正确
- 尝试等待更长时间,或联系更多节点上线
A: 系统支持任何类型的文件:
- 文档(.docx, .pdf, .txt 等)
- 图片(.jpg, .png, .gif 等)
- 视频和音频文件
- 压缩包(.zip, .rar 等)
- 任意二进制文件
文件大小建议:虽然系统支持大文件,但建议单个文件不超过 1GB 以获得最佳性能。
A: 系统通过多层加密保护:
- 传输层:Kyber 密钥交换 + AES-256-GCM 加密
- 身份认证:Dilithium 数字签名
- 存储层:本地金库 AES-256-GCM 加密
- 容灾层:Shamir 秘密共享,即使部分节点丢失也能恢复
A: 不建议。每个节点应该有独立的身份:
- 身份文件存储在
data/keys/node_identity.dat(AES-256-GCM 加密) - 如果需要在多台设备使用,可以复制此文件(但存在安全风险)
- 更好的方式是让每台设备生成独立身份,然后互相连接
如遇到其他问题,请检查:
- Python 版本是否符合要求
- 所有依赖是否正确安装
- 网络连接是否正常
- 防火墙设置是否允许 UDP 通信
如需调整高级参数,可编辑 src/config.py:
| 参数类 | 参数 | 说明 | 默认值 |
|---|---|---|---|
| ThresholdParams | n_participants | 默认总节点数 | 5 |
| ThresholdParams | t | 默认恢复门限 | 3 |
| NetworkParams | MTU | 网络最大传输单元 | 1400 |
| NetworkParams | HANDSHAKE_TIMEOUT | 握手超时(秒) | 5.0 |
| NetworkParams | RTO_INITIAL | 重传超时初始值(秒) | 0.2 |
- 提交 Bug 报告 - 发现问题请提交 Issue
- 提交功能建议 - 有好的想法欢迎讨论
- 提交代码 - 修复 Bug 或添加新功能
- 改进文档 - 帮助完善使用文档
- 推广宣传 - 分享给更多人使用
欢迎提出改进意见 ✨

