密码学承诺方案是一个涉及两方的二阶段交互协议,双方分别为承诺方和接收方。第一阶段为承诺阶段,承诺方选择一个消息 m ,以密文的形式发送给接收方,意味着自己不会更改 m 。第二阶段为打开阶段,承诺方公开消息 m 与盲化因子(相当于秘钥),接收方以此来验证其与承诺阶段所接收的消息是否一致。承诺方案有两个基本性质,即隐藏性和绑定性。隐藏性是指承诺不会泄露任何关于消息 m 的信息;绑定性是指任何恶意的承诺方都不能将承诺打开为非 m 的消息通过验证,即接收方可以确信 m 是和该承诺对应的消息。根据参与者计算能力的不同,承诺方案一般分为两类:计算隐藏、完美绑定承诺方案;计算绑定、完美隐藏承诺方案。
Pedersen承诺是密码学承诺的一种,于1992年被Pedersen在 Non-Interactive and Information-Theoretic Secure Verifiable Secret Sharing 一文中提出,它是一个满足计算绑定、完美隐藏的同态承诺协议,其完美隐藏性不依赖于任何困难性假设,计算绑定性依赖于离散对数假设,在信息安全协议中有着广泛的应用。结合下例阐述Pedersen承诺。
假设Alice和Bob用抛币的方式来解决一个争端,且在同一个位置用面对面的方式,那么过程就很简单。
(1)Alice先押结果,即正面或反面。
(2)Bob抛币并公布结果。
(3)如果与之前Alice所押的结果相同,则Alice获胜,否则Bob获胜。
如果Alice和Bob不在同一个位置,则上述方法就不再适用。需要在上述过程中加入承诺步骤,以保证协议的公平性。过程如下。
(1)Alice先押结果,并将该结果做承诺(密封)发给Bob。
(2)Bob抛币并公布结果。
(3)Alice打开承诺,即将之前的密封打开。
(4)如果Alice打开的承诺与Bob公布一致,则Alice胜。
Pedersen承诺包括以下两个阶段。
(1)承诺阶段。Alice对一个数 s 做承诺后发送给Bob,除了Alice,其他人都不知道该数。
(2)打开阶段。Alice打开对 s 的承诺,在此过程中,如果Alice企图声称该承诺是对 s '做出的,那么这在计算上是不可能的。
下面介绍基于离散对数的Pedersen承诺。
假设 p 和 q 是大素数且满足 q | p -1, G q 是 的唯一子群,阶为 q 。 g 是 G q 的生成元, h 是 G q 的元素,计算log g h 是困难性问题。
基于离散对数的Pedersen承诺包括以下两个阶段。
(1)承诺阶段。Alice希望对 s 做承诺并发送给Bob,Alice选择随机数 t 并计算 C = g s h t ,将 C 发送给Bob。
(2)打开阶段。Alice将 s 和 t 发送给Bob,Bob可以验证 C 确实是 s 的承诺。
由于离散对数求解的困难性,无法通过 C = g s h t 得到 s 的任何信息。另外,Alice无法将C打开成另外的 s '( s ' ≠ s ),除非Alice能计算log g h 。
Pedersen承诺实现以下两个目标。
(1)不能从承诺 C = g s h t 得到 s 的任何信息,承诺者Alice不能把 C 打开成另外的 s '( s ' ≠ s )。
(2)同一个 s 可以被承诺两次, C = g s h t , C '= g s h t' , t '≠ t 。Alice可以通过出示 t - t '向Bob证明 C 和 C '都是对同一个数值的承诺,但Bob并不知道 s 是什么。