本文主要是介绍密码学 | 承诺:Pedersen Commitment,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
🥑原文:密码学承诺之 Pedersen Commitment 原理及应用
🥑写在前面:本文属搬运博客,自己留存学习。
1 承诺
密码学承诺方案是一个涉及双方的 二阶段 交互协议,双方分别为 承诺方 和 接收方。
- 第一阶段为承诺阶段:承诺方选择一个消息 m m m,以密文的形式发送给接收方。
- 第二阶段为打开阶段:承诺方公开消息 m m m,接收方验证它和承诺阶段接收到的消息是否一致。
这里看不懂很正常,我也看不懂🙂
承诺方案有两个基本性质:隐藏性 和 绑定性。
- 隐藏性:承诺值不会泄露任何关于消息 m m m 的信息;
- 绑定性:接收方有能力检验 m m m 就是该承诺值对应的消息。
根据参与方计算能力的不同,承诺方案一般分为两类:完美隐藏、计算绑定 承诺方案。
原文太离谱了,所以我用自己的话改了一下,不知道对不对。
2 Pedersen
Pedersen 承诺的核心公式:
c = g r ∗ h v c = g^r * h ^ v c=gr∗hv
其中, c c c 为生成的承诺值, g , h g,h g,h 为椭圆曲线上的生成元, r r r 为盲因子, v v v 为原始信息。由于 g , h g,h g,h 为椭圆曲线上的生成元,因此 g r , h v g^r, h^v gr,hv 可以视为公钥。同理, r , v r,v r,v 也可以视为私钥。
如果你没有椭圆曲线密码学的基础知识,这一段当然是看不懂的😎
3 Pedersen 的性质
Pedersen 承诺是一个满足 完美隐藏、计算绑定 的 同态 承诺协议:
- 它的完美隐藏性不依赖于任何困难性假设;
- 它的计算绑定性依赖于离散对数假设。
Pedersen 承诺的构造分为 3 个阶段:
- 初始阶段:选择阶为大素数 q q q 的乘法群 G G G、生成元 g g g 和 h h h,公开元组 ( g , h , q ) (g,h,q) (g,h,q);
- 承诺阶段:承诺方选择随机数 r r r 作为 盲因子,计算出 承诺值 c c c 后发送给接收者;
- 打开阶段:承诺方发送 ( v , r ) (v,r) (v,r) 给接收者,接收者验证 c c c 是否等于 ( g v h r ) m o d q (g^vh^r)\ mod\ q (gvhr) mod q;
如果相等则接受承诺,否则拒绝承诺。
这里的 v v v 就是前面说的消息 m m m,只不过换了个字母表示。
由于 r r r 为随机数,Pedersen 承诺具有完美隐藏性,以及基于离散对数假设的计算绑定性。
由于盲因子 r r r 是一个随机数,因此针对相同的 v v v 也会产生不同的承诺 c c c,从而提供了信息论安全的隐匿性。这一点类似 ECDSA、Schnorr 签名采用的手法。
4 Pedersen 的同态性
Pedersen 承诺的同态性是指,如果 c 1 , c 2 c_1,\ c_2 c1, c2 分别是使用盲因子 r 1 , r 2 r_1,\ r_2 r1, r2 对 v 1 , v 2 v_1,\ v_2 v1, v2 的承诺,那么 c 1 ∗ c 2 c_1*c_2 c1∗c2 是使用盲因子 r 1 + r 2 r_1+r_2 r1+r2 对 v 1 + v 2 v_1+v_2 v1+v2 的承诺,这是因为:
c = c 1 ∗ c 2 = ( g v 1 h r 1 ) ∗ ( g v 2 h r 2 ) = g v 1 + v 2 h r 1 + r 2 c=c_1*c_2=(g^{v_1}h^{r_1})*(g^{v_2}h^{r_2})=g^{v_1+v_2}h^{r_1+r_2} c=c1∗c2=(gv1hr1)∗(gv2hr2)=gv1+v2hr1+r2
假设有 v 1 + v 2 = v 3 v_1+v_2=v_3 v1+v2=v3,证明方想向验证者证明 v 1 , v 2 , v 3 v_1,\ v_2,\ v_3 v1, v2, v3 的这一关系,但又不想让验证者知道 v 1 , v 2 , v 3 v_1,\ v_2,\ v_3 v1, v2, v3 的明文值,那么可以使用 Pedersen 承诺的同态性来解决这个问题,即只需要验证其盲因子 r 1 + r 2 r_1+r_2 r1+r2 是否等于 r 3 r_3 r3:
c 3 = ? c 1 ∗ c 2 g v 3 h r 3 = ? ( g v 1 h r 1 ) ∗ ( g v 2 h r 2 ) = g v 1 + v 2 h r 1 + r 2 v 3 = ? v 1 + v 2 ⟷ r 3 = ? r 1 + r 2 \begin{alignat}{2} c_3 &\overset{?}{=} c_1*c_2 \\ g^{v_3}h^{r_3} &\overset{?}{=} (g^{v_1}h^{r_1}) * (g^{v_2}h^{r_2}) = g^{v_1+v_2}h^{r_1+r_2} \\ v_3 &\overset{?}{=} v_1+v_2 \longleftrightarrow r_3\overset{?}{=} r_1+r_2 \end{alignat} c3gv3hr3v3=?c1∗c2=?(gv1hr1)∗(gv2hr2)=gv1+v2hr1+r2=?v1+v2⟷r3=?r1+r2
如果证明方知道验证方的验证方式是验证 r 3 = ? r 1 + r 2 r_3\overset{?}{=} r_1+r_2 r3=?r1+r2,那么证明方可以故意构造一个 r 3 = r 1 + r 2 r_3 = r_1+r_2 r3=r1+r2,验证方应该如何防止证明方作弊呢?
由于元组 ( g , h , q ) (g,h,q) (g,h,q) 是公开的,验证方可以根据盲因子 r 1 r_1 r1 来构造一个承诺 g v 1 h r 1 g^{v_1}h^{r_1} gv1hr1,验证与接收到的 g v 1 h r 1 g^{v_1}h^{r_1} gv1hr1 是否是相等。
第二阶段不是打开阶段吗?怎么保证 v 1 v_1 v1 不被验证方知道?
这篇关于密码学 | 承诺:Pedersen Commitment的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!