1、私钥-公钥-地址
资料:
http://book.8btc.com/books/1/master_bitcoin/_book/4/4.html
http://book.8btc.com/books/6/masterbitcoin2cn/_book/glossary.html
私钥-公钥-地址
- 创建随机私钥 (64 位 16 进制字符 / 256 比特 / 32 字节)
- 从私钥推导出公钥 (128 位 16 进制字符 / 512 比特 / 64 字节)
- 从公钥推导出地址 (40 位 16 进制字符 / 160 比特 / 20 字节)
生成私钥
- 在 Linux 内核中维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。
- 所以在选择生成私钥的随机数方法时,需要选择满足密码学强度的随机数方法,比如 Node 中的 crypto.randomBytes。当你调用 crypto.randomBytes(32) 方法时,它会等待熵池搜集足够的信息后,返回 64 位的随机数,即私钥。
WIF 格式私钥
- 比特币私钥其实是使用SHA-256生成的32字节(256位)的随机数,有效私钥的范围则取决于比特币使用的secp256k1 椭圆曲线数字签名标准。
- 在私钥的前面加上版本号,后面添加压缩标志和附加校验码,(所谓附加校验码,就是对私钥经过2次SHA-256运算,取两次哈希结果的前四字节),然后再对其进行Base58编码,就可以得到我们常见的WIF(Wallet import Format) 钱包导入格式格式的私钥。
生成公钥
-
以一个随机生成的私钥k为起点我们将其与曲线上已定义的 生成点G相乘以获得曲线上的另一点,也就是相应的公钥K。生成点是secp256k1(椭圆算法)标准的一部分,比特币密钥的生成点都是相同的:
-
{K = k * G}
地址生成
-
将公钥通过SHA256哈希算法处理得到32字节的哈希值
-
后对得到的哈希值通过RIPEMD-160算法来得到20字节的哈希值 —— Hash160
-
把版本号+Hash160组成的21字节数组进行双次SHA256哈希运算,得到的哈希值的头4个字节作为校验和,放置21字节数组的末尾。
-
对组成25位数组进行Base58编码,就得到地址。
-
地址A = RIPEMD160(SHA256(公钥K))
-
在比特币中,大多数需要向用户展示的数据都使用Base58Check编码,可以实现数据压缩,易读而且有错误检验。
-
Base58Check编码的比特币地址是以1开头的,
-
Base58Check编码的私钥WIF是以5开头的,未压缩过的以5开头,压缩过的以K 或者 L开头。
-
例: 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn (未压缩)
-
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ (压缩)
-
比特币地址产生的完整过程,从私钥、到公钥(椭圆曲线上某个点)、再到两次哈希的地址,最终产生Base58Check格式的比特币地址。