Skip to main content

Lindell 17’ {2,2}

Lindell 2017 论文中的 2/2 签名方案,并确保正确地描述数据签名过程。

2/2 签名方案的步骤

1. 密钥生成

两个参与者 P1P_1P2P_2 共同生成一个公私钥对 (PK,SK)(\text{PK}, \text{SK}),并将私钥 SK\text{SK} 分为两部分 sk1s_{k1}sk2s_{k2}。具体步骤如下:

1. 每个参与者生成自己的私钥部分:

  • P1P_1 生成 sk1s_{k1}
  • P2P_2 生成 sk2s_{k2}

2. 公钥 PK\text{PK} 计算为:

PK=(sk1+sk2)G\text{PK} = (s_{k1} + s_{k2}) \cdot G

其中 GG 是椭圆曲线上的基点。

2. 签名生成

两个参与者 P1P_1P2P_2 共同生成签名 (R,s)(R, s)。具体步骤如下:

1. 生成随机数 kk 并计算 RR

R=kGR = k \cdot G

2. 计算哈希值:

e=H(mR)e = H(m \| R)

其中 mm 是待签名的消息,HH 是哈希函数。

3. 每个参与者计算部分签名:

  • P1P_1 计算部分签名 s1s_1 s1=k+esk1s_1 = k + e \cdot s_{k1}
  • P2P_2 计算部分签名 s2s_2 s2=k+esk2s_2 = k + e \cdot s_{k2}

4. 合并部分签名生成最终签名 ss

s=s1+s2s = s_1 + s_2

由于 s1s_1s2s_2 分别由 P1P_1P2P_2 计算,最终签名 ss 为:

s=(k+esk1)+(k+esk2)s = (k + e \cdot s_{k1}) + (k + e \cdot s_{k2}) s=2k+e(sk1+sk2)s = 2k + e \cdot (s_{k1} + s_{k2})

3. 签名验证

使用公钥 PK\text{PK} 验证签名 (R,s)(R, s)。具体步骤如下:

1. 计算哈希值:

e=H(mR)e = H(m \| R)

2. 验证等式是否成立:

sG=R+ePKs \cdot G = R + e \cdot \text{PK}

验证推导

我们知道签名 (R,s)(R, s) 满足:

s=2k+e(sk1+sk2)s = 2k + e \cdot (s_{k1} + s_{k2})

因此:

sG=(2k+e(sk1+sk2))Gs \cdot G = (2k + e \cdot (s_{k1} + s_{k2})) \cdot G sG=2kG+e(sk1+sk2)Gs \cdot G = 2k \cdot G + e \cdot (s_{k1} + s_{k2}) \cdot G

由于 R=kGR = k \cdot G,所以 2R=2kG2R = 2k \cdot G,并且 PK=(sk1+sk2)G\text{PK} = (s_{k1} + s_{k2}) \cdot G,因此:

sG=2R+ePKs \cdot G = 2R + e \cdot \text{PK}

这确保了签名的正确性和完整性。签名验证过程中的等式成立,表明签名 (R,s)(R, s) 是有效的。

总结

Lindell 2017 论文中的 2/2 签名方案通过分布式密钥生成和签名生成,确保签名的生成需要两个参与者的共同合作。其安全性证明基于离散对数假设和随机预言模型,确保抗篡改性和隐私性。具体的证明推导展示了签名生成和验证的正确性,确保了方案的安全性和实用性。