[以太坊源代码分析] IV. 椭圆曲线密码学和以太坊中的椭圆曲线数字签名算法应用

数字签名算法在Ethereum中的应用不少,目前已知至少有两处:一是在生成每个交易(Transaction, tx)对象时,对整个tx对象进行数字签名;二是在共识算法的Clique算法实现中,在针对新区块进行授权/封印的Seal()函数里,对新创建区块做了数字签名。这两处应用的签名算法都是椭圆曲线数字签名加密算法(Elliptic Curve Digital Signature Algorithm,ECDSA)。Ethereum 在采用ECDSA进行数字签名的基础上,基于自身的业务需求,又将数字签名过程所用的公钥作为地址类型(common.Address)对象,在许多应用场景下作为地址(即账户的唯一标识符)使用。

有关ECDSA的几个理论概念的关系是这样的:椭圆曲线数字加密算法ECDSA是数字签名算法(DSA)的变例之一,ECDSA的基础是椭圆曲线密码学(Elliptic-curve cryptography,ECC),而ECC的理论前提是椭圆曲线上点的倍积(Elliptic curve point multiplication)。本文将从这些概念的原理讲起,试图讲解一下Ethereum所采用ECDSA的来龙去脉。

1.椭圆曲线点的倍积

概念知识

椭圆曲线的点倍积(point multiplication),指的是椭圆曲线上一个点沿着这条曲线不断的与自身相加,最终落在曲线另一个点上的(计算)过程。也许有些地方会把这里的multiplication翻译成“乘积”或“乘法”,那样的话就要特别注意,这种所谓的“点乘积”,是特指一个标量与一个点的乘积,它属于一种标量乘法(scalar multiplication)。所以,个人觉得将这里的point multiplication翻译成“点倍积”会更准确些,本文会沿用这种翻译。

假设起点是椭圆曲线点P,终点是曲线上点R,于是我们有如下点倍积公式,注意此时标量一定要写在点的左边。

R = nP

上式中的结果R点暂时还计算不出来,我们需要多一些准备。理论上,这里的椭圆曲线所选择的几何方程是固定的,它可以表示为:

y^2 = x^3 + ax + b

上式中a和b都是普通标量参数,以上方程所绘出的几何曲线如下图所示,其中红色曲线表示(a, b) = (-7, 6)时的椭圆曲线,蓝色曲线表示 (a, b) = (-6, 6)时的椭圆曲线。显然,a和b的取值对曲线形状还是有影响的。



现在有了椭圆曲线的具体形状和方程,假设曲线上有一个点P,我们想计算它的倍积nP,该怎么做呢?

这里需要再引入一个概念:椭圆曲线点的相加(point addition)。以上图为例,红色椭圆曲线上有两个点PQ,设定这两个点相加得到一个同样处于曲线上的R点,这个R点来自P, Q两点直连延长线与椭圆曲线的交点(T点)的共轭点,也就是T点沿X轴的对称点R。由于上述椭圆曲线本身必定沿X轴对称,所以这个R点也必定处于曲线上。

我们从代数的角度重新看下这个问题:

这里我们用XY坐标来表示P,Q,R每个点,结合设定的椭圆曲线公式 y^2 = x^3 + ax + b,可以得到如下解答:


通过引入一个参数lambda,我们可以得到P,Q两点相加得到R点的坐标。

很好,我们再往前跨出一步,如果P点和Q点重合,那么它们相加R点是怎样的呢?这种情况被称之为椭圆曲线点的翻倍或叠加(point double),根据上式,R点的x,y相对坐标不变,我们只需要用一个特殊的lambda值就行了,不过要留意此时的lambda取值跟曲线方程参数a有关:

好的,在拥有了以上这些基础知识之后,我们终于可以计算出椭圆曲线点的倍积,因为对于 R = nP无论n取何值,我们都可以通过上述“点相加”和“点翻倍”的方法计算出R点坐标

计算方法

我们来看下具体的如何计算椭圆曲线点倍积 Q = dP,即已知椭圆曲线点P和标量d,计算出曲线点Q。

开始写代码前需要将标量d以二进制的方式表示出来,以便于应用“点相加”和“点翻倍”方法。

上式就是d的二进制表示,代码中将各个系数表示成一个长度为(m+1)的数组d[]即可,d[i]对应于第i个bit位的取值0或1。下列伪代码均来自wiki-PointMultiplication

最直观的就是迭代型的,比如自底向上的迭代:

// iterative: index increasing
N = P; Q = 0;
for i in [0, m] do:
    if d[i] == 1  then Q = point_add(Q, N)
 
  • 14
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值