标准模型下的可分电子现金
1. 可分电子现金的定义
电子现金方案涉及银行(B)、众多用户(U)和商家(M,可视为特殊用户)。这些参与方通过以下协议进行交互:
-
CashSetup(λ)
:以安全参数 λ 为输入,输出公共参数 params。
-
BankKG(params, L)
:生成银行的公共和秘密参数 (skB, pkB),使银行能发行价值为 2L 的钱包(假设 L 是 pkB 的一部分),同时定义一个空数据库 DBB 供后续使用。
-
UserKG(params)
:生成用户密钥对 (skU, pkU),用 HU 表示诚实生成的公钥集合。
-
Withdraw
:用户 U 和银行 B 之间的交互协议,允许诚实用户获取价值为 2L 的硬币。钱包 W 包含硬币、用户的私钥、银行的签名和一些状态信息 state。银行从用户账户扣款,并在数据库 T 中存储追踪信息 TW,用于揭露双花者的身份。
-
Spend
:用户 U 调用此协议花费钱包中价值为 2ℓ 的硬币,并生成硬币有效的证明 Π。输出包含证明 Π 的硬币和指定交易的新公共信息 info。
-
VerifyCoin
:允许商家 M 检查给定硬币的有效性,并根据验证结果输出一个比特值。
-
Deposit
:银行 B 使用 {(coin, flag, 2ℓ)} 更新数据库 DBB,其中 flag 表示硬币是否为价值 2ℓ 的有效硬币,以及是否检测到作弊尝试。
- 如果硬币验证失败,银行拒绝并将 flag 设置为 “M”,表示作弊商家。
- 如果硬币验证通过,银行运行双花检测算法,若检测到超额花费,将 flag 设置为 “U”,输出两枚硬币并报告双花情况。
- 如果硬币通过所有测试,银行接受硬币,将 flag 设置为 “accept” 并向商家账户充值。
-
Identify
:银行使用数据库 DBB 和两枚不同的硬币检索双花者的公钥 pkU。
1.1 安全模型
电子现金方案安全需同时具备正确性、匿名性、平衡性、可识别性和免责性。
-
匿名性
:采用基于模拟的匿名性定义,任何银行和商家联盟都不应能区分 Spend 协议的真实执行和模拟执行。在安全实验中,对手可通过预言机 QGetKey、Qwithdraw、QSpend 分别获取用户公钥、提取和花费硬币。正式定义为:存在模拟器 (SimCashSetup, SimSpend),对于任何对手 A = (A1, A2),存在可忽略函数 negl : N → R,使得:
[
\left|
\begin{array}{l}
\Pr[\text{params} \leftarrow \text{CashSetup}(\lambda); (\text{pkB}, \text{state}) \leftarrow A_1(\text{params}) : \
A_2^{\text{QSpend}(\text{params},\text{pkB},\cdot,\cdot),\text{QGetKey}(\text{params},\cdot),\text{Qwithdraw}(\text{params},\text{pkB},\cdot,\cdot)}(\text{state}) = 1] \
- \Pr[(\text{params}, \text{Sim}) \leftarrow \text{SimCashSetup}(\lambda); (\text{pkB}, \text{state}) \leftarrow A_1(\text{params}) : \
A_2^{\text{QSimSpend}(\text{params},\text{pkB},\cdot,\cdot),\text{QGetKey}(\text{params},\cdot),\text{Qwithdraw}(\text{params},\text{pkB},\cdot,\cdot)}(\text{state}) = 1]
\end{array}
\right| < \text{negl}(\lambda)
]
预言机定义如下:
-
QGetKey(params, j)
:输出 pkUj。若 Uj 不存在,预言机生成 (skUj, pkUj) ← UserKG(params) 并输出 pkUj。
-
Qwithdraw(params, pkB, j, f)
:给定钱包标识符 f,预言机扮演用户 j 的角色,在 Withdraw 协议执行中与扮演银行的对手 A 交互,创建价值为 2i 的钱包 Wf。
-
QSpend
:首先检查钱包 Wf 是否通过 Qwithdraw 创建,若未创建则输出 ⊥;若 Wf 有足够金额,运行 Spend 协议并输出价值为 v 的硬币;否则输出 ⊥。
-
QSimSpend
:若 f 不是通过 Qwithdraw 获得的有效提款钱包的索引,输出 ⊥;否则,对输入运行模拟器 SimSpend。
-
平衡性
:任何用户联盟花费的硬币数量都不能超过他们提取的数量。对于任何对手和每个值 L ∈ poly(λ),有:
[
\Pr [\text{params} \leftarrow \text{CashSetup}(\lambda); (\text{pkB}, \text{skB}) \leftarrow \text{BankKG}(\text{params}, L); (\text{qw}, \text{nd}) \leftarrow A^{\text{Qwithdraw}(\text{params},\cdot,\text{pkB},\cdot)(),\text{Qdeposit}(\text{params},\text{pkB},\text{DBB})} : \text{qw} \cdot 2^L < \text{nd}] < \text{negl}(\lambda)
]
其中 nd 是成功调用 Qdeposit 预言机后存入的总金额,qw 是成功调用 QWithdraw 的次数。预言机定义如下:
-
Qwithdraw
:在 Withdraw 协议执行中扮演银行角色,与扮演作弊用户的对手交互,结束时在数据库 T 中存储追踪信息 TW。
-
Qdeposit
:在协议中扮演银行角色,对手扮演商家角色,初始化银行数据库 DBB 为空,并返回与 Deposit 协议相同的响应。
-
可识别性
:给定两枚欺诈但格式良好的硬币,银行应能识别双花者。对于任何对手 A 和任何 L ∈ poly(λ),有:
[
\begin{align
}
&\Pr [\text{params} \leftarrow \text{CashSetup}(\lambda); (\text{pkB}, \text{skB}) \leftarrow \text{BankKG}(\text{params}, L); \
&((\text{coina}, \text{va}), (\text{coinb}, \text{vb})) \leftarrow A^{\text{Qwithdraw}(\text{params},\cdot,\text{skB},\cdot)}(\text{params}, \text{pkB}) : \
&(\text{infoa}; \text{pkMa}) \neq (\text{infob}; \text{pkMb}) \land \text{SameCoin}(\text{coina}, \text{coinb}, \text{va}, \text{vb}) = 1 \
&\land \text{VerifyCoin}(\text{params}, \text{pkMt}, \text{pkB}, \text{coint}, \text{vt}) = 1 \text{ for } t \in {a, b} \
&\land \text{Identify}(\text{params}, \text{pkB}, \text{coina}, \text{coinb}) \notin T] < \text{negl}(\lambda)
\end{align
}
]
其中 Qwithdraw 预言机的规范与平衡性属性中的相同。
-
免责性
:任何与诚实用户 U 交互的银行和商家联盟都不应能产生两枚硬币 (coina, coinb),使得 Identify(params, pkB, coina, coinb) = pkU,而用户 U 从未进行双花。对于任何 PPT 对手 A,有:
[
\begin{align
}
&\Pr [\text{params} \leftarrow \text{CashSetup}(\lambda); (\text{pkB}, \text{st}) \leftarrow A(\text{params}); \
&(\text{pkB}, \text{coina}, \text{coinb}, \text{va}, \text{vb}) \leftarrow A^{\text{QSpend}(\text{params},\text{pkB},\cdot,\cdot),\text{QGetKey}(\text{params},\cdot),\text{Qwithdraw}(\text{params},\cdot,\cdot,\cdot)}(\text{params}, \text{st}); \
&\text{SameCoin}(\text{coina}, \text{coinb}, \text{va}, \text{vb}) = 1; \text{pkU} \leftarrow \text{Identify}(\text{params}, \text{coina}, \text{coinb}) : \text{pkU} \in \text{HU}] < \text{negl}(\lambda)
\end{align
}
]
其中 HU 表示诚实用户的集合,QGetKey、Qwithdraw 和 QSpend 预言机的定义与匿名性概念中的完全相同。
1.2 流程图示
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A[CashSetup]:::process --> B[BankKG]:::process
A --> C[UserKG]:::process
B --> D[Withdraw]:::process
C --> D
D --> E[Spend]:::process
E --> F[VerifyCoin]:::process
F --> G[Deposit]:::process
G --> H{检测结果}:::process
H -- 验证失败 --> I[拒绝, flag = M]:::process
H -- 双花检测到 --> J[报告双花, flag = U]:::process
H -- 通过所有测试 --> K[接受, flag = accept]:::process
J --> L[Identify]:::process
2. F - 不可伪造签名
多块签名方案由高效算法 Σ = (SigSetup, KeyGen, Sign, Verify) 组成:
-
SigSetup(λ)
:以安全参数 λ 为输入,输出指定待签名消息向量长度 n ∈ poly(λ) 的 params。
-
Keygen(params)
:以公共参数为输入,输出密钥对 (pk, sk)。
-
Sign(sk, ⃗m)
:可能是随机化算法,以私钥 sk 和消息向量 ⃗m 为输入,输出签名 σ。
-
Verify(pk, ⃗m, σ)
:确定性算法,以公钥 pk、签名 σ 和消息向量 ⃗m 为输入,若 σ 对 ⃗m 有效则输出 1,否则输出 0。
多块签名方案 Σ 对于某个单射函数 F(.) 是 F - 不可伪造的,即没有概率多项式时间 (PPT) 对手在以下游戏中有不可忽略的优势:
1. 挑战者运行 Setup 和 Keygen 获得 (pk, sk),将 pk 发送给对手 A。
2. 对手 A 自适应查询签名预言机,每次查询选择向量 ⃗m 并获得签名 σi。
3. 对手 A 输出一对 并在以下条件下获胜:
- Verify(pk, m⋆, σ⋆) = 1。
- A 未获得向量 (m⋆1, …, m⋆n) 的任何签名。
多块 P - 签名结合了 F - 不可伪造多块签名方案 Σ、承诺方案 (Com, Open) 和三个协议:
-
SigProve(params, pk, σ, ⃗m)
:生成一系列承诺和 NIZK 证明。
-
NIZK 证明
:证明两个承诺打开到相同的值。
-
SigIssue ⇄ SigObtain
:允许用户在不向签名者透露消息向量信息的情况下获得签名。
3. 双线性映射和复杂度假设
考虑素数阶 p 的非对称双线性群 (G1, G2, GT),映射 e : G1 × G2 → GT 满足:
- 对于任何 (g, h) ∈ G1 × G2 和 a, b ∈ Z,e(ga, hb) = e(g, h)ab。
- 当 g ≠ 1G1 且 h ≠ 1G2 时,e(g, h) ≠ 1GT。
由于依赖 G1 和 G2 中 DDH 问题的难度,还要求 G2 和 G1 之间不存在高效可计算的同构。
3.1 复杂度问题定义
- q - 隐藏强 Diffie - Hellman 问题 (q - HSDH) :给定 (g, u, h, Ω = hω) ∈ G21 × G22 和元组 (g1/(ω + ci), gci, hci, uci),找到 (g1/(ω + c), hc, uc) 使得 c ≠ ci。
- q - 决策 Diffie - Hellman 反转问题 (q - DDHI) :给定 (g, g(α), …, g(αq)) ∈ Gq + 11 和 η ∈ G1,判断 η = g1/α 还是 η ∈R G1。
- 三重 Diffie - Hellman 问题 (TDH) :给定元组 (g, ga, gb, h, ha) 和对 (ci, g1/a + ci),找到三元组 (gμb, hμa, gμab) 使得 μ ≠ 0。
- 决策三方 Diffie - Hellman 问题 (D3DH) :给定元素 (g, ga, gb, gc, h, ha, hb, hc, Γ),判断 Γ = gabc 还是 Γ ∈R G1。
3.2 构建模块
-
非交互见证不可区分证明
:使用 Groth - Sahai 证明来处理配对积方程 (PPE):
[
\prod_{j = 1}^{n} e(A_j, Y_j) \prod_{j = 1}^{n} e(X_i, B_j) \prod_{i = 1}^{m} \prod_{j = 1}^{n} e(X_i, Y_j)^{\gamma_{i,j}} = t_T
]
证明系统是四个算法的元组 (SetupGS, ProveGS, VerifyProofGS):- SetupGS 输出公共参考字符串 (CRS) crs。
- ProveGS 首先生成变量的承诺,然后构建证明。
- VerifyProofGS 验证证明。
- GS 证明具有见证不可区分性,部分可实现零知识。
-
多块 P - 签名
:在 HSDH 和 TDH 假设下,多块 P - 签名被证明是 F - 安全的。
- 公共参数定义为 (p, G1, G2, GT, e, g, h, paramsGS, e(g, h))。
- 公钥和私钥分别为 pk = (u, U = gβ, ˜U = hβ, {Vi = gai, ˜Vi = hai}ni = 1) 和 sk = (β, ⃗a = (a1, …, an))。
- 签名向量 ⃗m 时,签名者选择 r 并计算 σ = (g1/β + r + ∑ni = 1 aimi, hr, ur)。
- 验证签名时,检查 e(σ1, ˜U · σ2 · ∏ni = 1 ˜V mi i) = e(g, h) 和 e(u, σ2) = e(σ3, h)。
3.3 协议流程
| 协议 | 描述 |
|---|---|
| SigProve(params, pk, σ, ⃗m) | 解析签名和向量,计算承诺和 NIZK 证明。 |
| VerifyProof(params, pk, πsig, (C1, …, Cn)) | 验证 SigProve 生成的证明。 |
| EqComProve(params, pk, x, y) | 证明两个承诺打开到相同的值。 |
| SigIssue(sk, (C1, …, Cn)) ⇆ SigObtain(params, pk, ⃗m, {(Ci, openi)}ni = 1) | 安全的两方协议,接收者在承诺消息向量上获得签名。 |
如果 HSDH 和 TDH 假设在 (G1, G2) 中成立,该方案对于单射函数 F(m) = (hm, um) 是 F - 不可伪造的。
4. 多块 P - 签名协议细节
4.1 SigProve 协议
在 SigProve 协议中,需要对签名和消息向量进行详细处理。具体步骤如下:
1.
解析签名和消息向量
:将签名 σ 解析为 (σ1, σ2, σ3),消息向量 ⃗m 解析为 (m1, …, mn)。
2.
计算承诺
:对于每个指数 mi ∈ Zp,计算 Groth - Sahai 对 hmi 和 umi 的承诺。
- 计算 (Ci,1, Ci,2, Ci,3) = Com(mi, (openmi,1, openmi,2, openmi,3)),具体为 (GSCom(hmi, openmi,1), GSCom(umi, openmi,2), GSCom(˜V mi i, openmi,3))。
3.
生成辅助变量承诺
:生成辅助变量 θ = 1 ∈ Zp 及其承诺 Cθ = GSCom(θ, openθ)。
4.
生成签名承诺
:生成对 {στ}3 τ = 1 的承诺 {Cστ}3 τ = 1。
5.
构建 NIZK 证明
:给出一系列等式的 NIZK 证明,包括:
- e(gθ, h) = e(σ1, ˜U · σ2 · ∏ni = 1 ˜V mi i)
- e(u, σ2) = e(σ3, h)
- θ = 1
- e(g, ˜V mi i) = e(Vi, hmi)
- e(u, hmi) = e(umi, h) (i ∈ {1, …, n})
证明 πsig 由 {Cστ}3 τ = 1、πsig 1、πsig 2、πsig θ、{πsig mi,1, πsig mi,2}n i = 1 组成。不同的证明部分所需的元素数量不同,例如 πsig 1 是二次方程的证明,需要 4 个 G1 元素和 4 个 G2 元素;其他线性方程的证明所需元素数量相对较少。在模拟的 CRS 上,除了 θ = 1 这个方程可以简单地对承诺进行伪装外,其他证明都可以使用 1G1、1G2 和 θ = 0 作为见证进行模拟。
4.2 VerifyProof 协议
VerifyProof 协议用于验证 SigProve 生成的证明。它的工作方式很直接,当且仅当 SigProve 生成的证明 πsig 令人信服时,返回 1。
4.3 EqComProve 协议
EqComProve 协议用于证明两个承诺打开到相同的值,它采用了在 [3,5] 中已经使用过的常用技术。
4.4 SigIssue ⇆ SigObtain 协议
这是一个安全的两方协议,允许接收者在承诺的消息向量上获得签名。可以使用 [32] 中的两方协议来计算承诺输入上的电路,也可以使用 [4] 中基于同态加密的两方计算协议。
4.5 协议流程图示
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A[SigProve]:::process --> B[计算承诺]:::process
B --> C[生成辅助变量承诺]:::process
C --> D[生成签名承诺]:::process
D --> E[构建 NIZK 证明]:::process
E --> F[输出证明 πsig]:::process
G[VerifyProof]:::process --> H{证明是否有效}:::process
H -- 有效 --> I[返回 1]:::process
H -- 无效 --> J[返回 0]:::process
K[EqComProve]:::process --> L[证明承诺相同]:::process
M[SigIssue]:::process --> N[SigObtain]:::process
N --> O[获得签名]:::process
5. 可分电子现金与相关技术的关联
可分电子现金方案的实现依赖于多个相关技术,它们之间相互协作,共同保证了电子现金系统的安全性和功能性。
5.1 与 F - 不可伪造签名的关联
电子现金方案中的银行签名等操作依赖于 F - 不可伪造签名。在用户提取硬币时,银行对钱包等信息进行签名,保证了信息的完整性和不可伪造性。例如,在 Withdraw 协议中,银行对钱包的签名可以防止用户篡改钱包信息。而 F - 不可伪造签名的特性,使得任何试图伪造签名的行为都具有极低的成功概率,从而保障了电子现金系统的安全性。
5.2 与非交互见证不可区分证明的关联
非交互见证不可区分证明在 Spend 协议中发挥了重要作用。当用户花费硬币时,需要生成证明 Π 来证明硬币的有效性。使用 Groth - Sahai 证明等非交互见证不可区分证明技术,可以在不泄露用户隐私信息的情况下,让商家和银行验证硬币的有效性。这种证明技术的见证不可区分性和部分零知识特性,保证了用户的交易信息不会被泄露。
5.3 与多块 P - 签名的关联
多块 P - 签名为电子现金系统提供了更高级的签名和证明机制。在电子现金的交易过程中,涉及到多个消息向量的签名和验证。多块 P - 签名的 SigProve、VerifyProof 等协议可以对这些消息向量进行有效的签名和验证,确保交易的合法性和安全性。例如,在 Deposit 协议中,银行可以使用多块 P - 签名的验证协议来验证硬币的签名是否有效。
5.4 关联关系表格
| 技术 | 与可分电子现金的关联 |
|---|---|
| F - 不可伪造签名 | 保证银行签名的不可伪造性,用于钱包等信息的签名 |
| 非交互见证不可区分证明 | 用于 Spend 协议中硬币有效性证明,保护用户隐私 |
| 多块 P - 签名 | 提供高级签名和验证机制,用于交易信息的签名和验证 |
6. 总结
可分电子现金方案是一个复杂而安全的系统,它结合了多种密码学技术来实现电子现金的安全交易。通过定义详细的协议和安全属性,如匿名性、平衡性、可识别性和免责性,确保了用户和商家的利益。F - 不可伪造签名、非交互见证不可区分证明和多块 P - 签名等技术为系统的安全性提供了坚实的保障。
在未来,随着密码学技术的不断发展和应用场景的不断拓展,可分电子现金方案可能会得到更广泛的应用。同时,也需要不断研究和改进这些技术,以应对新的安全挑战和需求。例如,进一步优化证明的效率,降低计算和通信开销,提高系统的性能和可用性。对于开发者和研究者来说,深入理解这些技术的原理和实现细节,有助于更好地设计和实现安全高效的电子现金系统。
超级会员免费看
1699

被折叠的 条评论
为什么被折叠?



