🥑原文:密码学承诺之 Pedersen Commitment 原理及应用
🥑写在前面:本文属搬运博客,自己留存学习。
1 承诺
密码学承诺方案是一个涉及双方的 二阶段 交互协议,双方分别为 承诺方 和 接收方。
- 承诺阶段: 由于承诺方不想让接收方 提前 知道消息 m m m 是什么,因此承诺方为消息 m m m 生成一个承诺值 c c c 并发送给接收方。
- 打开阶段: 承诺方发送消息 m m m 给接收方,接收方可以通过承诺值 c c c 来验证消息 m m m 和 c c c 所对应的消息是否一致。
这里看不懂很正常,因为原文确实说的很简略,我已经尽力说清楚了🙂
注意:承诺的主要作用并不是为消息 m m m 加密!其作用一是为了防止接收方提前知道消息,二是为了防止承诺方指鹿为马,即承诺阶段明明是给消息 m m m 进行的承诺,但在打开阶段却说自己的消息是 m ′ m' m′。
承诺方案有两个基本性质:隐藏性 和 绑定性。
- 隐藏性:承诺值 c c c 不会泄露任何关于消息 m m m 的信息,接收方无法根据 c c c 反推出 m m m;
- 绑定性:承诺方无法谎称承诺值 c c c 是关于消息 m ′ m' m′ 的承诺,因为接收方可以验证出来。
以上只是入门级的文字描述,可以先有这两个概念,后面再进行深入学习。
2 Pedersen
Pedersen 承诺的核心公式:
c = g v ∗ h r c = g^ v * h ^ r c=gv∗hr
其中, c c c 为生成的承诺值, g , h g,h g,h 为椭圆曲线上的生成元, v v v 为原始信息, r r r 为盲因子。由于 g , h g,h g,h 为椭圆曲线上的生成元,因此 g v , h r g^v, h^r gv,hr 可以视为公钥。同理, v , r v,r v,r 也可以视为私钥。
如果你没有椭圆曲线密码学的基础知识,这一段当然是看不懂的😎
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 不被验证方知道?