零基础学区块链
上QQ阅读APP看书,第一时间看更新

2.2.3 公钥密码算法

在区块链技术中,涉及比特币的交易都是依靠公钥密码技术来实现的,可以说公钥密码技术是区块链技术体系中很重要的一环。

在公钥密码中,密钥分为加密密钥和解密密钥。加密密钥只是发送方使用,用来对发送数据加密;解密密钥只是接收方使用,用来解密接收数据。如图2-28所示。

图2-28 公钥密码体系

由图2-28可知,加密密钥只能用来加密消息,不能用来解密消息。在公钥密码体系中,加密密钥一般是公开的,不必担心被窃取,所以加密密钥又称公钥(public key);相反,解密密钥是绝对不能被公开的,所以解密密钥又称私钥(private key)。公钥和私钥是数学上一一对应的关系,一对公钥和私钥统称为密钥对(key pair)。实际使用中,先生成密钥对,把公钥发给需要和自己通信的对象,让其用公钥对通信信息加密,私钥留给自己用于解密。

比特币体系中使用椭圆曲线密码学(Elliptic Curve Cryptography, ECC)创建密钥对。这是一种基于离散对数问题的公钥密码算法,它的特点是在相同的安全级别下,所需的密钥长度比现在最广泛应用的公钥密码算法RSARSA加密算法是一种公钥密码算法,由Ronald Rivest、Adi Shamir和Leonard Adleman于1977年一起提出。RSA是第一个能同时用于加密和数字签名的算法,所以也是被研究最广泛的公钥密码算法。RSA密钥长度越大,保密性越高,现在RSA密钥长度至少为500位,一般推荐使用1024位。目前仍没有可靠破解RSA算法的方法。还要短。椭圆曲线密码算法通过将椭圆曲线上的特定点进行特殊的加法或乘法操作,并利用该算法很难进行逆操作的特点来保证加密性。比特币使用的是美国国家标准技术研究所发布的secp256k1标准中定义的一条特定的椭圆曲线和一些数学常量,该特定的椭圆曲线类似图2-29所示。下面对椭圆曲线密码算法作简要介绍部分内容摘自高效密码学标准(Certicom Research),见http://www.secg.org/sec2-v2.pdf。

图2-29 椭圆曲线图

secp256k1标准中定义的椭圆曲线方程为:y2modp=(x3+7)modp,也可写为:(y2x3-7)modp=0,其中modp表示对素数p取模,这也表明了这个椭圆曲线是在素数幂p的有限域内。要满足椭圆曲线方程,则必须满足:y2x3-7=k×p,其中k是任意整数,而p=2256-232-29-28-27-26-24-1,这是一个非常大的素数,所以这个椭圆曲线可以想象成一个巨大二维网格里的复杂的散列点,很难可视化。作为一个例子,图2-30显示了素数幂p为17时有限域内的椭圆曲线,横轴是x,纵轴是y,图中点的坐标为(xy),比如图中(3,0)这个点就满足secp256k1定义的椭圆曲线方程。实际应用中的p比素数幂17大很多。

图2-30 素数幂17的椭圆曲线

在椭圆曲线的数学理论中,有个特殊点叫“无穷远点”,类似于加法里的0。在计算机系统中,“无穷远点”有时表示为x=y=0,称为零元,虽然该值代入椭圆曲线方程并不成立,但可以当作特殊情况进行检验。

还有一个“+”运算符,类似于实数相加。假设椭圆曲线上有两点P1P2,那么在曲线上必定存在第三个点P3=P1+P2。在几何图形学中,椭圆曲线上成一条直线的三个点,其和为零元,即P1+P2+P′3=0。

P1+P2+P3=0⇒P1+P2=-P3P3=-P′3

第三个点P3可以由P1P2之间画一条线来确定,这条直线刚好与曲线相交于另一点P′3=(xy),过P′3y轴的平行线与曲线相交于P3,如图2-31所示。P3称为P′3的负元。

图2-31 椭圆曲线加法示意图

P1P2是同一点,则P1P2之间的连线与曲线相切于P1,曲线上有且只有一个点与该切线相交。可用微积分来求该切线的斜率,如图2-32所示。

图2-32 P1P2在同一点,P1P2之间连线为点P1的切线

如果P1P2具有相同的x,不同的y,则P1P2的连线是垂直的。如图2-33所示,P1P2的连线与椭圆曲线没有再次相交的可能,所以P3就是“无穷远点”。

图2-33 P3为“无穷远点”

如果P1是“无穷远点”,则P1+P2=P2;类似地,如果P2是“无穷远点”,则P2+P1=P1,这时“无穷远点”就与数字0具有一样的加法性质。事实证明,运算符“+”满足结合律,(P1+P2)+P3=P1+(P2+P3)=P1+P2+P3。至此,我们定义了加法。给定椭圆曲线上的点P,如果k是整数,则kP=P+P+…+Pk次)。

密钥对包含成对的私钥和公钥。私钥是随机生成的一个数,假设为sk,那么相应的公钥K可以通过将sk与椭圆曲线上的预定义点G相乘,得到椭圆曲线上的另一个点,这个点就是公钥,即K=sk×G。预定义点G是由secp256k1标准定义的,在比特币系统中,所有私钥均使用同一个预定义点G来生成公钥,所以只要私钥sk是固定已知的,就能通过sk生成对应的公钥K。但这个操作在数学上只能单向计算,即只能从sk得到K,不能从K反推得到sk,这样就起到了隐匿私钥sk的作用。

为了形象化表示预定义点G和私钥sk相乘,我们采用一个简单的基于实数的椭圆曲线,找到sk×G这个点,即sk个G相加。在椭圆曲线中,一个点与其自身相加等同于在这个点上画一条切线,找到切线与椭圆曲线相交的点,过相交点作y轴的平行线,它与椭圆曲线相交的另一个点就是我们要找的相加之后的点。如图2-34所示,利用几何学在椭圆曲线上获得G、2G、4G、8G,蓝色线为切线,绿色线为x轴上的垂直线,红点就是G、2G、4G、8G,以此类推,最后能在椭圆曲线上找到K=sk×G这个点,而K是由坐标(xy)来表示的,所以公钥K又可以定义为:K=(xy)。

图2-34 椭圆曲线上整数与预定义点G相乘示意图

根据前面介绍可知,通过私钥sk计算出公钥K的公式为:K=sk×G。有人会认为既然预定义点G是已知的,那就能从这个公式推导出私钥sk,实际上这涉及椭圆曲线离散对数问题,它是个单向函数问题,已知sk和G计算K比较容易,但通过KG来计算sk则比较困难,至今仍没有有效的办法来解决。总之,椭圆曲线密码算法的数学原理较为复杂,这里只作简要的介绍,感兴趣的读者可以查看相关的密码学书籍。