本篇将会介绍比特币中所使用的椭圆曲线加密。

比特币中的椭圆曲线加密

上一篇讲到了椭圆曲线的一些基本概念和计算方法,接下来讲一下在比特币中如何使用椭圆曲线加密来生成公钥。

之前讲到过,比特币的私钥为一个随机生成的256bit的数,而公钥是通过计算得到的。

比特币使用了secp256k1标准所定义的一种特殊的椭圆曲线和一系列数学常数。该标准由美国国家标准与技术研究院 (NIST)建立。secp256k1曲线由下述函数定义,该函数可产生一条椭圆曲线: $$ y^2=(x^3+7)\text{ over}(F_p) $$ 其中$p=2^{256}-2^{32}-2^9-2^8-2^7-2^6-2^4-1$,这是个非常大的素数,定义在该有限域上的点的数量无比巨大。

假设我们的私钥为k,那么公钥K=kG,相当于k个G点相加,G的具体值为

79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798,
483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8

计算方法上一章已经讲过了,但大家可能会发现一个问题,k个G相加似乎要计算k次,但k又非常巨大,计算机算到猴年马月才能出结果。其实不然,我们先计算2G=G+G,接着算4G=2G+2G,8G=4G+4G,以此类推,这样复杂度就被降低到O(logn),类似于计算快速幂,256bit的数最多计算256次即可,这样计算机可以很快给出答案。

用这种方法生成的公钥是没有办法快速推算出私钥的,这就保证了加密算法的安全性,因为已知公钥K和G点,是推算不出私钥k的,只能暴力计算2G,3G,4G,…这在时间上是无法接受的,是一个困难的数学问题。