Appearance
阈值签名笔记
分布式生成私钥
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 每个公证人务必保管好自己的,这是后续签名必须.
4. 验证公钥
每个人对自己的私钥片广播相应的DLogProof, 其他人收集齐以后,通过计算,得到的应该是1.2中的总公钥一致
阈值签名
1. 根据此次选定的签名人(n中的m个)
根据此次选定的签名人集合,依据自己的私钥片生成是此次签名锁使用的私钥片,选定的集合相同,那么每次生成的也会相同的
同时生成此次签名的临时私钥
2. 广播对于此次签名的临时私钥的证明
其他人虽然不知道这个临时私钥是什么,但是通过这个证明,以后如果使用的不一致,可以检测出来.
3. P2P告知其他所有人步骤一生成的KI的密文
使用第一部分秘钥生成协商得到的一一对应的同态公钥加密KI,然后分别发送给相应的人
4. 生成并广播DeltaI
GeneratePhase3DeltaI 依据上一步协商信息,生成我自己的DeltaI,然后广播给所有其他人,需要这些参与公证人得到完整的的Delta 但是生成的SigmaI自己保留,在生成自己的签名片的时候使用
5. 根据Delta生成签名中的R
所有公证人各自生成R,但是他们的R一定相同
6. 各自生成自己的签名片并广播相关证明
这里用到了零知识证明HomoElGamalWitness,后续可以验证收到的其他人的签名片和证明是一致的