主页 > www.token.im > 比特币账户私钥、公钥、地址生成

比特币账户私钥、公钥、地址生成

www.token.im 2024-01-17 05:09:45

之前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 实现