密码学 | 承诺:Pedersen 承诺

本文介绍了密码学中的Pedersen承诺协议,包括其原理(利用椭圆曲线上的生成元和随机盲因子),性质(隐藏性和计算绑定性),以及同态性在证明关系中的应用。重点强调了隐藏性如何保护消息不被提前获取和承诺方的不可逆承诺。
摘要由CSDN通过智能技术生成

🥑原文:密码学承诺之 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=gvhr

其中, 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 c1c2 是使用盲因子 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=c1c2=(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=?c1c2=?(gv1hr1)(gv2hr2)=gv1+v2hr1+r2=?v1+v2r3=?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 不被验证方知道?



  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值