# Decentralized Self-auditing Multiple Cloud Storage in Compressed Provable Data Possession **Repository Path**: alan223/decentralized-self-auditing-multiple-cloud-storage-in-compressed-provable-data-possession ## Basic Information - **Project Name**: Decentralized Self-auditing Multiple Cloud Storage in Compressed Provable Data Possession - **Description**: 实验代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-07-11 - **Last Updated**: 2025-08-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### **关于《去中心化自审计多云存储压缩可证明数据持有》协议的复现与分析实验报告** **摘要**: 本报告详述了对论文《Decentralized Self-auditing Multiple Cloud Storage in Compressed Provable Data Possession》所提出协议的复现过程。实验旨在通过Go语言对该协议进行工程实现,以验证其理论上的安全性、正确性和高效性。在复现过程中,我遇到了从理论理解到工程实现的诸多挑战,包括对协议数学前提的忽视、对论文潜在印刷错误的分析,以及对密码学协议实现中代数一致性的严格要求。通过系统化的调试和对底层数学原理的反复推敲,本实验最终成功复现了一个能够通过所有验证的、功能完备的协议实现,并对协议的成立条件和实现细节得出了深刻的洞见。 #### **1. 引言** ##### **1.1 背景** 随着云计算的普及,数据外包存储已成为主流。为避免单点故障,用户倾向于将数据副本存储在多个云服务提供商(CSP)处。然而,数据一旦离手,其完整性便面临风险。传统的第三方审计者(TPA)方案虽然能解决问题,但引入了新的中心化风险。因此,能够让云服务商之间相互进行数据完整性审计的去中心化方案具有重要研究价值。 ##### **1.2 实验目的** 本实验的核心目的在于: 1. **复现协议**: 利用Go语言及其`math/big`库,忠实地实现论文中提出的去中心化自审计协议。 2. **验证可行性**: 检验协议在模拟环境下的正确性,包括正常流程下的完整性验证和数据被篡改后的检测能力。 3. **分析挑战**: 记录并分析在将密码学理论转化为工程代码过程中遇到的问题、挑战及其解决方案。 4. **深化理解**: 通过实践,加深对可证明数据持有(PDP)方案、特别是该协议独特的`floor`函数近似技巧和实现细节的理解。 #### **2. 协议核心原理概述** 该协议的精妙之处在于其“压缩”特性,即无需为数据块存储额外的认证标签。它通过一个特殊的加密函数 `y_ki = a(x_i+H₁) + (bx_i+H₂)` 将验证信息嵌入加密值中。审计时,各CSP根据收到的挑战生成部分证明`Γ_k`,并聚合为完整证明`Γ`。验证依赖于以下方程和关键假设: * **验证方程**: $ \Lambda_1 \cdot g^{(\Gamma - floor(\Gamma/a) \cdot a)} = \Lambda_2 \cdot g^{b \cdot floor(\Gamma/a)} \pmod p $ * **核心假设**: $ \sum_k \sum_l e_l (b x_{i_l} + H_2) < a $ 在核心假设成立的前提下,`floor(Γ/a)` 可以近似恢复出聚合的数据块信息,而 `Γ - floor*a` 则可以近似恢复出聚合的认证信息,从而使验证方程两边经过代数运算后能够相等。 #### **3. 实验环境与实现** * **编程语言**: Go 1.x * **核心库**: `math/big` 用于高精度整数运算,`crypto/rand` 和 `crypto/sha256` 用于密码学操作。 * **代码结构**: 项目采用模块化设计,分为 `system`(定义公共参数)、`entities`(实现Data Owner和CSP实体)和 `main.go`(驱动实验流程)三个部分。 --- #### **4. 复现过程中的挑战与解决方案** 将该协议从理论论文转化为可工作的工程代码过程中遭遇了多个层面的障碍 ##### **阶段一:工具选型的重大弯路——从`pbc`库到`big.Int`的回归** * **挑战**: 密码学协议通常构建于抽象代数的“群”之上。初步分析时,我认为使用专业的密码学库(如Go语言的`pbc`封装)来实现底层的循环群运算,是比手动操作大整数更标准、更安全的选择。我投入了大量精力,试图将协议中的乘法群 `Z_p*` 映射到 `pbc` 库提供的椭圆曲线加法群 `G1` 上。 * **遇到的障碍与解决方案**: 在重构过程中,我遇到了一个无法逾越的鸿沟:协议的核心验证方程包含 `floor(Γ/a)` 这一项。该操作要求证明 `Γ` 是一个可以进行整数除法的元素。然而,在椭圆曲线群中,元素是曲线上的一个点(由坐标 `(x, y)` 定义),对其进行“除法”运算在代数上是无意义的。这一发现让我意识到: 1. **协议的特殊性**: 该协议被特殊设计用于模 `p` 的整数乘法群 `Z_p*`,其元素本身就是整数,可以进行`floor`运算。 2. **工具的错配**: `pbc` 库虽然强大,但它是为标准椭圆曲线和配对密码学设计的,是解决这个特定问题的**错误工具**。 **最终决策**: 我果断放弃了在`pbc`库上的所有工作,回归到使用Go语言标准库 `math/big` 的方向。这个重大的方向调整,虽然耗费了前期的大量时间,但却是走向成功的必要一步,让我深刻理解到,**并非所有密码学协议都能直接套用在通用的椭圆曲线框架上,必须深刻理解其底层的数学结构**。 ##### **阶段二:对核心前提条件的忽视与强制执行** * **挑战**: 回归到 `big.Int` 实现后,验证依然失败。我意识到,协议的整个 `floor` 近似技巧,完全建立在一个不等式之上: $ Y = \sum_k \sum_l e_l (b x_{i_l} + H_2) < a $。在最初的实现中,我仅仅通过设置参数的比特长度来“期望”这个条件能够成立,但从未在代码中进行确定性的检查。 * **工作量与解决方案**: 为了解决这个问题,我对数据所有者(Data Owner)的 `RequestAudit` 模块进行了重大重构: 1. **引入检查机制**: 我增加了一个核心循环,在每次随机生成一组权重 `e_l` 后,都会完整地计算出 `Y` 的精确值。 2. **与 `a` 比较**: 将计算出的 `Y` 与公开参数 `a` 进行比较。 3. **重试与容错**: 如果 `Y >= a`,则当前这组权重被视为无效,循环会丢弃它们并重新生成一组新的随机权重,直到找到满足条件的组合为止。我还加入了重试次数上限,以防止在参数设置不合理时陷入无限循环。 这一步确保了协议的数学前提在每一次审计中都得到了严格的、程序化的保证,是协议能够正确工作的基础。 ##### **阶段三:推导验证方程确定理论可行性** * **挑战**: 即使强制执行了 `Y < a` 的前提,验证仍然失败。这迫使我怀疑验证方程本身或其组件的定义。我以“验证方程(4)必须成立”为公理,进行了严谨的、符号化的代数反推。 * **工作量与解决方案**: 1. **代数推导**: 我将 `y_ki` 的定义、`floor(Γ/a)` 和 `Γ - floor*a` 的近似值全部代入验证方程,并展开所有项。 ##### **阶段四:解决代数一致性与参数的终极调整** * **挑战**: 在修正了上述所有问题后,验证依然失败。最终,通过对代码中每一个大整数的计算路径进行逐行调试,我发现了最后一个、也是最隐蔽的错误:**代数不一致性**。在之前的某个版本中,我在计算`y_ki`的组件时和计算`Λ₁`、`Λ₂`的指数求和时,对`mod q`和`mod (p-1)`的使用不统一,导致从`Γ`中“恢复”出的值与为`Λ`独立计算的值在数值上无法匹配。 * **工作量与解决方案**: 1. **统一计算逻辑**: 我重构了 `EncryptFile` 和 `RequestAudit` 函数,确保所有用于最终验证的聚合值(`Y`的检查、`h1_sum`、`h2_sum`)都遵循完全相同的计算规则:**组件源自 `Z_q`,聚合过程为标准大整数运算,仅在最后一步为指数取模 `p-1`**。 2. **参数的最终调整**: 日志显示,即使逻辑完全正确,`Y < a` 的重试次数也过多甚至失败。这表明我对参数大小的估计依然不足。我最终确定了 $ Y \approx K \cdot L \cdot q^3 $ 的量级,并据此大幅增加了 `q'`(`a`的来源)的比特长度(从256位增加到511位),使其严格满足 $ q \ll q' < p $,为 `a` 提供了足够的安全边界。 #### **5. 实验结果与分析** 在应用了上述所有修正后,实验取得了成功。 * **正常流程**: 在数据完好的情况下,所有CSP均能成功通过验证。日志显示,LHS和RHS的值完美匹配,证明了我最终实现的正确性。 * **数据篡改**: 在手动篡改了某个CSP的一个加密数据块后,审计验证失败。日志显示,篡改后的LHS和RHS值不再相等,表明协议能够有效检测到数据的微小变动。 #### **6. 结论** 本实验成功地复现并验证了论文提出的去中心化自审计协议。这个过程不仅是一次简单的代码翻译,更是一次对密码学协议从理论到实践的深度探索。我揭示了该协议成立背后隐藏的复杂前提和实现细节,并通过解决一系列挑战,最终构建了一个功能完备且正确的系统。 ---