Skip to main content

协议-范围证明(Range Proof)

范围证明(Range Proof)是一种零知识证明协议,用于证明某个数值在一个特定的范围内,而不泄露该数值的具体信息。这在隐私保护和加密货币等领域有广泛应用。一个典型的应用场景是证明一个交易金额在某个范围内,而不透露具体金额。

基本概念

范围证明的目标是证明某个秘密值 xx 在范围 ([a, b]) 内,即 axba \leq x \leq b,而不泄露 xx 的具体值。

实现方法

有多种实现范围证明的方法,其中一种常见的方法是基于 Pedersen 承诺和 Bulletproofs 协议。以下是基于 Pedersen 承诺的基本思路:

  1. Pedersen 承诺

    • 给定一个秘密值 xx 和一个随机数 rr,计算承诺 C=gxhrmodpC = g^x h^r \mod p,其中 gghh 是生成元,pp 是一个大素数。
  2. 范围证明

    • 证明者生成零知识证明,证明 xx 在范围 ([a, b]) 内。

示例代码

以下是一个简单的范围证明示例代码,基于 Pedersen 承诺和简单的范围检查:

import random

# 公共参数
p = 23 # 一个大素数
g = 5 # 生成元
h = 7 # 另一个生成元
a = 0 # 范围下限
b = 10 # 范围上限

# 生成Pedersen承诺
def pedersen_commit(x, r):
return (pow(g, x, p) * pow(h, r, p)) % p

# 生成范围证明
def generate_range_proof(x, r):
assert a <= x <= b, "x不在范围内"
C = pedersen_commit(x, r)
return C, r

# 验证范围证明
def verify_range_proof(C, r):
for x in range(a, b+1):
if pedersen_commit(x, r) == C:
return True
return False

# 示例使用
x = 6 # 秘密值
r = random.randint(1, p-1) # 随机数
C, r = generate_range_proof(x, r)
if verify_range_proof(C, r):
print("验证成功")
else:
print("验证失败")

解释

  1. Pedersen 承诺:给定一个秘密值 xx 和一个随机数 rr,计算承诺 C=gxhrmodpC = g^x h^r \mod p
  2. 生成范围证明:证明者生成承诺 CC 和随机数 rr,并断言 xx 在范围 ([a, b]) 内。
  3. 验证范围证明:验证者检查 CC 是否可以由范围 ([a, b]) 内的某个值 xx 和随机数 rr 生成。

Bulletproofs 协议

Bulletproofs 是一种更高效的范围证明协议,适用于更大的范围和更复杂的场景。它通过递归的方式减少证明大小和验证时间,是现代加密货币系统中常用的技术。

总结

范围证明是一种零知识证明协议,用于证明某个数值在一个特定的范围内,而不泄露该数值的具体信息。示例代码展示了如何使用 Pedersen 承诺实现简单的范围证明。对于更大范围和复杂场景,可以考虑使用 Bulletproofs 协议。范围证明在隐私保护和加密货币等领域有广泛应用。

okx-lib

理论图片

alt text

理论描述

好的,我会尽量将图片上的理论内容逐步解释清楚。

A.1 Range Proof 范围证明

背景

这个证明由发起者 Alice 运行,在 MtA 和 MtAwc 协议中使用。证明者知道:

  • Paillier 公钥 N,gN, g
  • 一个值 cZ_N2c \in Z\_{N^2}(加密值)
  • 明文 mZqm \in Z_q 和加密时使用的随机数 rZNr \in Z_N^*

证明的目标是让验证者相信 mm 在范围 ([-q^3, q^3]) 内。

步骤

  1. 生成随机数

    • 选择 αZ_q3\alpha \in Z\_{q^3}
    • 选择 βZN\beta \in Z_N^*
    • 选择 γZ_q3N~\gamma \in Z\_{q^3 \tilde{N}}
    • 选择 ρZ_qN~\rho \in Z\_{q \tilde{N}}
  2. 计算中间值

    • 计算 z=h1mh2ρmodN~z = h_1^m h_2^\rho \mod \tilde{N}
    • 计算 u=gαβNmodN2u = g^\alpha \beta^N \mod N^2
    • 计算 w=h1αh2γmodN~w = h_1^\alpha h_2^\gamma \mod \tilde{N}
  3. 发送中间值

    • 证明者将 z,u,wz, u, w 发送给验证者。
  4. 生成挑战

    • 验证者选择一个挑战 eZqe \in Z_q 并将其发送给证明者。
  5. 计算响应

    • 证明者计算 s=reβmodNs = r^e \beta \mod N
    • 证明者计算 s1=em+αs1 = e m + \alpha
    • 证明者计算 s2=eρ+γs2 = e \rho + \gamma
    • 证明者将 s,s1,s2s, s1, s2 发送给验证者。
  6. 验证响应

    • 验证者检查 s1q3s1 \leq q^3
    • 验证者检查 u=gs1sNcemodN2u = g^{s1} s^N c^{-e} \mod N^2
    • 验证者检查 w=h1s1h2s2zemodN~w = h_1^{s1} h_2^{s2} z^{-e} \mod \tilde{N}

完整性(Completeness)

通过检查可以发现,对于诚实的证明者,失败的概率是可以忽略的(当 e>q3q2e > q^3 - q^2 时,失败的概率可以忽略不计)。这意味着 s1>q3s1 > q^3 的概率很低。

可靠性(Soundness)

假设 N~,s~\tilde{N}, \tilde{s} 是强 RSA 挑战。我们展示了如何通过使用一个在错误实例上成功的证明者来解决这个问题(即 m>q3|m| > q^3)。

进一步的数学推导

图像中还包含了进一步的数学推导,展示了如何通过选择不同的随机数和计算来确保证明的可靠性和零知识特性。具体推导涉及到一些高级的数论和密码学知识,核心思想是通过调整参数和计算,使得证明的每一步都满足零知识特性,即在不泄露具体值的情况下,证明某个值在特定范围内。

总结

通过这个范围证明协议,证明者能够向验证者证明某个加密值的明文在特定范围内,而不泄露具体的明文值。这种证明在多方安全计算和隐私保护的应用中非常重要。

希望这个解释能帮助你更好地理解图片中的理论内容。如果你有任何具体的问题或需要进一步的解释,请随时提问!

NTilde 与 N 啥关系

在密码学中,N~\tilde{N}NN 是两个不同的参数,尽管它们可能在某些上下文中有相关性。具体关系取决于协议的具体实现和设计。让我们详细探讨一下它们在范围证明中的角色和可能的关系。

NNN~\tilde{N} 的定义和角色

  1. NN

    • NN 通常是 Paillier 加密方案中的模数。Paillier 加密方案是一种基于同态加密的公钥加密方案。
    • NN 通常是两个大质数的乘积,即 N=p×qN = p \times q,其中 ppqq 是大质数。
    • 在加密过程中,明文 mm 被加密为 c=gmrNmodN2c = g^m r^N \mod N^2,其中 gg 是生成元,rr 是一个随机数。
  2. N~\tilde{N}

    • N~\tilde{N} 是范围证明协议中的一个额外参数,通常比 NN 更大。
    • N~\tilde{N} 的具体定义和选择可能依赖于协议的设计需求和安全要求。
    • 在范围证明中,N~\tilde{N} 通常用于计算一些中间值,例如 z=h1mh2ρmodN~z = h_1^m h_2^\rho \mod \tilde{N}w=h1αh2γmodN~w = h_1^\alpha h_2^\gamma \mod \tilde{N}

N~\tilde{N}NN 的关系

虽然 N~\tilde{N}NN 在具体数值上没有直接的关系,但它们在范围证明协议中有一些共同的特性和作用:

  • 模数性质:两者都是模数,用于模运算以确保计算结果在某个范围内。
  • 安全性参数N~\tilde{N} 通常比 NN 更大,以提供额外的安全性和随机性。例如,N~\tilde{N} 可能是 NN 的多倍。
  • 独立性N~\tilde{N}NN 通常是独立选择的,但它们的选择会影响整个协议的安全性和性能。

总结

在范围证明协议中,NNN~\tilde{N} 都是关键参数,但它们的具体数值和选择依赖于协议的设计需求。N~\tilde{N} 通常比 NN 更大,用于提供额外的安全性和随机性。两者在具体数值上没有直接的关系,但在协议中共同作用以确保证明的正确性和安全性。

希望这个解释能帮助你更好地理解 NNN~\tilde{N} 的角色和关系。如果你有任何进一步的问题或需要更详细的解释,请随时提问!

理论+代码分析

是的,你的代码与图像中展示的理论内容直接相关。图像中描述了一个基于 Paillier 加密的范围证明(Range Proof)协议。我们可以逐步对照图像中的步骤和代码中的实现,以更好地理解这个范围证明的生成和验证过程。

理论步骤与代码对照

1. 生成随机数

理论步骤:

  • 选择 αZq3\alpha \in Z_{q^3}, βZN\beta \in Z_N^*, γZq3N~\gamma \in Z_{q^3 \tilde{N}}, ρZqN~\rho \in Z_{q \tilde{N}}

代码实现:

alpha := crypto.RandomNum(q3)
beta, err := crypto.RandomPrimeNum(pk.N)
gamma := crypto.RandomNum(q3NTilde)
rho := crypto.RandomNum(qNTilde)

2. 计算 z,u,wz, u, w

理论步骤:

  • 计算 z=h1mh2ρmodN~z = h_1^m h_2^\rho \mod \tilde{N}
  • 计算 u=gαβNmodN2u = g^\alpha \beta^N \mod N^2
  • 计算 w=h1αh2γmodN~w = h_1^\alpha h_2^\gamma \mod \tilde{N}

代码实现:

h1M := new(big.Int).Exp(h1, m, NTilde)
h2Rho := new(big.Int).Exp(h2, rho, NTilde)
z := new(big.Int).Mod(new(big.Int).Mul(h1M, h2Rho), NTilde)

n2 := pk.N2()
gAlpha := new(big.Int).Exp(pk.G(), alpha, n2)
betaN := new(big.Int).Exp(beta, pk.N, n2)
u := new(big.Int).Mod(new(big.Int).Mul(gAlpha, betaN), n2)

h1Alpha := new(big.Int).Exp(h1, alpha, NTilde)
h2Gamma := new(big.Int).Exp(h2, gamma, NTilde)
w := new(big.Int).Mod(new(big.Int).Mul(h1Alpha, h2Gamma), NTilde)

3. 计算哈希值 ee

理论步骤:

  • 计算 ee 作为哈希值

代码实现:

eHash := crypto.SHA256Int(pk.N, c, z, u, w)
e := new(big.Int).Mod(eHash, q)

4. 计算 s,s1,s2s, s1, s2

理论步骤:

  • 计算 s=reβmodNs = r^e \beta \mod N
  • 计算 s1=em+αs1 = e m + \alpha
  • 计算 s2=eρ+γs2 = e \rho + \gamma

代码实现:

rE := new(big.Int).Exp(r, e, pk.N)
s := new(big.Int).Mod(new(big.Int).Mul(rE, beta), pk.N)

eM := new(big.Int).Mul(e, m)
s1 := new(big.Int).Add(eM, alpha)

eRho := new(big.Int).Mul(e, rho)
s2 := new(big.Int).Add(eRho, gamma)

5. 验证 s1s1 范围

理论步骤:

  • 验证 s1q3s1 \leq q^3

代码实现:

if rp.S1.Cmp(q3) == 1 {
return false
}

6. 验证 uuww

理论步骤:

  • 验证 u=gs1sNcemodN2u = g^{s1} s^N c^{-e} \mod N^2
  • 验证 w=h1s1h2s2zemodN~w = h_1^{s1} h_2^{s2} z^{-e} \mod \tilde{N}

代码实现:

minusE := new(big.Int).Sub(big.NewInt(0), e)
{
cMinusE := new(big.Int).Exp(c, minusE, NSq)
sN := new(big.Int).Exp(rp.S, pk.N, NSq)
gammaS1 := new(big.Int).Exp(pk.G(), rp.S1, NSq)

tmp := new(big.Int).Mul(cMinusE, sN)
tmp = new(big.Int).Mul(tmp, gammaS1)
tmp = new(big.Int).Mod(tmp, NSq)
if rp.U.Cmp(tmp) != 0 {
return false
}
}

{
h1S1 := new(big.Int).Exp(h1, rp.S1, NTilde)
h2S2 := new(big.Int).Exp(h2, rp.S2, NTilde)
zMinusE := new(big.Int).Exp(rp.Z, minusE, NTilde)

tmp := new(big.Int).Mul(h1S1, h2S2)
tmp = new(big.Int).Mul(tmp, zMinusE)
tmp = new(big.Int).Mod(tmp, NTilde)
if rp.W.Cmp(tmp) != 0 {
return false
}
}

总结

通过对照理论步骤和代码实现,可以看到代码严格按照图像中的理论内容实现了一个基于 Paillier 加密的范围证明协议。每一步都有其特定的目的,最终实现了在不泄露具体值的情况下,证明某个值在特定范围内。

希望这个对照和解释能帮助你更好地理解代码。如果你有任何具体的问题或需要进一步的解释,请随时提问!