主页 > 怎么在华为下imtoken > 比特币账户私钥、公钥、地址生成

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

怎么在华为下imtoken 2023-07-07 05:12:35

之前ECC算法笔记中记录的公钥生成方法:K = k * G:

私钥k通常是一串随机数字(sha256加密),然后通过ECC算法生成公钥(K),最后通过单项Hash算法生成比特币地址。

说明:

按键类型

key一共有三种,都是用Base58Check编码的ASCII码表示的:

比特币地址生成过程

第一步:私钥(private key)生成

由伪随机数生成的256bit私钥密钥示例:

8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3

第 2 步:公钥

1.通过secp256-bit获取私钥通过secp11ellipse56k发起的请求(请求04+X+Y>请求):

04

06CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385

FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB

2.计算公钥(32bytes)的SHA-256哈希值:

2572e5f4a8e77ddf5bb35b9e61c61f66455a4a24bcfd6cb190a8e8ff48fc097d

3. 取上一步的结果,计算RIPEMD-160哈希值(20bytes):

0b14f003d63ab31aef5fedde2b504699547dd1f6

4. 取上一步的结果,加上地址版本号(比特币主网版本号“0x00”):

000b14f003d63ab31aef5fedde2b504699547dd1f6

5.取上一步的结果,计算两次SHA-256哈希值(32bytes)

---1--- ddc2270f93cc84cc6869dd373f3c340bbf5cb9a5559297 p>

---2--- 869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078

6. 取上一步结果的前4个字节(8位十六进制)

869ac57b

7.公钥的哈希,把这4个字节加到第4步的结果中作为校验(这是比特币地址的十六进制形式)

000b14f003d63ab31aef5fedde2b504699547dd1f6869ac57b

第三步:地址(地址)

最终被用户使用:使用base58编码转换地址(这是比特币地址最常见的形式)

121bWssvSgsA9SKjR4DbYncEAoJjmBFwog

如何生成私钥(private key)

本质上,私钥是一串随机选择的 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的hash,但并不是所有的比特币地址都是从公钥衍生而来的比特币私钥公钥地址,也可能是虚拟币的脚本标识(如作为彩色硬币)通过脚本在比特币网络中建立。

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