Paillier NIZK 同态非交互零知识证明
NIZKProof 与 NIZKVerify
是的,这两行代码确实是互为反向运算。让我们详细解释一下它们是如何互为反向运算的。
生成证明 (NIZKProof)
在 NIZKProof 函数中,我们生成了证明值 sigma,具体步骤如下:
sigma := new(big.Int).Exp(rho, NInv, N)
这行代码的含义是:
rho是一个随机数。NInv是N在phiN模下的逆元。sigma是rho的NInv次幂,模N。
简而言之,sigma 是通过对 rho 进行 NInv 次幂运算得到的。
验证证明 (NIZKVerify)
在 NIZKVerify 函数中,我们需要验证 sigma 是否正确。具体步骤如下:
tmp := new(big.Int).Exp(new(big.Int).SetBytes(sigma), N, N)
这行代码的含义是:
sigma是之前生成的证明值。N是模数。tmp是sigma的N次幂,模N。
互为反向运算
让我们看看这两步运算是如何互为反向运算的:
-
生成
sigma:sigma := new(big.Int).Exp(rho, NInv, N)sigma = rho^NInv (mod N)
-
验证
sigma:tmp := new(big.Int).Exp(new(big.Int).SetBytes(sigma), N, N)tmp = sigma^N (mod N)- 将
sigma代入:tmp = (rho^NInv)^N (mod N)
根据模运算的性质,(rho^NInv)^N ≡ rho (mod N),因为 NInv 是 N 在 phiN 模下的逆元,所以 NInv * N ≡ 1 (mod phiN),这意味着 (rho^NInv)^N ≡ rho (mod N)。
验证逻辑
在验证过程中,我们比较 rho 和 tmp:
if rho.Cmp(tmp) != 0 {
return false
}
- 如果
sigma是正确的,即sigma = rho^NInv (mod N),那么sigma^N (mod N)应该等于rho。 - 因此,
tmp应该等于rho,如果不等,则证明无效。
总结
- 生成证明:
sigma = rho^NInv (mod N) - 验证证明:
tmp = sigma^N (mod N),并比较tmp和rho
这两步运算确实是互为反向运算,通过这种方式,我们能够验证 sigma 是否是通过正确的 rho 生成的,从而验证证明的有效性。
latex 证明
好的,让我们用 LaTeX 来表示这些数学表达式。
生成证明 (NIZKProof)
在 NIZKProof 函数中,生成证明值 的步骤可以用 LaTeX 表示如下:
其中:
- 是一个随机数。
- 是 在 模下的逆元。
验证证明 (NIZKVerify)
在 NIZKVerify 函数中,验证 的步骤可以用 LaTeX 表示如下:
其中:
- 是之前生成的证明值。
- 是模数。
互为反向运算
让我们看看这两步运算是如何互为反向运算的:
-
生成 :
-
验证 :
将 代入第二个表达式:
根据模运算的性质:
因为 是 在 模下的逆元,所以 ,这意味着:
验证逻辑
在验证过程中,我们比较 和 :
- 如果 是正确的,即 ,那么 应该等于 。
- 因此, 应该等于 ,如果不等,则证明无效。
总结
-
生成证明:
-
验证证明:
通过这种方式,我们能够验证 是否是通过正确的 生成的,从而验证证明的有效性。