比特币中的非对称加密
阅读要求:已经了解加密算法的分类,了解什么是非对称加密及密钥的概念,了解比特币的交易流程
在比特币我们的钱包地址,和我们自己保存的私钥是怎么来的?那是不是还有公钥呢?
没错,产生私钥的同时,的确产生了公钥,他们是成对存在.
其实钱包地址就是公钥另一种存在形式,怎么理解?
公钥长这样:
0406CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB
我们通常看到的钱包地址是这样的:
1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7
我们对公钥,分别进行了SHA256
和RIPE160
和BASE58
,也就是两次哈希散列加密,一次编码操作.
得到钱包地址.
总结流程:
产生私钥->产生公钥->产生钱包地址
比特币中私钥,公钥,钱包地址关系如下图: image我将从产生私钥到钱包地址的产生,分成9步:
先上图:
image第一步:随机生成私钥
私钥是随机数,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