基于Schnorr签名的Pedersen承诺一致性证明

顺着前一个帖子的未尽事宜自行考虑了以下问题:两方各自有一个Pedersen Commitment,想要证明其承诺值相同,且证明过程不能对第三方泄露承诺值;如果实际上承诺值不相同,则甚至不能让对方知道本方的承诺值。给出一个解法:

甲方:cm1 = v1 * G + x1 * H;生成随机数 r1,公开r1*H

乙方:cm2 = v2 * G + x2 * H;生成随机数 r2, 公开r2*H

定义 e = Hash(r1*H||r2*H||cm1 || cm2)

甲方计算 s1 = r1 + e*x1,

x1作为私钥,为e生成Schnorr签名sig1 = <r1*H, s1> =

乙方计算s2 = r2 + e * x2

x2作为私钥,为e生成Schnorr签名sig2 = < r2 * H,  s2> =

甲乙双方公开sig1sig2。包括甲乙和第三方,任何人都可以计算如下定义的 sig = sig1 - sig2 =  < r1*H - r2*H, s1 - s2> =

上式中,对sig的两个分量分别记为R和s。

甲乙双方共同拥有(但任何一方都不单独知道)的共同私钥 sk = x1 - x2, 对应的共同公钥PK = (x1-x2)*H

包括甲乙和第三方,任何人都可以计算cm = cm1 - cm2 ,其值等于(v1 - v2) * G + (x1 - x2) * H。只有当v1==v2时,cm才正好等于PK

包括甲乙和第三方,任何人都可以验证sig = <R, s> 是否是对应cm(此时当做是一个公钥)的对e的签名:

s*H =?=  R + e * cm

演算后易知:只有在 (v1=v2)时上面的式子左右两边才相等!也就是时候,如果能够验证这个签名,就证明了两个Pedersen承诺的值恰好相等。

这个算法只能用于半诚实敌手模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。