了解比特币的币友都知道,比特币是一种加密数字货币,主要是因为比特币有着密钥用来保护自己的比特币不被盗,而比特币密钥分为比特币私钥和比特币公钥,其中比特币公钥用来加密并且是可以公开的,说道这里,币圈小白就要问了,比特币公钥是什么?比特币公钥生成原理又是什么?别急,接下来币小哥就来为币圈小白们解答。
比特币公钥定义
公钥是将私钥通过一个椭圆曲线乘法(K = k * G ,其中k是私钥,G是被称为生成点的常数点,而K是所得公钥)的算法计算得来,是真正的比特币地址。
在比特币系统中,一个密钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接收比特币,而私钥用于比特币支付时的交易签名。
公钥和私钥之间的数学关系,使得私钥可用于生成特定消息的签名。此签名可以在不泄露私钥的同时对公钥进行验证。
比特币公钥生成原理是什么?
有了私钥,再通过椭圆曲线算法,就可以产生出公钥啦!这个私钥和公钥是配对的!
椭圆曲线的定义非常简单,满足下面公式的所有(x,y)坐标的集合,就是我们所说的椭圆曲线y^2/modp=(x^3/+7)/modp
上面公式中,mod是取余符号,而p是一个很大的素数,到这一步,公式中就只剩下自变量x和因变量y了,你完全可以把它看成初中学过的二元多次函数,不过,并不是所有实数x都满足这个曲线,所以实际上椭圆曲线是一个散点图,下图是当p为17时,满足上述公式的图形:
spec256k1 椭圆曲线
实际上,p取不同的素数,椭圆曲线会呈现出完全不同的形态,p越大,这个椭圆也就越大,可承载的数值范围也就越大,冲突率会降低,乃至于更安全,所以出于安全性考虑,比特币中采用的是一个特定的椭圆曲线,我们叫它 spec256k1.它是由 NIST(National Institute of Standards and Technology)这个组织确定的。
刚才说p是一个很大的素数,那么 spec256k1 所选的p有多大呢?我们可以看一下
P=115792089237316195423570985008687907853269984665640564039457584007908834671663
这个p可以确定一个椭圆,我们再在其中取一个点(x,y)
X=55066263022277343669578718895168534326250603453777594175500187360389116729240
Y=32670510020758816978083085130507043184471273380659243275938904335757337482424
把该点中的x和y带入上面的公式中,看等式两边是否成立:
Python 2.7.10 (default, Jul 15 2017. 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>x=55066263022277343669578718895168534326250603453777594175500187360389116729240
>>>y=32670510020758816978083085130507043184471273380659243275938904335757337482424
>>>p=115792089237316195423570985008687907853269984665640564039457584007908834671663
>>> (x**3+7)%p – y**2%p
0L
上面是我用Python算出的结果,可以看到时符合预期的。
椭圆曲线运算
上面我们已经认识了椭圆曲线,它看上去很有趣,但我觉得更有趣的是椭圆曲线的运算,公钥的算法就是运用了这些基本运算:
加法运算
无限点(point at infinity)定义
乘法运算