# vhxt-sse **Repository Path**: wish168/vhxt-sse ## Basic Information - **Project Name**: vhxt-sse - **Description**: VHXT-SSE为"Volume Hiding Conjunctive Searchable Symmetric Encryption over Cloud" 中的 VHXT方案。VHXT 是同时支持合取查询和容量隐藏的高效可搜索对称加密 (SSE) 方案。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-03-13 - **Last Updated**: 2026-03-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # VHXT-SSE - 容量隐藏可搜索加密方案 ## 项目简介 **VHXT-SSE** 实现了论文 "Volume Hiding Conjunctive Searchable Symmetric Encryption over Cloud" 中的 **VHXT** 方案。VHXT 是首个同时支持**合取查询**和**容量隐藏**的高效可搜索对称加密 (SSE) 方案。 ## 核心问题 在加密数据库系统中,传统方案会泄露**每个关键词匹配多少文档**。攻击者可利用这些"容量信息"推断查询内容。 **VHXT 解决方案**: - 通过**固定长度位图索引**隐藏第一阶段查询结果数量 - 通过**私有集合交集协议** 安全执行第二阶段过滤 - 服务器无法获知查询返回的真实结果数量 ## 方案架构 ### 两阶段查询流程 ``` 查询:关键词 "隐私 AND 安全 AND 加密" (按频率排序,选最低频词作为第一阶段查询词) ┌─────────────────────────────────────────────────┐ │ 第一阶段:获取包含"隐私"的所有文档 │ │ 技术:固定长度位图索引(所有位图长度相同) │ │ 结果:返回 50 个候选文档(服务器不知道真实数量) │ └─────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────┐ │ 第二阶段:过滤出同时包含"安全"和"加密"的文档 │ │ 技术:私有集合交集协议(2 轮通信) │ │ 结果:最终返回 3 个匹配文档 │ └─────────────────────────────────────────────────┘ ``` ### 核心组件 | 组件 | 功能 | 如何隐藏信息 | |------|------|----------| | **BitmapIndex** | 创建/解析固定长度位图 | 所有位图长度 = 文档总数 | | **BitmapTSet** | 盲化位图索引 | 使用 PRF/PRG 生成掩码异或位图 | | **XSet** | (文档 ID, 关键词) 绑定标签集合 | PRF 输出,对服务器是随机字节 | | **LaconicPSI** | 2 轮私有集合交集协议 | 服务器无法得知交集大小 | | **VHXTEngine** | 完整查询引擎 | 整合所有组件 | ### Client/Server 交互流程 ``` ┌──────────────────────────────────────────────────────────────────┐ │ 索引构建阶段 │ ├──────────────────────────────────────────────────────────────────┤ │ 客户端 服务器 │ │ │ │ │ │ │ 1. 构建加密索引 │ │ │ │ - 为每个关键词创建位图 │ │ │ │ - 使用密钥盲化位图 │ │ │ │ - 生成 (文档 ID, 关键词) 标签 │ │ │ │ │ │ │ │ ───── 2. 发送盲化数据 ──────────> │ │ │ │ (盲化位图,标签集合) │ │ │ │ │ 3. 存储盲化数据 │ │ │ │ (无法解密/理解) │ │ │ │ 4. 初始化 PSI 协议 │ │ │ │ (预处理标签集合) │ └────│───────────────────────────────────│─────────────────────────┘ │ │ │ │ ┌────│───────────────────────────────────│─────────────────────────┐ │ │ 查询阶段 (第一阶段) │ ├────│───────────────────────────────────│─────────────────────────┤ │ │ │ │ │ │ 5. 生成搜索 token │ │ │ │ stag = PRF(密钥,关键词) │ │ │ │ │ │ │ │ ───── 6. 发送 stag ────────────> │ │ │ │ │ 7. 查找对应的盲化位图 │ │ │ │ (服务器不知道查的是什么)│ │ │ <──── 8. 返回盲化位图 ────────────│ │ │ │ │ │ │ │ 9. 解盲位图 │ │ │ │ 明文位图 = 盲化位图 ⊕ 掩码 │ │ │ │ 提取文档 ID 集合 │ │ │ │ │ │ └────│───────────────────────────────────│─────────────────────────┘ │ │ │ │ ┌────│───────────────────────────────────│─────────────────────────┐ │ │ 查询阶段 (第二阶段 - PSI) │ ├────│───────────────────────────────────│─────────────────────────┤ │ │ │ │ │ │ 10. 为每个 (文档 ID, 关键词) │ │ │ │ 计算标签 xtag │ │ │ │ │ │ │ │ 11. 生成 PSI 查询参数 │ │ │ │ 对每个 xtag 计算 (query_beta, │ │ │ │ query_gamma) │ │ │ │ │ │ │ │ ─── 12. 发送 PSI 查询参数 ───────> │ │ │ │ (看起来像随机大整数) │ 13. 验证查询参数 │ │ │ │ 检查是否存在预计算值 │ │ │ │ 使得 query_beta^z * │ │ │ │ query_gamma ≡ 1 │ │ │ <── 14. 返回匹配索引 ─────────────│ │ │ │ │ │ │ │ 15. 根据匹配索引确定最终文档 │ │ │ │ 文档必须匹配所有关键词 │ │ └────│───────────────────────────────────│─────────────────────────┘ ``` ## 项目结构 ``` SecureText/ ├── docs/ # 文档 │ └── volume_hiding_summary.md # 算法中文说明 ├── src/ │ ├── algorithms/ # 核心算法实现 │ │ ├── bitmap.py # 固定长度位图 │ │ ├── bitmap_tset.py # 盲化位图索引 │ │ ├── xset.py # 交叉标签集合 │ │ ├── psi.py # 私有集合交集协议 │ │ ├── crypto.py # 密码学原语 (PRF/PRG) │ │ ├── client_engine.py # 客户端引擎 │ │ ├── server_store.py # 服务端存储 │ │ └── engine.py # 完整查询引擎 │ ├── benchmark/ # Client/Server 模拟 + 测试 │ │ ├── client.py # 客户端角色 │ │ ├── server.py # 服务端角色 │ │ ├── comparison.py # 对比测试 │ │ ├── runner.py # 演示入口 │ │ └── output.py # 结果输出 │ └── data/ │ └── data.txt # 内置测试数据集 ├── results/ # 测试结果 ├── requirements.txt └── README.md ``` ## 快速开始 ### 安装依赖 ```bash pip install -r requirements.txt ``` ### 基本使用 ```python from src.algorithms import VHXTEngine # 准备关键词到文档 ID 的映射 keyword_doc_mapping = { 'blockchain': {0, 1, 2, 5, 8}, 'security': {0, 2, 3, 7}, 'privacy': {1, 3, 4, 6}, } # 初始化引擎 engine = VHXTEngine(security_param=256) engine.setup(keyword_doc_mapping, num_docs=10) # 单关键词查询 result = engine.search(['blockchain']) print(f"匹配文档:{result}") # 输出:{0, 1, 2, 5, 8} # 合取查询:查找同时包含 'blockchain' 和 'security' 的文档 result = engine.search(['blockchain', 'security']) print(f"匹配文档:{result}") # 输出:{0, 2} ``` ### 运行演示模式 演示模式显示详细的 Client/Server 交互日志: ```bash python -c "from src.benchmark import run_demo; run_demo()" ``` 输出示例: ``` [Client] 本地构建加密索引... [Client] TSet 条目数:20 [Client] XSet 条目数:45 [Server] 使用来自客户端的盲化数据进行 Setup... [Server] Setup 完成,耗时 12.34 ms [Client] 为关键词 '隐私' 生成搜索 token... [Client] 发送查询到服务器... [Server] 收到查询 token: a3f5b2c1... [Server] 返回盲化位图:13 字节 [Client] 解密位图 (13 字节)... [Client] 开始 PSI 协议,50 个候选文档,2 个其他关键词 [Client] 计算 100 个 xtag [Client] PSI 交集大小:3 [Client] PSI 完成,最终结果:3 个文档 ``` ### 运行完整性能测试 ```bash python -c "from src.benchmark import run_all_benchmarks; run_all_benchmarks()" ``` 测试结果保存到 `results/` 目录: ``` results/ └── 2026-03-13/ └── run_01/ ├── raw/ │ ├── comparison_results.csv │ └── storage_overhead.csv ├── charts/ │ └── comparison_chart.txt └── summary.txt ``` ### 使用内置数据集 项目内置了一个包含 20 个中文关键词的测试数据集(100 个文档): ```python from src.benchmark.comparison import load_test_data # 加载数据集 data = load_test_data() # 关键词示例: # 个人信息、数据加密、隐私保护、身份认证 # 访问控制、安全审计、数据脱敏、权限管理 # ... 共 20 个隐私安全相关关键词 print(f"数据库:100 个文档,{len(data)} 个关键词") ``` 数据集文件位于 `src/data/data.txt`(JSON 格式)。 ### 清理旧数据 ```bash # Windows rmdir /s /q results # Linux/macOS rm -rf results ``` ## 核心算法说明 ### 1. 固定长度位图 (BitmapIndex) 将每个关键词的文档列表映射为**相同长度**的位图: ```python # 位图长度 = (文档总数 + 7) // 8 字节 # 位为 0 表示包含该文档,1 表示不包含(反相表示) bitmap = BitmapIndex(num_docs=100) doc_ids = {0, 5, 23, 99} # 创建位图 bitmap_bytes = bitmap.create_bitmap(doc_ids) # 解析位图 extracted_ids = bitmap.extract_doc_ids(bitmap_bytes) ``` **隐藏原理**:所有关键词的位图长度相同,服务器无法从位图大小推断文档数量。 ### 2. 盲化位图 (BitmapTSet) 使用 PRF 和 PRG 对位图进行盲化: ``` 步骤: 1. 生成搜索 token: stag = PRF(密钥,关键词) 2. 生成掩码:mask = PRG(stag) # 长度与位图相同 3. 盲化:盲化位图 = 掩码 XOR 位图 4. 存储:(stag, 盲化位图) 解盲: 位图 = 盲化位图 XOR 掩码 # XOR 的自反性 ``` **隐藏原理**:服务器存储的位图已被随机掩码盲化,无法得知真实内容。 ### 3. 私有集合交集协议 (LaconicPSI) 高效的 2 轮私有集合交集协议: ``` 服务端(离线预处理): - 选择秘密值 secret_a, secret_b - 计算公开参数 public_h1 = g^secret_a, public_h2 = g^secret_b - 对每个元素计算验证值 verify_value 客户端(在线查询): - 对每个元素 xi,选择随机数 random_s - 计算查询参数: query_beta = public_h1^random_s query_gamma = g^random_s * public_h2^(元素哈希 * random_s) 服务端(响应): - 对每个 (query_beta, query_gamma) 检查: query_beta^verify_value * query_gamma ≡ 1 (mod p) - 返回匹配的索引 验证原理: 当元素匹配时,数学推导保证等式成立。 ``` **隐藏原理**:服务器只能判断是否匹配,无法得知交集大小和具体元素。 ### 4. 泄露分析 VHXT 的泄露函数为 `L = (N, |W|, EP)`: | 泄露项 | 含义 | 说明 | |--------|------|------| | N | 关键词 - 文档对总数 | 系统全局参数 | | |W| | 关键词总数 | 索引大小 | | EP | 共享最低频关键词的查询 | 相同最低频词的查询可关联 | **不泄露**: - 每个关键词匹配的文档数量 - 单次查询的结果数量 - 查询的关键词内容 ## 性能特点 | 特性 | VHXT | |------|------| | 合取查询 | 支持 | | 通信轮数 | 4 轮(第一阶段 2 轮 + 第二阶段 2 轮) | | 计算复杂度 | O(关键词数 × 第一阶段候选文档数) | | 容量隐藏 | 支持 | | 索引隐私 | 支持 | ## 安全假设 - **DDH 假设**(判定性 Diffie-Hellman 困难性) - **PRF/PRG 安全性**(伪随机函数/生成器不可区分) - **对称加密 IND-CPA 安全性** ## 技术栈 - **Python 3.12+** - **标准库**: hashlib, secrets, dataclasses(核心算法仅依赖标准库) - **可选**: numpy, matplotlib, pandas, seaborn(用于性能测试可视化) ## 参考资料 1. 论文原文:`docs/Volume Hiding_new.pdf` 2. 算法说明:`docs/volume_hiding_summary.md` ## 许可证 MIT License --- **VHXT-SSE Lab** | 2026