主页 > imtoken苹果闪退 > 比特币私钥和公钥生成密码学详解及python模拟

比特币私钥和公钥生成密码学详解及python模拟

imtoken苹果闪退 2023-03-03 07:32:10

特别是 SHA256 和 RIPEMD160。

例子:

# K是公钥,A是生成的比特币地址。
A = RIPEMD160(SHA256(K))

通常用户看到的比特币地址是经过Base58Check编码的,它使用58个字符(一种Base58编号系统)和校验和,提高可读性,避免歧义,有效防止地址转录和输入错误。

从公钥生成比特币地址的过程:

2.1. Base58 和 Base58Check 编码 2.1.1. Base58

Base58 是一种基于文本的二进制编码格式,用于比特币和其他加密货币。

特点:

Base58 是 Base64 编码格式的子集,使用大小写字母和 10 个数字,丢弃了一些在特定字体中容易误读和混淆的字符。 Base58 在 Base64 中不包含 0(数字 0)、O(大写 o)、l(小写 L)、I(大写 i)以及“+”和“/”字符。

即Base58由大小写字母和数字组成,不包括(0, O, l, I) (26+26+10-4=58)。

比特币的 Base58 字母表

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

2.1.2.Base58Check

Base58Check encoding : Base58 格式,版本化,验证过的格式,可以清晰的编码比特币数据编码格式。

Base58Check 编码添加了错误校验码,用于检查转录中的数据发生的错误。校验码长 4 个字节,加在要编码的数据之后。校验码是从待编码数据的哈希值中得到的,因此可以用来检测和避免转录和输入。错误。

例子:

 checksum = SHA256(SHA256(prefix+data))

结果由前缀、数据和校验和三部分组成。

Base58Check编码过程

Base58Check 版本前缀和编码结果

键入版本前缀(十六进制)Base58 格式

p>

比特币地址

0x00

1

支付脚本哈希地址

0x05

3

比特币测试网地址

0x6F

m 或 n

私钥 WIF

0x80

5、K 或 L

BIP38 加密私钥

0x0142

6P

BIP32 扩展公钥

0x0488B21E

xpub

2.2.密钥格式

公钥和私钥可以有多种编码格式。密钥以不同格式编码后,虽然结果可能看起来不同,但密钥编码的数字不会改变。这些不同的编码格式主要是供人们使用和使用而不会出错的。找出钥匙。

2.2.1.私钥格式

私钥可以用多种不同的格式表示,所有这些格式都对应同一个 256 位数字。

1)私钥表示(编码格式)

键入版本说明

十六进制

64 位十六进制数字

WIF

5

Base58Check 编码:Base58 版本前缀为 128 和 32 位校验和

WIF 压缩

K 或 L

同上,编码前加后缀0x01

2)相同的私钥,不同的格式

下面展示了这三种格式生成的私钥。

格式化私钥

十六进制

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

WIF

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tbfcvU2Jp> - 压缩

KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

这些符号都是表示同一个数字、同一个私钥的不同方式。尽管编码后的字符串看起来不同,但不同的格式可以很容易地相互转换。

3)不同编码格式的转换

将 Base58Check 编码解码为十六进制

$ sx base58check-decode 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128

将十六进制转换为 Base58Check 编码

$sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd 128 
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

将十六进制(压缩格式密钥)转换为 Base58Check 编码

$ sx base58check-encode 1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd01 128
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

2.2.2.公钥的格式

公钥也可以用不同的格式表示,主要分为两种形式:未压缩格式和压缩格式。

公钥是由一对坐标 (x, y) 组成的椭圆曲线上的一个点。公钥通常由前缀 04 后跟两个 256 位数字表示。其中一个 256 位数字是公钥的 x 坐标,另一个 256 位数字是 y 坐标。前缀04用于区分未压缩格式的公钥,压缩格式的公钥以02或03开头。

公钥的组成格式:04

例子:

# x,y值
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
# 公钥K
K=04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

1)压缩格式公钥

压缩格式的公钥主要是为了减少比特币交易的字节数,节省运行区块链数据库节点的磁盘空间。原始公钥有 520 位(包括前缀、x 坐标、y 坐标)。公钥是椭圆曲线(y2mod p = (x3 + 7) mod p)上的一个点(x,y),x坐标已知,可以解方程得到y,存储y坐标可以省略。,这样可以减少一半的字节数的存储。

压缩格式中公钥的前缀是02和03,因为解方程的y值有正负两个值,当我们在素数p阶中用二进制算术计算椭圆时在有限域上的曲线比特币密钥丢失,y坐标可以是奇数也可以是偶数,对应于上面提到的y值的正负号。为了区分y坐标的两个可能值,我们生成一个压缩格式的公钥,如果y为偶数,则前缀02;如果 y 是奇数,则前缀 03。

例子:

# 前缀03,表示y坐标是奇数
K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A

公钥压缩图:

2)压缩私钥

压缩的私钥实际上只是表示“用于生成压缩格式的公钥的私钥”,而未压缩的私钥用于表示“用于生成未压缩格式的公钥的私钥”。当使用 WIF 压缩格式导出私钥时比特币密钥丢失,不仅 Compressed 并且比“未压缩”的私钥长一个字节。

相同的私钥,不同的格式

格式化私钥

十六进制

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

WIF

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

十六进制压缩

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD*01*

WIF 压缩

KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

参考: