承诺协议
密码学承诺方案是一个涉及两方的二阶段交互协议,双方分别为承诺方和接收方。第一阶段为承诺阶段 c ← C o m ( x , r ) c \leftarrow Com(x,r) c←Com(x,r),承诺方将声明 x x x和随机数 r r r用OWF做变换,发送承诺 c c c给接收方。第二阶段为打开阶段 ( x , r ) ← D e c o m ( c ) (x,r) \leftarrow Decom(c) (x,r)←Decom(c),承诺方简单地发送 c c c对应的 x , r x,r x,r给接收方,接收方判断 c = C o m ( x , r ) c=Com(x,r) c=Com(x,r)是否满足。
承诺方案需要满足的两个基本性质:
-
隐藏性(Hiding):对于任意PPT敌手,声明 x 1 x_1 x1和声明 x 2 x_2 x2的承诺 c 1 , c 2 c_1,c_2 c1,c2不可区分。即承诺不泄露声明的额外信息。
-
绑定性(Binding):对于任意PPT敌手,找到两个声明 x 1 ≠ x 2 x_1 \neq x_2 x1=x2以及随机数 r 1 , r 2 r_1,r_2 r1,r2,使得 c 1 = c 2 c_1=c_2 c1=c2的概率可以忽略。即不同的声明难以生成相同的承诺。
根据参与方计算能力的不同,承诺方案一般分为两类:计算隐藏完美绑定承诺方案、计算绑定完美隐藏承诺方案。
构造
Hash承诺
- 承诺阶段:承诺者计算声明 x ∈ { 0 , 1 } ∗ x\in\{0,1\}^* x∈{0,1}∗和随机数 r r r的承诺 C o m ( x , r ) : = H a s h ( x ∣ ∣ r ) Com(x,r) := Hash(x||r) Com(x,r):=Hash(x∣∣r),发送承诺 c c c给接收者
- 打开阶段:承诺者解承诺 D e c o m ( c ) : = ( x , r ) Decom(c):= (x,r) Decom(c):=(x,r),公开声明 x x x和随机数 r r r,接收者判断 c = H a s h ( x ∣ ∣ r ) c=Hash(x||r) c=Hash(x∣∣r)是否满足
用途:校验数据是否发生改变或丢失。
基于PRG的比特承诺
- 承诺阶段:接收者生成 l l l长随机串 A ← P R G ( s ) A \leftarrow PRG(s) A←PRG(s)发送给承诺者,承诺者生成 l l l长随机串 B ← P R G ( s ′ ) B \leftarrow PRG(s') B←PRG(s′),并计算声明 x ∈ { 0 , 1 } x \in \{0,1\} x∈{0,1}的承诺 C o m ( x , A , B ) : = B ⊕ ( x ∧ A ) Com(x,A,B) := B \oplus (x \wedge A) Com(x,A,B):=B⊕(x∧A),发送承诺 C C C给接收者
- 打开阶段:承诺者解承诺 D e c o m ( C ) : = ( x , s ′ ) Decom(C):= (x,s') Decom(C):=(x,s′),公开声明 x x x和随机种子 s ′ s' s′,接收者判断 C = P R G ( s ′ ) ⊕ ( x ∧ A ) C = PRG(s') \oplus (x \wedge A) C=PRG(s′)⊕(x∧A)是否满足
基于加密算法的承诺
- 承诺阶段:接收者随机选择 r ∈ { 0 , 1 } ∗ r\in\{0,1\}^* r∈{0,1}∗发给承诺者,承诺者随机选择密钥 K K K,计算声明 x ∈ { 0 , 1 } ∗ x\in\{0,1\}^* x∈{0,1}∗的承诺 C o m ( x , r ) : = E n c K ( x ∣ ∣ r ) Com(x,r) := Enc_K(x||r) Com(x,r):=EncK(x∣∣r),发送承诺 c c c给接收者
- 打开阶段:承诺者发送密钥 K K K给接收者,接收者解承诺 D e c o m ( c ) : = D e c K ( c ) Decom(c):= Dec_K(c) Decom(c):=DecK(c)得到声明 x x x和随机数 r ′ r' r′,接收者判断 r = r ′ r=r' r=r′是否满足
Pedersen承诺
- 初始化阶段:选择乘法群 G = Z q ∗ G=Z_q^* G=Zq∗,生成元为 g , h g,h g,h,公开三元组 ( g , h , q ) (g,h,q) (g,h,q)
- 承诺阶段:承诺者随机选择 r ∈ Z q r \in Z_q r∈Zq,计算声明 x ∈ Z q x \in Z_q x∈Zq的承诺 C o m ( x , r ) : = g x h r m o d q Com(x,r) := g^xh^r \mod q Com(x,r):=gxhrmodq,发送承诺 c c c给接收者
- 打开阶段:承诺者解承诺 D e c o m ( c ) : = ( x , r ) Decom(c):= (x,r) Decom(c):=(x,r),公开声明 x x x和随机数 r r r,接收者判断 c = g x h r m o d q c=g^xh^r \mod q c=gxhrmodq是否满足
加法同态性质:
C
o
m
(
x
1
,
r
1
)
⋅
C
o
m
(
x
2
,
r
2
)
≡
g
x
1
+
x
2
h
r
1
+
r
1
≡
C
o
m
(
x
1
+
x
2
,
r
1
+
r
2
)
Com(x_1,r_1)\cdot Com(x_2,r_2) \equiv g^{x_1+x_2}h^{r_1+r_1} \equiv Com(x_1+x_2,r_1+r_2)
Com(x1,r1)⋅Com(x2,r2)≡gx1+x2hr1+r1≡Com(x1+x2,r1+r2)
用途:恒等关系验证,证明两数之和等于第三个数,并且不透露具体取值。
基于二次剩余的比特承诺
- 初始化阶段:选择素数 q ≡ 3 m o d 4 q\equiv3\mod 4 q≡3mod4,群 G = Z q ∗ G=Z_q^* G=Zq∗中元素 y ≡ − 1 m o d q y \equiv -1 \mod q y≡−1modq,公开二元组 ( y , q ) (y,q) (y,q)
- 承诺阶段:承诺者随机选择 r ∈ Z q r \in Z_q r∈Zq,计算声明 x ∈ { 0 , 1 } x \in \{0,1\} x∈{0,1}的承诺 C o m ( x , r ) : = y x r 2 m o d q Com(x,r) := y^xr^2 \mod q Com(x,r):=yxr2modq,发送承诺 c c c给接收者
- 打开阶段:承诺者解承诺 D e c o m ( c ) : = ( x , r ) Decom(c):= (x,r) Decom(c):=(x,r),公开声明 x x x和随机数 r r r,接收者判断 c = y x r 2 m o d q c=y^xr^2 \mod q c=yxr2modq是否满足
由于 q ≡ 3 m o d 4 q\equiv3\mod 4 q≡3mod4,所以Legendre符号满足 ( − 1 q ) = − 1 ({-1 \over q})=-1 (q−1)=−1,因此 x = 0 x=0 x=0当仅当 c = C o m ( x , r ) ∈ Q R q = { c ∈ Z q ∗ ∣ ∃ r ∈ Z q ∗ , r ≡ c 2 m o d q } c=Com(x,r) \in QR_q=\{c\in Z_q^*|\exist r \in Z_q^*,r \equiv c^2 \mod q\} c=Com(x,r)∈QRq={c∈Zq∗∣∃r∈Zq∗,r≡c2modq},这是NP问题。
加法同态性质:
C
o
m
(
x
1
,
r
1
)
⋅
C
o
m
(
x
2
,
r
2
)
≡
y
x
1
+
x
2
(
r
1
r
2
)
2
≡
C
o
m
(
x
1
⊕
x
2
,
r
1
r
2
)
Com(x_1,r_1)\cdot Com(x_2,r_2) \equiv y^{x_1+x_2}(r_1r_2)^2 \equiv Com(x_1\oplus x_2,r_1r_2)
Com(x1,r1)⋅Com(x2,r2)≡yx1+x2(r1r2)2≡Com(x1⊕x2,r1r2)
用途:双方协同掷硬币,硬币正反面取决于异或值。
例子
电子游戏“砸金蛋”:一共有
10
10
10个蛋,其中一个是“金蛋”(可以孵化出小恐龙),其他的都是“银蛋”(只能孵化出小鸡)。玩家选择一个蛋打开,如何让玩家相信是自己没砸中“金蛋”呢?
我们简单地可以给玩家放一段小鸡破壳而出的动画!(开个玩笑)
实际步骤如下:
- 系统随机生成“金蛋”位置,并对 10 10 10个蛋做编码,比如码字 m = 0 b 0010000000 m=0b0010000000 m=0b0010000000表示第三个蛋实际上是“金蛋”
- 系统将 m m m用随机数 r r r做承诺, c ← C o m ( m , r ) c \leftarrow Com(m,r) c←Com(m,r),发送给玩家
- 玩家选择一个蛋打开,比如码字 m ′ = 0 b 0000100000 m'=0b0000100000 m′=0b0000100000表示玩家选择第五个蛋
- 系统做解承诺, D e c o m ( c ) → m , r Decom(c) \rightarrow m,r Decom(c)→m,r,发送给玩家
- 玩家验证 c = C o m ( m , r ) c = Com(m,r) c=Com(m,r),并比较 m , m ′ m,m' m,m′获知自己是否砸开了“金蛋”
这里,承诺的作用是:1. 系统在不知道玩家的选择之前已经生成了“金蛋”位置,即使之后获得了玩家的选择信息,系统再无法更改已有的“金蛋”位置。2. 玩家虽然知道承诺值,但无法获知“金蛋”位置的任何信息,也就只能随机选择一个蛋。即:“金蛋”确实存在,且系统生成的“金蛋”位置与玩家的选择相独立,这是公平的游戏。