Skip to content
On this page

阈值签名笔记

分布式生成私钥

1.1 DLogProof

每个公证人都生成自己的随机数,这个随机数也就是后续feldman vss的种子 同时也生成同态加密用的私钥.

通过广播DLogProof证明这个随机数对应的公钥自己知道

1.2 所有人收到其他人的DLogProof

得到最后生成的私钥的公钥,

2.1 同态加密私钥的证明

使用NICorrectKeyProof 生成步骤1中随机生成的同态加密私钥的证明,证明这个私钥自己拥有.后续要使用它来做同态加密

2.2 所有人收集并验证其他人的同态加密公钥

保存下一步使用 这个是在签名的时候使用

3.1 根据n,m生成ShamirSecretSharing

GeneratePhase3SecretShare phase 3.1基于第一步的随机数生成SecretShares, 假设有三个公证人,我的编号是0 0 生成的shares[s00,s01,s02] 1 生成的shares[s10,s11,s12] 2 生成的shares[s20,s21,s22] 那么分发过程是 0: s01->1 s02->2 1: s10->0 s12->2 2: s20->0 s21->1 最终收集齐以后: 0 持有[s00,s10,s20] 累加即为私钥片x0 1 持有[s01,s11,s21] 累加即为私钥片x1 2 持有[202,s12,s22] 累加即为私钥片x2 每个公证人务必保管好自己的XiX_i,这是后续签名必须.

4. 验证公钥

每个人对自己的私钥片广播相应的DLogProof, 其他人收集齐以后,通过计算,得到的应该是1.2中的总公钥一致

阈值签名

1. 根据此次选定的签名人(n中的m个)

根据此次选定的签名人集合,依据自己的私钥片XiX_i生成WiW_iWiW_i是此次签名锁使用的私钥片,选定的集合相同,那么每次生成的WiW_i也会相同的

同时生成此次签名的临时私钥

2. 广播对于此次签名的临时私钥的证明

其他人虽然不知道这个临时私钥是什么,但是通过这个证明,以后如果使用的不一致,可以检测出来.

3. P2P告知其他所有人步骤一生成的KI的密文

使用第一部分秘钥生成协商得到的一一对应的同态公钥加密KI,然后分别发送给相应的人

4. 生成并广播DeltaI

GeneratePhase3DeltaI 依据上一步协商信息,生成我自己的DeltaI,然后广播给所有其他人,需要这些参与公证人得到完整的的Delta 但是生成的SigmaI自己保留,在生成自己的签名片的时候使用

5. 根据Delta生成签名中的R

所有公证人各自生成R,但是他们的R一定相同

6. 各自生成自己的签名片SiS_i并广播相关证明

这里用到了零知识证明HomoElGamalWitness,后续可以验证收到的其他人的签名片和证明是一致的

7. 广播Si,各自组合得到完整的签名