承诺方案
在介绍IPA多项式承诺方案方案前,我们要先明白承诺是什么,进而理解多项式承诺是什么。
承诺
承诺相当于将信纸放入密封的、防篡改的、单独编号的信封。之后纸上内容不能再进行更改,且内容不会被泄漏,只有打开信封才知道纸上的内容。
在密码学中,承诺方案是一个涉及两方的二阶段交互协议,双方分别为承诺方/证明方和验证方。主要包含以下两个阶段;
- 承诺阶段:承诺方对一个消息 m m m,以密文的形式发送给接收方,意味着信息 m m m将不会再被篡改。(密封)
- 打开阶段,承诺方公开消息 m m m与盲化因子(相当于秘钥),接收方以此来验证其与承诺阶段所接收的消息是否一致。(打开信封)
承诺必须具有两个基本性质:
- 绑定属性(binding):绑定属性可以理解为一个 m m m对应一个唯一承诺值,敌手在多项式时间内不可能找到另一个 m ′ m^{\prime} m′对应的承诺值与 m m m的承诺值相等。形式化定义如下。
- 隐藏属性:隐藏属性可以理解为对于敌手来说,无法区分承诺和一个随机数。因此承诺不会泄漏隐私信息 m m m。
Pedersen承诺
Pedersen承诺主要包含以下三个算法 $ (Setup,commit,open) $ 。
-
S e t u p ( 1 λ ) : Setup(1^{\lambda}): Setup(1λ): 生成公共参数 p p = ( G , G ∈ G , H ∈ G , F p ) pp=(G,G\in G,H\in G,F_p ) pp=(G,G∈G,H∈G,Fp),其中 G G G是p阶的循环群,这里假设为定义在椭圆曲线上的加法循环群, G , H G,H G,H是 G G G中的元素。 p p pp pp对于承诺方和验证方都是已知的。
-
C o m m i t ( p p , m , r ) : Commit(pp,m,r): Commit(pp,m,r): 承诺者选择随机数 r r r,对信息 m m m计算承诺 c m = m G + r H cm=mG+rH cm=mG+rH,并将承诺发送给验证者。
-
O p e n ( p p , m , r ) : Open(pp,m,r): Open(pp,m,r): 承诺者揭示 m , r m,r m,r,验证者计算 c m ′ = m G + r H cm^{\prime}=mG+rH cm′=mG+rH,验证 c m = c m ′ cm=cm^{\prime} cm=cm′,若相等,输出1,否则,输出0。
注: S e t u p Setup Setup过程由验证者生成,在一些协议中也由第三方生产,通过随机选取群 G G G中的元素生成 G , H G,H G,H。
整体流程如图所示
Pedersen承诺具有绑定属性(binding)和隐藏属性(hiding),此外,Pedersen还具有加法同态属性,定义如下:
思考:若承诺的计算为 c m = m G cm=mG cm=mG可以吗?
不可以,但仅满足绑定属性(binding),但不满足隐藏属性(hiding)。即当没有随机项 r H rH rH,攻击者发送 m , m ′ m,m' m,m′,承诺方随机对其中一个信息进行承诺,攻击者可以识别出是哪个信息的承诺。
Pedersen向量承诺
上面的承诺方案是针对一个信息 m m m进行承诺,若有多个信息 m = ( m 1 , m 2 , … , m n ) \pmb{m}=(m_1,m_2,\dots,m_n) m=(m1,m2,…,mn),该如何进行承诺?则使用Pedersen向量承诺方案,包含以下三个算法:
-
S e t u p ( 1 λ ) : Setup(1^{\lambda}): Setup(1λ): 验证者生成公共参数 p p = ( G , G ∈ G n , H ∈ G , F p ) pp=(G,\pmb{G}\in G^n,H\in G,F_p ) pp=(G,G∈Gn,H∈G,Fp),其中, G \pmb{G} G是指 ( G 1 , G 2 , … , G n ) (G_1,G_2,\dots,G_n) (G1,G2,…,Gn), G , H \pmb{G},H G,H是 G G G中的群元素。
-
C o m m i t ( p p , m , r ) : Commit(pp,\pmb{m},r): Commit(pp,m,r): 承诺者计算承诺 c m = m 1 G 1 + m 2 G 2 + ⋯ + m n G n + r H cm=m_1G_1+m_2G_2+\dots+m_nG_n+rH cm=m1G1+m2G2+⋯+mnGn+rH,将承诺发送给验证者。
-
O p e n ( p p , m , r ) : Open(pp,\pmb{m},r): Open(pp,m,r): 承诺方公开隐私信息 m , r \pmb{m},r m,r,验证者运行 O p e n Open Open,其验证等式 c m = m 1 G 1 + m 2 G 2 + ⋯ + m n G n + r H cm=m_1G_1+m_2G_2+\dots+m_nG_n+rH cm=m1G1+m2G2+⋯+mnGn+rH。
同理,Pedersen向量承诺具有绑定属性(binding)、隐藏属性(hiding)和加法同态。
多项式承诺
上面我们了解到承诺的意义为了确保揭示过程中(即 o p e n open open时),承诺者不能修改信息 m m m。多项式承诺的目的是为了确保揭示过程中承诺者使用承诺的多项式计算验证者随机选择的一个点 z z z的多项式值 f ( z ) f(z) f(z),流程如下所示。证明是为了确保承诺者发送的 f ( z ) f(z) f(z)是承诺的多项式 f f f在点 z z z的值。
此时证明可以为多项式 f f f的系数,然后验证者计算在 z z z点的多项式值,判断与承诺者公开的 f ( z ) f(z) f(z)是否一致。证明大小与多项式的系数线性相关,这种方案往往是不实用的。该如何确保多项式值 f ( z ) f(z) f(z)是正确计算的情况下缩小证明的大小? 基于IPA实现的多项式承诺和KZG承诺方案可以很好的实现这一目的。