MPC之TSS-LIB源码分析2 -- 源码中的算法

椭圆曲线签名算法

k=rand(N)R=kGr=R.xs=hmac(message)+r.skksign=(r,s)k = rand(N)\\ R = k * G\\ r = R.x\\ s = \frac{hmac(message) + r . sk}{k}\\ sign = (r, s)\\

以上为ECDSA的签名公式,具体解释可以在网上找下相关文章就可以了。

拉格朗日差值算法

已知xnx_n, 求yn{y_n}

y=a+bx2+cx3...xi={x0,x1,x2...}yi={y0,y1,y2...}yn=i=0yilargrange_basis(xn,i,xi)\begin{aligned} y = a + b * x^2 + c * x^3 ... \\ x_i = \{ x_0, x_1, x_2... \} \\ y_i = \{y_0, y_1, y_2...\} \\ y_n = \sum_{i = 0} y_i * largrange\_basis(x_n, i, x_i) \end{aligned}

这部分主要是用在了签名的时候,对于秘钥的求解过程。可能这么说不是很准确,因为秘钥自始至终都没有出现过,应该说是秘钥相关的计算过程中

Schnorr

其中用到了DLogProof其实就是用到了Schnorr的证明算法,并且用的是非交互式的,即不用交换随机数,直接通过hash来做随机数。

Schnorr协议
Schnorr签名算法

其实Schnorr更多被人提到的场景是聚合签名。它可以将多个签名聚合到一起,一次性进行验证,在很多场景下都有不错的表现。

Paillier算法

通过查询资料我们可以得知,Paillier加密算法的主要主要特性和应用是可以进行加法的同态加密计算。因为只能进行加法同态加密,不支持乘法,所以属于半同态加密算法。

Paillier同态加密算法简单解释如下:

对于任意明文消息m,均可通过加密公式 c=E(m)c = E(m) 得到密文c , 同样也有 m=D(c)m = D(c) 对称的解密操作;

对于任意明文 m1 m2, 对应密文 c1 c2 则有

\begin{cases} c_1 * c_2 = E(m_1 + m_2) \\\ m_1 + m_2 = D(c_1 * c_2) \\\ E(m_1)^{m_2} = E(m_1 * m_2) \\\ m_1 * m_2 = D(E(m_1){m_2}) \end{cases}

可以看到,对于明文的加法,可以直接先对密文进行乘法计算后,再进行解密直接得到结果。

关于Paillier算法的具体细节和公式等,大家可以自行Google查询,帖子很多,因为涉及数学和学术信息较多,我只简单介绍下他的特性,就不在这里复述别人的文章了。

相关资料

同态加密之Paillier算法

长安链关于Paillier算法的介绍(更清晰简明)

在MPC中的作用

在本系列文章中,Paillier算法主要用在了sign的过程中,在generate中,主要是相互交换秘钥参数等信息,方便后续通信。

Diffie-Hellman 算法

Pk1=Sk1GPk2=Sk2GK=Pk1Sk2=Pk2Sk1=Sk1Sk2G Pk_1 = Sk_1 * G\\ Pk_2 = Sk_2 * G\\ K = Pk_1 * Sk_2 = Pk_2 * Sk_1 = Sk_1 * Sk_2 * G

简单描述就是,A B双方分别生成自己的公私钥对,然后相互交换彼此的公钥,并使用自己的私钥与对方的公钥相乘,这样就得到了同样的一个Key,然后双方就可以使用这个Key来进行对称加密(比如AES),进行信息交换,实现通信加密。

缺点

最主要的缺点就是,公钥交换的时候,可能会遭受中间人攻击。假设有中间人C,在A、B交换公钥的时候,进行拦截和替换,那么后续A/B所有的通信都会被C进行拦截和解密。