AlexiaChen / AlexiaChen.github.io

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues
87 stars 11 forks source link

什么是pedersen commitment ? #126

Open AlexiaChen opened 3 years ago

AlexiaChen commented 3 years ago

前言

我之前在PVSS的那个项目里面说到了那个多项式的承诺(commitment)不是pederseon承诺, 而是commit = g^r。承诺其实就是对某个信息m的绑定,以达到信息隐藏的目的,这样就可以不暴露出来,等到需要用的时候,在进行暴露。所以这时候你可以觉得Hash函数也可以用作承诺,但是相比pedersen commitment有更大的优势。我后面会说到。

Pedersen Commitment

先来解释下什么是pedersen commitment吧。

下文中的sender,prover,commiter是同一个对象。 receiver, verfier也是一个对象。从这里也可以看出来,pedersen commitment后面会大量用在零知识证明领域。

以上前5步骤中, prover不能随意修改m和r,否则是不行的,并且在第5步之前,承诺c不能包含秘密消息m的任何有关线索。

还有需要注意,这个随机秘密r,必须每次commit的时候,都要不一样。

pedersen commitment使用一个素阶群G_q, q是大素数,并且这个群需要离散对数下困难。还需要这个G_q中任意两个无关的生成元g和h, g和h不能有关系。因为是素阶群,所以任意元素都可以作为生成元,所以随便选好了。随机秘密r选在Z_q上。秘密消息m只要是它的子集就行,然后pedersen commitment就是 C(m, r) = (g^m) * (h^r)

Pedersen Commitment的作用

承诺在密码学上相当于秘密地将m写在一个密封的、防篡改的、单独编号(的信封中,信封由写消息的人(Prover)保管。信封的内容不能更改(绑定属性),消息不能泄漏(隐藏属性)。在密码学带来的改进中,我们不需要检查信封是否真的密封了,而且信封可以通过网络传输。

下面我们通过一个例子来说明,有三个任务Alice, Bob, Valery 。

没有pedersen commitment的场景:

有pedersen commitment的场景:

这里用承诺代替了信封,因为承诺不可篡改,也不直接暴露秘密消息m。如果是信封,Bob就可以骗人,在看到信封内容后说我的m_b就是m啊,发生反悔。

Alice也不能通过秘密r的选取进行欺骗,因为C(0, r) = C(1, r)。 更不可能反悔秘密消息m。

这么来看,确实Commitment可以用Hash函数来做,但是为什么呢?

pedersen commitment 和Hash-based commitment

那么pedersen commitment和Hash commitment到底有什么区别呢?貌似都可以完成承诺的功能啊,pedersen commitment具有以下优势:

-因为是在群上做的,所以有加法同态性质

举个例子,在椭圆曲线上的素阶群为例, 选择两个G点: P和Q点。

commit(m,r) := m*P+r*Q

以上公式是常规情况,那么我们再推广以下,因为素阶群的任意元素都可以作为生成元,所以,我们也可以选择n个P,P1到Pn对多个秘密消息m_1到m_n进行commit:

commit(m_1,m_2,..., m_n,r) := m_1*P1 + m_2*P2 + ... + m_n * Pn + r*Q

然后,最重要的来了,Pedersen Commitment具有加法同态性质:

commit(m_1 + m_2, r1 + r2) = (m_1+m_2)*P + (r1+r2)*Q = m_1*P + r1*Q + m_2*P + r_2*Q =  (m_1*P + r1*Q) + (m_2*P + r_2*Q) = commit(m_1, r1) + commit(m_2, r2)

也就是pedersen commitment算法由了加法同态性质.

Hash commitment是没有加法同态性质的,因为Hash函数的输出是杂乱无章的,

参考