比特币中的加密算法

阅读要求:已经了解加密算法的分类,了解什么是非对称加密及密钥的概念,了解比特币的交易流程

在比特币我们的钱包地址,和我们自己保存的私钥是怎么来的?那是不是还有公钥呢?

没错,产生私钥的同时,的确产生了公钥,他们是成对存在.

其实钱包地址就是公钥另一种存在形式,怎么理解?

公钥长这样:

0406CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

我们通常看到的钱包地址是这样的:

1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7

我们对公钥,分别进行了SHA256RIPE160BASE58,也就是两次哈希散列加密,一次编码操作.

得到钱包地址.

总结流程:

产生私钥->产生公钥->产生钱包地址

比特币中私钥,公钥,钱包地址关系如下图:
image

我将从产生私钥到钱包地址的产生,分成9步:

先上图:

v2-75d938393614bf24b2b0f55ed553d7ba_r.jpg

第一步:随机生成私钥

私钥是随机数,32字节,范围:1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE,那我们生成一个合法的私钥:

8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3

第二步:利用椭圆曲线加密(ECDSA)生成公钥

椭圆曲线加密算法(ECDSA-SECP256K1),目前无法被破解,由此我们生成非压缩形式的公钥,一共66字节,字节被分为三个部分,1.标志位:0x04;2.32字节X坐标;3.32字节Y坐标

公钥X:

06CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385

公钥Y:

FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

标准公钥:

0406CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

第三步:计算标准地址的SHA256哈希值

公钥第一次散列哈希,便于表达,我将哈希值记为X

2572e5f4a8e77ddf5bb35b9e61c61f66455a4a24bcfd6cb190a8e8ff48fc097d

第四步:进一步计算RIPEMD-160

将X进行RIPEMD-160哈希计算,我们记为Y

0b14f003d63ab31aef5fedde2b504699547dd1f6

第五步:加入地址版本号(比特币主网版本号"0x00")

我们在Y前面加上16进制的0x00,记为Z,如下:

869ac57b000b14f003d63ab31aef5fedde2b504699547dd1f6

第六步:计算SHA-256哈希值

将Z再进行两次SHA-256计算,得到哈希P

ddc2270f93cc84cc6869dd373f3c340bbf5cb9a8f5559297cc9e5d947aab2536

再来一次,这里就是P了

869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078

第七步:取得P的前4字节(8位16进制)

869ac57b

第八步:将取得的4字节添加到Z后面,作为校验码

这也就是比特币钱包地址的16进制形态了:

000b14f003d63ab31aef5fedde2b504699547dd1f6869ac57b

第九步:用Base58编码,变换地址格式,唯一可以反向推导的步骤

对上一步结果进行Base58编码:

1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7

思考:公钥理论上是可以推出私钥,但是非常困难,作为数字资产,我们肯定需要严谨,所以我们对公钥进行了散列处理,就得到我们所用的钱包地址,这注定是不可逆的,就保护了公钥和私钥的安全.

还想提一点,比特币除了生成钱包用到了SHA256,在挖矿时,也就是矿工处理加工交易信息时,同样也是用的SHA256.