数字签名
大约 2 分钟
一、数字签名概念
数字签名技术是消息传递进行加密获得的签名。如HTTP请求时将请求体加密。数字签名可以用于证实数字内容的完整性和来源。常见的数字签名算法:**椭圆曲线数字签名算法**。。。
二、数字签名的流程
(1)椭圆曲线数字签名算法:
生成数字签名
获取消息m的数字摘要Hm 即 Hm = h(m);;
使用RFC6979协议,通过私钥pk和m生成确定随机数k;
计算R = k * G,其中R为曲线上的一点,取其横坐标r作为数字签名的一部分,然后计算s,即s = (Hm + r * pk) / k;
得到消息m的数字签名为Sig = <r, s>
验证数字签名
根据Sig,使用对应的公钥P验证其签名;
判断等式s * R = Hm * G + r * P是否成立,成立则通过验证
验证方法解释
由椭圆公式:r 得到 R ;
因为:s = (Hm + r * pk) / k 得到 s * k = (Hm + r * pk);
又因为:P = pk * G;
所以:s * (k * G) = Hm * G + r * (pk * G) ;
推出 s * R = Hm * G + r * P
原理解释:
https://www.cnblogs.com/wsonepiece/p/3977021.html
(2)Schnorr数字签名算法
生成数字签名
计算消息m的数字摘要: Hm = H(m)
生成确定性随机数k,计算 R = k * G , 取R的横坐标 r 作为签名的一部分
计算签名另一部分:s = k + h(P || R || m) * pk
得到数字签名 Sig = <r , s>
验证数字签名
利用公钥P验证其签名
s * G = R + h(P || R || m) * P 是否成立,成立则通过验证
多个签名:
(s1 + .. + S50) * G = R1 + .. + R50 + h1 * P1 + .. h50 * P50
验证方法解释
因为:s = k + h(P || R || m) * pk ;
又因为:P = pk * G ;
所以:s * G = k * G + h(P || R || m) * (pk * G)
所以:s * G = R + h * (P || R || m) * P
由r 得到 R