Skip to content

amonadam/QSP

Repository files navigation

QSP Logo

QSP

基于PQC的抗量子秘密文件共享与传输系统

GitHub License GitHub release Tech Report Demo


探索本项目的文档 »

报告Bug · 提出新特性

目录

  1. 项目简介
  2. 系统概述
  3. 系统架构
  4. 项目结构
  5. 核心模块详解
  6. 快速开始
  7. 测试覆盖
  8. 安全特性
  9. 技术依赖
  10. 环境准备
  11. 安装与启动
  12. 核心功能使用
  13. 常见问题

项目简介

QSP是一个基于格密码学的综合性安全系统,专注于提供抗量子计算攻击的加密通信、身份认证和资产保护功能。该系统利用格密码的抗量子特性,结合P2P网络、可靠UDP和Shamir秘密共享,项目由暨南大学杨昊文、熊逸航完成。

贡献者

姓名/昵称 GitHub ID 贡献内容 联系方式
熊逸航 ARS4EVER 代码编写、测试维护、漏洞修复 [email protected]
杨昊文 amonadam 项目架构、代码编写、测试维护 [email protected]

功能特性

  1. 后量子密码标准 - 100% 遵守 NIST FIPS 203 (Kyber512) 和 FIPS 204 (Dilithium2) 标准
  2. 安全握手 - 基于 Dilithium Sign(Kyber_Ciphertext) 混合架构,完美抵御中间人攻击 (MITM)
  3. 极简业务流 - REQ-RESP 单轮交互,配合 JSON 序列化和 AES-GCM,实现高吞吐量
  4. 无缝 Shamir 门限 - 数据容灾由业务层 Splitter/Reconstructor 接管,密码层与业务层完全解耦
  5. 本地加密与离线验证 - 基于 PBKDF2HMAC 和 AES-256-GCM 的透明加密,防范物理设备被攻破
  6. 邀请码瘦身 - 采用公钥指纹验证机制,大幅减少邀请码大小,提升传输效率
  7. NAT 穿透 - 支持 UDP 打洞和心跳保活,实现真正的去中心化 P2P 连接
  8. 可靠 UDP - 集成 SACK 和拥塞控制,提供接近 TCP 的可靠性和 UDP 的低延迟

系统概述

QSP提供以下核心功能:

  • 抗量子加密:使用 NIST 标准的 Kyber 和 Dilithium 算法
  • P2P 网络通信:支持 NAT 穿透和 UDP 打洞
  • Shamir 秘密共享:将文件分割成多份,需要指定数量的份额才能恢复
  • 本地金库加密:使用 AES-256-GCM 保护本地数据

整体框架

framework


项目结构

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                 # 本文档

快速开始

1. 安装依赖

pip install -r requirements.txt

2. 运行测试

# 运行所有核心测试
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 -v

3. 运行系统

python main.py

安全特性

  1. 抗量子安全

    • NIST FIPS 203 ML-KEM-512 (Kyber512)
    • NIST FIPS 204 ML-DSA-44 (Dilithium2)
  2. 身份认证

    • Dilithium 标准签名
    • 公钥指纹验证
    • 中间人攻击拦截
  3. 数据加密

    • AES-256-GCM
    • 前向安全性
    • 本地金库加密
  4. 门限容灾

    • Shamir Secret Sharing
    • (t, n) 门限方案
    • 流式重构
  5. 网络安全

    • UDP 打洞和 NAT 穿透
    • 可靠 UDP 与 SACK
    • 延迟梯度拥塞控制
    • 心跳保活机制

技术依赖

  • Python 3.9+
  • dilithium-py
  • kyber-py
  • cryptography
  • numpy
  • customtkinter
  • pillow

环境准备

系统要求

  • 操作系统:Windows / macOS / Linux
  • Python 版本:3.9 或更高
  • 网络:需要互联网连接(用于 P2P 通信)

检查 Python 版本

打开终端/命令提示符,运行:

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

第三步:设置本地金库密码

启动后,会弹出一个对话框,要求输入本地金库主密码

  • 这个密码用于加密本地存储的敏感数据
  • 请牢记此密码!(如果忘记,本地数据将无法恢复)
  • 如果不输入,系统会使用默认密码(不推荐)

核心功能

功能一:身份管理与身份认证

1.1 抗量子身份生成与验证

系统采用 NIST FIPS 204 ML-DSA-44 (Dilithium) 数字签名算法实现身份认证:

  • 身份生成:基于格密码学的后量子签名密钥对,公钥大小 1312 字节,私钥 2528 字节
  • 身份验证:采用公钥指纹验证机制,有效缩小证书体积,提升验证效率
  • 挑战-响应协议:实现双向认证流程,防止中间人攻击(MITM)
  • 身份存储:通过 PBKDF2HMAC-SHA256 密钥派生,结合 AES-256-GCM 加密本地身份凭证

技术特点

  • 基于模块格上的短整数解(SIS)问题,抗量子计算攻击
  • 签名大小约 2420 字节,安全强度等价于 AES-128
  • 支持确定性与概率性签名生成
  • 本地身份文件加密存储于 data/keys/node_identity.dat

1.2 邀请码机制与网络发现

采用创新的 公钥指纹 + 网络坐标 邀请码机制:

  • 邀请码结构:包含节点 ID、公钥哈希、公网 IP 和端口信息
  • 安全发现:通过 STUN 服务器获取公网坐标,支持 IPv4/IPv6 双栈
  • 身份验证:建立连接前验证 Dilithium 签名,确保节点身份真实性
  • 轻量传输:邀请码体积压缩,便于在多种渠道传输

功能二:抗量子安全通信

2.1 ML-KEM-512 密钥封装机制

通信通道建立采用 NIST FIPS 203 ML-KEM-512 (Kyber) 密钥封装算法:

  • 密钥交换:Kyber512 封装机制,公钥 800 字节,密文 768 字节
  • 前向保密:每次会话生成新的密钥材料,确保历史通信安全
  • 完美前向保密:长期密钥泄露不影响已建立会话的安全性
  • 实现细节:模块格上的学习带误差(MLWE)问题提供量子安全保障

2.2 AES-256-GCM 安全通道

应用层数据传输采用认证加密算法:

  • 加密算法:AES-256-GCM 提供机密性、完整性和认证性
  • 认证标签:128 位认证标签,防止消息篡改
  • 随机 Nonce:96 位 Nonce,确保密文不可预测性
  • 数据分片:大文件分片传输,提高传输可靠性

2.3 可靠 UDP (RUDP) 传输协议

自定义传输层协议实现可靠数据传输:

  • 选择性确认 (SACK):基于 SACK 机制的重传策略,减少冗余数据传输
  • 延迟梯度拥塞控制:Hybrid 混合拥塞控制算法,结合延迟梯度与丢包率
  • 心跳保活:周期性心跳检测,维护连接状态
  • 乱序重组:支持数据包乱序到达与重组

性能指标

  • 支持最大 1400 字节 MTU
  • 拥塞窗口动态调整,适应网络变化
  • 丢包率小于 0.1% 时吞吐量接近 TCP

功能三:分布式秘密共享与数据容灾

3.1 Shamir (t, n) 门限方案

数据容灾基于 Shamir's Secret Sharing 算法:

  • 数学基础:GF(256) 有限域上的多项式插值
  • 门限参数:(t, n) 方案,t 为恢复门限,n 为参与者总数
  • 查表加速:预计算 GF(256) 乘法/加法表,提升性能 10 倍以上
  • 信息论安全:少于 t 个份额无法获取任何明文信息

3.2 分布式备份流程

完整的备份流程包含以下步骤:

  1. 文件加密:首先使用 AES-256-GCM 加密源文件
  2. 秘密分割:将加密后的文件分割为 n 个份额
  3. 份额签名:每个份额使用 Dilithium 私钥签名,确保完整性
  4. 分发存储:通过 P2P 网络将份额分发至已连接节点
  5. 清单生成:生成包含元数据的清单文件,用于恢复

安全特性

  • 每个份额独立加密存储
  • 支持任意大小文件的流式处理
  • 进度实时反馈与断点续传

3.3 多方恢复机制

数据恢复流程实现多方协同:

  1. 清单导入:读取元数据清单,确定所需份额数量
  2. 网络寻呼:向 P2P 网络广播份额请求
  3. 份额验证:验证每个收到份额的 Dilithium 签名
  4. 秘密重构:收集 ≥ t 个有效份额,通过拉格朗日插值重构原始文件
  5. 完整性校验:重构后验证文件哈希值

容错能力

  • 最多可容忍 n - t 个节点失效
  • 支持网络节点动态加入/退出
  • 份额来源不可预测,提升安全性

功能四:本地金库加密

4.1 密码派生与加密机制

本地敏感数据采用金库式加密保护:

  • 密钥派生:PBKDF2HMAC-SHA256,迭代次数 100000+
  • 盐值管理:随机生成 16 字节盐值,存储于 data/keys/.vault_salt
  • 验证机制:派生验证哈希,存储于 data/keys/.vault_verifier
  • 加密模式:AES-256-GCM 认证加密,提供完整性保证

4.2 安全特性

  • 防暴力破解:高迭代次数的密钥派生,显著增加破解难度
  • 防篡改:GCM 模式提供认证标签,数据被篡改可立即检测
  • 零知识验证:密码验证过程不暴露任何密码相关信息
  • 数据隔离:敏感数据与普通数据存储隔离

功能五:P2P 网络与 NAT 穿透

5.1 UDP 打洞技术

实现完整的 NAT 穿透方案:

  • STUN 协议:会话遍历 UDP NAT,获取公网映射地址
  • 打洞流程:双向同时发送探测包,建立 UDP 会话
  • NAT 类型:支持 Full Cone、Restricted Cone、Port Restricted Cone、Symmetric NAT
  • 心跳保活:维持 NAT 端口映射,防止会话超时

5.2 网络架构

  • 去中心化:无中心服务器的P2P 网络架构
  • 动态发现:支持节点动态加入与离开
  • 连接复用:单端口多连接,支持多路复用
  • 状态监控:实时连接状态监控与自动重连

常见问题

Q1: pip 安装依赖时出现 "Fatal error in launcher" 错误?

A: 使用 python -m pip 代替 pip,例如:

python -m pip install -r requirements.txt

如果想永久修复,可以重新安装 pip:

python -m pip install --upgrade --force-reinstall pip

Q2: 忘记本地金库密码怎么办?

A: 很遗憾,本地金库密码无法找回。你需要:

  1. 删除 data/keys/ 目录下的密钥文件
  2. 删除 data/shares/ 目录下的份额文件
  3. 重新启动应用,设置新密码
  4. ⚠️ 注意:之前本地存储的数据将无法恢复

Q3: 连接其他节点失败?

A: 请检查:

  1. 对方节点是否在线
  2. 邀请码是否正确(完整复制,不要有多余空格)
  3. 网络是否允许 UDP 通信(某些防火墙可能阻止)
  4. 双方是否都在同一版本的系统上

Q4: 恢复时收集不到足够的份额?

A: 可能原因:

  1. 存储份额的节点不在线
  2. 网络连接问题
  3. 检查清单文件是否正确
  4. 尝试等待更长时间,或联系更多节点上线

Q5: 支持哪些文件类型?

A: 系统支持任何类型的文件:

  • 文档(.docx, .pdf, .txt 等)
  • 图片(.jpg, .png, .gif 等)
  • 视频和音频文件
  • 压缩包(.zip, .rar 等)
  • 任意二进制文件

文件大小建议:虽然系统支持大文件,但建议单个文件不超过 1GB 以获得最佳性能。

Q6: 如何确保安全性?

A: 系统通过多层加密保护:

  1. 传输层:Kyber 密钥交换 + AES-256-GCM 加密
  2. 身份认证:Dilithium 数字签名
  3. 存储层:本地金库 AES-256-GCM 加密
  4. 容灾层:Shamir 秘密共享,即使部分节点丢失也能恢复

Q7: 可以在多台设备上使用同一身份吗?

A: 不建议。每个节点应该有独立的身份:

  • 身份文件存储在 data/keys/node_identity.dat(AES-256-GCM 加密)
  • 如果需要在多台设备使用,可以复制此文件(但存在安全风险)
  • 更好的方式是让每台设备生成独立身份,然后互相连接

技术支持

如遇到其他问题,请检查:

  1. Python 版本是否符合要求
  2. 所有依赖是否正确安装
  3. 网络连接是否正常
  4. 防火墙设置是否允许 UDP 通信

附录:配置参数说明

如需调整高级参数,可编辑 src/config.py

参数类 参数 说明 默认值
ThresholdParams n_participants 默认总节点数 5
ThresholdParams t 默认恢复门限 3
NetworkParams MTU 网络最大传输单元 1400
NetworkParams HANDSHAKE_TIMEOUT 握手超时(秒) 5.0
NetworkParams RTO_INITIAL 重传超时初始值(秒) 0.2

欢迎任何形式的贡献!

  1. 提交 Bug 报告 - 发现问题请提交 Issue
  2. 提交功能建议 - 有好的想法欢迎讨论
  3. 提交代码 - 修复 Bug 或添加新功能
  4. 改进文档 - 帮助完善使用文档
  5. 推广宣传 - 分享给更多人使用

欢迎提出改进意见

About

一款基于格密码的数字资产保护系统

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages