比特币背后的数学
本文翻译自:The Math Behind Bitcoin
原作者:Eric Rykwalder
比特币让初学者感到困惑的一个原因是它重新定义了“拥有”的意义。
传统意义上的“拥有”,比如拥有房子或者金钱,指的是一个人持有该物品,或者通过银行等公信机构代为持有。
然而比特币在这个问题是不同。比特币本身既不存在于某个中央银行,也不存在于本地,所以没有任何机构持有它。它们的存在,只是作为一条记录,被记录在分布式的账本上,这账本叫做区域链。这个账本被复制成很多的副本,放在每台自愿连接在该网络上的计算机上。所谓的“拥有“一个比特币,其实只是意味着该比特币的所有者有能力在区域链上创建一条”转移记录“,将该比特币的这种控制权交给另一个人。是什么确保了这种能力呢?是通过ECDSA-椭圆曲线数字签名算法的私钥和公钥对。这到底是什么意思呢?它又是如何保证比特币的安全的呢?
让我们来揭开它神秘的面纱。
ECDSA是Elliptic Curve Digital Signature Algorithm(椭圆曲线数字签名算法)的缩写。它是一个使用椭圆曲线和有限域对数据进行“签名”的过程,并且该过程能够被第三方监管,即第三方有方式可以确认签名者是唯一可以对该数据签名的人。在比特币中,这里的数据的签名就是转移所有权的操作。
ECDSA中签名和确认签名是两个不同的过程。每个过程都是一系列由算数运算组成的算法。签名算法使用私钥,确认签名使用公钥。我们会在之后的例子中进行阐述。
不过首先,让我们来快速了解一下椭圆曲线和有限域。
椭圆曲线
一个椭圆曲线可以用数学公式表示为:
对于 a = 0 和 b = 7(比特币使用的参数),它的图像如下图所示:
椭圆曲线有一些有用的性质。比如,一条不垂直于坐标轴的直线若与椭圆曲线相交于两点且不是切点,则该直线与椭圆曲线存在第三个交点。再比如,若一条不垂直于坐标轴的直线与椭圆曲线在一点相切,则必相交于另一点。
Point addition (点加),P + Q = R,定义了“过P与Q的直线,交椭圆曲线于第三点R’,R是R’经X轴的镜像点”。用下图比较好理解:
相应的,point doubling (倍点), P + P = R,表示寻找一条直线与椭圆曲线相切于点P,再交于点R’,R’再经X轴对称而得到镜像点R。如下图所示:
以上两个操作被用来做scalar multiplication (标量乘法),R = a P, 表示将点P与自己相加a次。例如:
这个标量相乘的过程可以使用点加和倍点操作来进行简化,如:
这里,7P就被分成了两个倍点操作和两个点加操作。
有限域
有限域在ECDSA中,可以想象成一个预定义的正数的范围,每个计算都必须落入这个范围中。任何超过该范围的数字都会围绕然后掉进这个范围里。
最简单的一个例子就是求余数,也就是所谓的取模(mod)操作。例如,9/7商1余2:
9 mod 7 = 2
这里我们的有限域就是对7取模,在该有限域中所有的取模操作结果都会落入0到6的范围里。
将其放在一起
ECDSA使用椭圆曲线作为有限域中的内容,它们的曲线形状虽然变得完全不同了但是它们背后的性质依然存在。上文提到的等式,在对67取模的有限域中,看起来是下面这个样子:
它现在变成了一些点的集合,所有的x和y的值都是在0到66区间之内的整数。注意,这里“曲线”依然保存了它关于水平的对称性。
点加和倍点现在在视觉上显得有一些不同。画出的线将会以固定的斜率在水平和垂直两个方向上环绕,好似Asteroids(小行星)游戏一样。所以,将两点 (2,22) 和(6, 25)相加是这个样子的:
第三个交点是(47, 39),而它的镜像点是(47, 28)
回到ECDSA和比特币
比特币的协议规定了所有用户使用一套共同的椭圆曲线和有限域的参数。这些参数包括之前见到的方程,域使用的素数模,还有曲线上的一个基点。基点的“顺序”不是单独选择的,而是体现为其它参数的一个函数,可以形象的理解为该点通过自加直到其斜率变为无穷大(成为垂直线)的次数。选择的基点,其“顺序”是一个大素数。
比特币使用非常大的数字作为其基点,素数模和顺序。事实上,所有使用ECDSA的应用,都使用了非常大的值。算法的安全性就是建立在这些值大的基础上的,使其无法被暴力破解或是被反向工程。
就比特币来说:
椭圆曲线的方程为:
是谁选择了这些数字,又是为什么选这些数字呢?很多研究和一系列诡计都是围绕如何选择合适的参数而展开的。最终,一个大的,看似随机的数字,被发现可以隐藏重构私钥的后门。简而言之,这个特殊的发现名为secp256k1,是基于椭圆曲线和有限域在加密学大家庭中的一员。
私钥和公钥
有了以上的基础,现在我们就可以来了解一下公钥和私钥以及他们之间的关系了。简而言之,在ECDSA中,私钥是一个无法预测的介于1和其它数字之间的任何一个值。公钥是通过私钥对某个基点进行放大而派生而来,其值为基数乘以私钥的值。表达式如下:
公钥 = 私钥 * 基点
这表示了私钥最大可能的值(也就是比特币的地址范围)
在连续域中,我们可以画出公钥的点和切线,而在有限域中,存在一些公式来达到相同的目的。使用点加 p+q 来寻找r 的定义如下:
以及,倍点p来寻找r:
(未完待续)