源自壹账通公开的一个专利
初始化
1) 有一个 群,基点g
2) 有一个双线性pairing e(p,q)
3) 可信第三方(或一堆人构成的整体可信第三方共同)生成随机数a,这个a的知识意味着莫大的能力。注意作为一个整体的可信第三方并不一定知道a
4) 可信第三方计算 , 并公布之 。共同生成的时候,实际生成的a = a1*a2*a3...*an。只要有一个人诚实地销毁了自己的ai,a就无人知道了。
5) 数值v用Pedersen承诺表示: , r是随机数
6)为便于打字,记号pow(g, r) =
同态加法
Pedersen承诺直接是加法同态的
准同态乘法(达到乘法的效果)
两个数值v1和v2,各自的Pedersen承诺是 , ,
据此构造一个对v1和v2乘积的承诺
pow(k, r1 * r2)被看作某个公钥后公开,同时附带一个sig := sign( cm3, r1 * r2),这样可以证明示证人真的知道对应的私钥 (r1 * r2)。
现在各方都可以计算 cm4 := cm3 * pow(k, r1*r2),并且验证 e(g, cm4) ?= e(cm1, cm2)。
当该验证通过时,验证者确认cm3确实是对v1*v2的承诺
有2个承诺
如果同一个人知道两个承诺的opening方式,要证明 v1 = v2 很简单:cm = cm1/cm2,看作公钥,用(r1-r2)当私钥作一个签名,就证明了这个。如果直接提供(r1-r2)给人验证pow(h, r1-r2) ?= cm也可以。
下面是另外一个很好的方法: