BTC中的签名算法ECDSA
2019-02-03 本文已影响0人
_AlphaBaby_
数字签名
如果要了解ECDSA算法必须先要知道数字签名是什么?有什么用?然后再去讨论应该怎样构造数字签名。
这篇文章我会以这样的思路去叙述?如果对数字签名已经了解足够多的读者可以跳过前面部分直接看后面部分的具体算法。
什么是数字签名?
百度百科是这样给出的定义:
- 数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
- 数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名
确实给出的定义比较术语性很强,我猜大部分才接触的同学都很迷茫吧!不用担心我下面用"口水话"给大家解读一下。
我们比如在很多场合都会要求签名(这里指的签名是传统签名),也就是用个签字笔在某个百万合同上签字。然后这个合同就生效了。我们反问为什么生效了呢?因为上面有你的签名呀,怎么说这个名是我签的呢?因为这是你的字迹呀!可能又有人会问着为什么不是别人模仿的签名,签名可以伪造是不假。但是确实需要成本,或者伪造的难度很大。(在这里我们是放到一个理想的环境中,也就是签名是不能做假的,进而说,如果这么好造假,那为什么到现在为止还是在沿用这种签名的方式呢?)。既然我们在合同上签字了,说明我们自己认可了这个合同,别人看到这个合同也是知道是我在上面签字的(因为上面是我们自己的名字,所以别人当然认识了(排除他是个草书大师))。数字签名的功能
- 接收方能够核实发送方对报文的签名;
也即是说别人收到了这个合同的人,认识你的字迹,知道这个签名是你写的 - 发送方事后不能抵赖对报文的签名:
你违约后别人拿着当初的合同来找你赔款你是不能抵赖的,因为你的签名就写在这上面 - 保证数据的完整性,防止截获者在文件中加入其它信息;
当项目做完后,你们双方都是可以验证这份合同中途没有被篡改过,还是当初的那份合同
上述三个功能也就对应了数字签名在比特币中的作用: - 签名证明私钥的所有者,即资金所有者,已经授权支出这些资金。
- 授权证明是不可否认的(不可否认性)。
- 签名证明交易(或交易的具体部分)在签字之后不能被任何人修改。
ECDSA数学实现
首先我们要对一个合同(不是传统意义上的纸质合同,是pdf的一个数字合同)进行数字签名,我们用M来表示这个合同。
在ECDSA中首先,生成一个随机的密钥对,也就是一个私钥和其对应的公钥,私钥私钥不知道的同学可以参考我前面的文章《BTC中的密码学》
这个随机的密钥对是怎么生成的呢?首先是计算机生成一个随机数(伪随机,其实目前的计算机都不能生成一个数学意义上真正的随机数,都是生成的一个伪随机数,只不过这个随机数的周期是特别大的,记住是特别大,大得你超乎想象,所以就算别人要破解这个随机数,也是要付出特别大的代价的),价格这个随机数是k,这个k便是随机私钥了,然后计算出公钥P=k*G。
接下来我们再生成签名,签名包含两部分,为R,另外一个为S
符号解释
- 大写的P值的是前面生成的随机公钥,P其实是一个坐标点(为什么是这样参考椭圆曲线算法,也可以看看前面我给出的文章)
- Hash(M)是用哈希函数计算一个合同的哈希值,也可以加做计算合同的数字指纹
- dA是你自己的私钥,这是保密的,不能给别人泄露的,泄漏了别人就可以伪造了
- p是我们在椭圆曲线中,选定有限域的时候选定好的一个大整数
- R是临时随机密钥对中公钥P的x坐标
提醒
其中的k的-1次方并不是我们高中所学的就是等于1/k,这里的-1次方是值得是k的逆元。如果要真正理解逆元的概念推荐去学一下离散数学。这里就不过多的解释了。
这样我们就生成了这个合同的数字签名
我们可以把这个数字签名加上合同M发给别人了,然后别人就可以用你的公钥和合同还有签名就可以验证这个合同了,具体的验证如下:
这样把别人发来的合同和签名,在加上签名着的公钥(公钥匙公开的,这里不讨论怎么获取到签名者对应的公钥),把这些东西向上面计算出一个P'出来,然后得到一个P'的x坐标x',然后对比R和x'是否相等,那么验证签名成功,那就说明这合同是某某人发出来的,并且没有被篡改。
下面我给大家证明下这个为什么成立(数学要求比较强,可忽略)
符号解释
- PA是签名者的公钥,是dA对应的公钥
- 其他的符号和上面一样
其中内容部分参考于,《精通比特币第二版》
推荐国外一大佬文章:Understanding How ECDSA Protects Your Data.