主页 > www.token.im > 比特币账户私钥、公钥、地址生成
比特币账户私钥、公钥、地址生成
之前ECC算法笔记中记录的公钥生成方法:K = k * G: html
私钥k一般是随机选择的一串数字(sha256加密),然后通过ECC算法生成公钥(K),最后通过单项Hash算法生成比特币地址混帐
描述:github
按键类型
key一共有三种,都是用Base58Check:算法编码成ASCII码
比特币地址生成过程
第一步:私钥(private key)生成数组
伪随机数生成的 256 位私钥示例:安全性
8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3网络
第 2 步:公钥学习
1. 取私钥通过secp256k1椭圆曲线推演公钥生成256bit私钥(前缀04+X公钥+Y公钥):字体
04码
06CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385
FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB
2.计算结果的SHA-256哈希值(32bytes):
2572e5f4a8e77ddf5bb35b9e61c61f66455a4a24bcfd6cb190a8e8ff48fc097d
3. 取上一步结果比特币密钥多长,计算RIPEMD-160哈希值(20bytes):
0b14f003d63ab31aef5fedde2b504699547dd1f6
4. "0x00"):
000b14f003d63ab31aef5fedde2b504699547dd1f6
5.取上一步的结果,计算两次SHA-256哈希值(32bytes)
- --1--- ddc2270f93cc84cc6869dd373f3c340bbf5cb9a8f5559297cc9e5d947aab2536
---2--- 869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612ae eb32850078
6.获取上一步结果的前4个字节(8位十六进制)
869ac57b
7.@ >公钥哈希,将这4个字节加到第4步的结果中作为校验(这是比特币地址的十六进制形式)
000b14f003d63ab31aef5fedde2b504699547dd1f6869ac57b
第三步:地址(地址)
最终被用户使用:使用base58编码转换地址(这是最常见的比特币地址形式)
121bWssvSgsA9SKjR4DbYncEAoJjmBFwog
p>
如何生成私钥
本质上,私钥是一串随机选择的 256 位 01 数字(32 字节 * 8 = 256 位),但是这串数字控制着你比特币账户的所有权,所以这串数字是很重要。为了具有足够的随机性,通常使用密码安全的伪随机数生成器(CSPNG),并且必须有一个足够熵值的源的种子。
比特币客户端软件使用Secp256k1ECDSA标准生成椭圆曲线,使用椭圆生成私钥,然后从私钥生成对应的公钥。
如果你自己选择简单的123456密码,最终生成的账号会是“公交账号”哈哈。
之所以选择32字节,是因为比特币使用ECDSA算法,使用secp256k1曲线。
如何生成公钥
比特币的公钥是通过椭圆曲线密码学生成的(K = k * G),公式中:
p>
比特币使用特殊的椭圆曲线和一系列由 secp256k1 标准定义的数学常数。
上式,以私钥k为起点,乘以预留的生成点G,生成公钥K,由于所有比特币用户的生成点G相同(常数),所以由一个正私钥k生成一个正公钥K,而且是单向的。
# 私钥生成公钥示例(非压缩公钥) private key: de97fdbdb823a197603e1f2cb8b1bded3824147e88ebd47367ba82d4b5600d73 public key: 047c91259636a5a16538e0603636f06c532dd6f2bb42f8dd33fa0cdb39546cf449612f3eaf15db9443b7e0668ef22187de9059633eb23112643a38771c630db911
压缩公钥(压缩公钥)
简单来说,压缩公钥生成地址时,只取未压缩公钥的X部分即可。
从上面的输出例子可以看出,公钥共有130个十六进制字符,共520个字节,前缀为04,其中04表示公钥是未压缩格式,即即,x和y坐标完全存储(各256位),但是从secp256k1的椭圆曲线法可以看出,只要其中一个坐标值已知,就可以得到另一个坐标值求解方程,因为能够只存储这些坐标中的一个可以节省 256 位,从而以压缩格式引入公钥。
上面的 04 前缀表示未压缩的格式。如果是压缩格式,前缀是02或者03。有两个前缀主要是由于等式左边的y(y²=x³+ax+b)。是平方根比特币密钥多长,可以是正数也可以是负数。
以下是与上例对应的压缩格式的公钥值:
private key: de97fdbdb823a197603e1f2cb8b1bded3824147e88ebd47367ba82d4b5600d73
public key compressed: 037c91259636a5a16538e0603636f06c532dd6f2bb42f8dd33fa0cdb39546cf449
如何生成地址(公钥哈希散列)
比特币地址由公钥通过单向加密哈希算法SHA256和RIPEMD160生成,公式如下:
A = RIPEMD160(SHA256(K))
地点:
-K 是公钥
-A是最终生成的地址;
# 生成的地址示例,地址的长度为 40 个 16 进制串,即 160 个bits: private key: de97fdbdb823a197603e1f2cb8b1bded3824147e88ebd47367ba82d4b5600d73 public key compressed: 037c91259636a5a16538e0603636f06c532dd6f2bb42f8dd33fa0cdb39546cf449 address: 52dab5e951ef4848a31b7ead8437df8184acbc54
公钥哈希是你看到的比特币地址。大多数比特币地址是通过base58Check由公钥编码,公钥地址是从512-Bit到160-Bit散列,但并不是所有的比特币地址都是从公钥衍生出来的,很多是虚拟币的脚本标识符(如彩色硬币)通过脚本在比特币网络中创建。
Base58、Base58Check 和压缩格式
我们一般看到的比特币地址都是经过 Base58Check 编码的地址。 Base58Check编码也用于私钥、加密密钥和脚本,用于提高可读性和输入正确性。
下图描述了通过公钥生成Base58Check编码格式地址的全过程:
其中Public Key Hash上面已经生成的地址会是Base58Check编码后的比特币地址格式。
(来自wiki)Base58与Base64相比,不使用数字“0”、大写“O”、大写“I”、小写“l”,以及“+”和“/”符号。
设计Base58的主要目的是:
base58 符号映射表
为了进一步提高安全性,Base58Check 格式在 Base58 的基础上增加了内置的校验和(checksum)。校验和是一个额外的 4 个字节添加到末尾。校验和的生成算法如下:
checksum = SHA256(SHA256(prefix+data))
私钥的前缀是128(即0x80),对应的编码前缀是5,下面是我们的私钥编码的:
// base58编码 de97fdbdb823a197603e1f2cb8b1bded3824147e88ebd47367ba82d4b5600d73 5KWKSRnmzxCjUP1NKR4dNyyHhaZWSGRTbGzBnm1vwgwpoe2AVGQ
以下是Base58Check格式的公钥和生成的地址信息:
// base58编码 public key compressed: 037c91259636a5a16538e0603636f06c532dd6f2bb42f8dd33fa0cdb39546cf449 checksum: 4caf1695 base58check address: 18Z6R1VF7Do8RTHneeGzdVdbgjtXDVPmfS
base58check address: 18Z6R1VF7Do8RTHneeGzdVdbgjtXDVPmfS
便于对应上面理解咱们能够对比看看base58解码后的BTC地址:
Version Public key hash Checksum 00 62E907B15CBF27D5425399EBF6F0FB50EBB88F18 C29B7D93
Base58Check的编码过程:
所以其实比特币中需要展示给用户的大部分数据都是Base58Check编码格式。
笔记总结参考:
学习btc钱包私钥、公钥和地址的生成过程
比特币密钥生成规则和 Go 实现