本文转载自微信公众号: 矩阵元
原创 :胡震恺
前言
隐私计算笔谈系列是矩阵元联合知名密码学学者共同推出的密码学科普系列文章,旨在普及密码学与隐私计算,让密码学触手可及。
ECDSA两方签名
上次我们简单介绍了ECDSA签名和其相关的知识,这次科普我们将会展开介绍ECDSA的两方签名。
ECDSA签名
回顾一下ECDSA的签名,在ECDSA签名中,签名者Alice除了私钥𝑥外,还需要产生一个随机数𝑘,我们将𝑘称为instance key。
思考一下,签名要实现的是不可抵赖性和完整性,完整性要求签名之后文件不可被更改,对于现实中在正规格式的纸质文件上的签名,天然就具有完整性,不可抵赖性则通过签名字迹的独一无二保证。ECDSA签名是具有这两个性质的,现在要实现的是两方签名,那么应该要实现对签名两方的不可抵赖性和完整性。
首先我们观察一下,签名需要的是私钥𝑥和instance key:𝑘,思考一个简单的两方方式:Bob产生自己的instance key:,计算DBob=KBobG,通过Diffie-Hellman密钥交换,将DBob发送给Alice,Alice收到Bob发来的DBob后,产生KAlice,将DAlice=KAlice发送给Bob,这样Alice和Bob就可以计算𝑃=𝑘𝐺=KAlice⋅DBob=KBob⋅DAlice了。但是,直接这么做是有问题的,问题在于Alice虽然没法通过计算出的值,但是Alice是在收到后再产生的,意味着Alice决定𝑃=KAlice⋅DBob的能力,这和协议的公平性相违背,Alice和Bob应该具有相同的权利。
我们要介绍的两方ECDSA签名协议是由Jack Doerner等人在18年提出的,签名协议中的𝐻(⋅)是哈希函数,假设协议开始之前SKA和SKB是私钥SK的两个乘法share,即SK=SKA⋅SKB,已经分别由Alice和Bob所持有,对应的公钥pk已经公开,𝑝𝑘=SKA⋅SKB⋅𝐺,具体实现方式可通过之前介绍的混淆电路,也可通过ABY等,此处不再重复。两方签名流程为:
1. Bob产生自己的instance key:KB,并计算DB=KB⋅𝐺,将DB发送给Alice。
2. Alice产生自己的instance key:K’A,并计算=K’A⋅DB,K’A=𝐻(R’) +K’A,𝑅=KA⋅DB。
3. Alice产生一个随机数𝛼,和Alice和Bob间运行一个两方乘法协议FMul,Alice的输入是,Bob的输入是。两方乘法协议我们之前的科普已经介绍过多个了,如Beaver Triple、ABY等,任选一个即可。二者分别拿到乘法结果的Share,分别记为,且满足:
接着Alice和Bob再运行一次FMul,Alice输入,Bob输入,将Alice和Bob分别拿到的FMul的输出记为,且满足
4. Alice将发送给Bob,Bob计算𝑅=𝐻(R’)⋅DB+R’,将𝑅在椭圆曲线上的坐标记为。
两方密钥交换
签名之后的签名阶段,以及一致性和正确性验证过程为:
5. Alice和Bob计算m’=𝐻(𝑚)
6. Alice计算第一次验证值,用加密𝛼获得密文,之后Alice将发送给Bob。
7. Alice计算她签名的share:sigA和第二次验证值,Alice用加密sigA获得密文,将发送给Bob。
8. Bob计算验证值,并对签名进行重构:
9. Bob利用他自己的公钥pk来验证(𝑠𝑖𝑔,rx)是否是一个合法的签名,如果合法则输出(𝑠𝑖𝑔,),不合法则报错。
两方签名及验证
对正确性验证的详细分析部分我们将留在下次科普进行,并在之后介绍ECDSA的多方签名。
Rosetta GitHub:
https://github.com/LatticeX-Foundation/Rosetta
本文转载自https://mp.weixin.qq.com/s/F2AxgDJde9Yv0Cf9pKv2Ew