ECDSA

简介

数字签名算法(DSA)在联邦信息处理标准FIPS中有详细论述,称为数字签名标准。它的安全性基于素域上的离散对数问题。椭圆曲线密码(ECC)由Neal Koblitz和Victor Miller于1985年发明。它可以看作是椭圆曲线对先前基于离散对数问题(DLP)的密码系统的模拟,只是群元素由素域中的元素数换为有限域上的椭圆曲线上的点。椭圆曲线密码体制的安全性基于椭圆曲线离散对数问题(ECDLP)的难解性。椭圆曲线离散对数问题远难于离散对数问题,椭圆曲线密码系统的单位比特强度要远高于传统的离散对数系统。因此在使用较短的密钥的情况下,ECC可以达到于DL系统相同的安全级别。这带来的好处就是计算参数更小,密钥更短,运算速度更快,签名也更加短小。因此椭圆曲线密码尤其适用于处理能力、存储空间、带宽及功耗受限的场合。

原理

ECDSA是ECC与DSA的结合,整个签名过程与DSA类似,所不一样的是签名中采取的算法为ECC,最后签名出来的值也是分为r,s。

椭圆曲线的参数

椭圆曲线算法是工作在循环子群上的,因此需要如下几个参数:

  • 素数p,这个值定义了有限域的大小
  • 椭圆曲线的系数a、b
  • 基点G,也称生成元
  • 子群的阶n
  • cofactor h (h = N/n)

KeyGen

  • G为椭圆曲线上的点,q是由G所组成的有限循环群的阶
  • 选取随机数x,x属于[1,q-1]
  • 计算Q=xG
  • 私钥为:x,公钥为:Q

Sign对消息m签名

  • 选取随机数k,k属于[1,q-1]
  • 计算R=kG=(Rx,Ry)以及r=Rx mod q
  • 计算s=k^-1(H(m)+rx) mod q,若r=0或s=0,则另选随机数k,重新执行上面的过程
  • 消息m的签名为(r,s)

Verif

  • 计算u=s^-1H(m) mod q, v=rs^-1 mod q
  • 计算(x1,y1)=uG+vQ,r1=x1 mod q
  • 判断r和r1的关系,如果r=r1,则签名有效,否则签名无效

小结

不太会用Markdown的公式,所以先凑活写一下,以后会用了,再更新!

ECDSA在Bitcoin中的应用

主要应用于,transaction的签名,签名存放在解锁脚本的ScriptSig中,所以在签名中存在两个字段r,s。下面我们来具体分析下今天我看的东西。

Signature

  • 选取一个随机数d,计算Publickey=dG
  • e=hash(message)
  • 选取一个随机数k
  • (x,y)=kG,r=x
  • s=(e+rd)/k
    sig:(r,s)

看着似乎没有什么问题,但是我们如果使用同一个随机数k,即k1=k2

  • (x1,y1)=k1G
  • (x2,y2)=k2G

因为k1=k2,所以x1=x2,y1=y2,所以r1=r2

  • sig1:[r,(e1+rd)/k]
  • sig2:[r,(e2+rd)/k]
  • s1=(e1+rd)/k,s2=(e2+rd)/k
  • 两个等式左右同时相减得到:s1-s2=(e1-e2)/k,即:k=(e1-e2)/(s1-s2)
  • 得到k之后就可以计算:d=(s1k-e1)/r

小结

综上所述,即可以得到私钥d,所以如果同一用户下的交易签名r字段相等,就可以得到私钥,进而造成账户金额被盗等重大问题,索尼以前就犯过这样的错误:PlayStation 3 只能运行被索尼的进行ECDSA签名的游戏。如果我想为PlayStation 3开发了一个新的游戏,除非我从索尼获得签名值,否则我及时发布了,也运行不了这个游戏。问题是,索尼签名时用了一个静态的k值而不是随机生成的。所以k的保密性非常重要,且random number也保证其唯一性。它只是介绍的在Bitcoin中,在其他的与Bitcoin相关的加密货币中是否也存在这样的情况,我还要进一步的研究,并且它只是考虑了在同一个用户下会出现这样的情况,那么在不同的用户呢,或者不仅仅是签名r相等呢!

我的主页:Stride Max Zz欢迎大家访问!

发布了23 篇原创文章 · 获赞 1 · 访问量 1540

猜你喜欢

转载自blog.csdn.net/qq_35324057/article/details/104261121