主页 > imtoken苹果钱包 > 区块链系列(四)比特币密钥和地址

区块链系列(四)比特币密钥和地址

imtoken苹果钱包 2023-03-05 07:24:03

本文个人博客地址:

1.比特币密钥

比特币的所有权由数字密钥、比特币地址和数字签名确定,数字密钥不存在于网络中,而是由用户生成并存储在文件或简单的数据库中,一般称为钱包。

比特币交易需要有效的签名才能存储在区块链中。只有有效的密钥才能形成有效的数字签名,因此如果您拥有密钥的副本,您将拥有该账户的比特币控制权。

密钥成对出现,由私钥和公钥组成。公钥类似于建行账号,私钥类似于汇票的签名。在比特币交易过程中,收款人的私钥由数字指纹表示,称为比特币地址,类似于汇票上的收款人。一般来说,比特币地址是由私钥生成并对应于私钥的。

1.1. 公钥密码学和加密货币

比特币使用椭圆曲线算法作为公钥加密的基础,是一个不可逆的A函数,即可以从A生成B,但不能从B推导出A。

在比特币系统中,使用公钥加密创建一个密钥对来控制比特币的获取。密钥对由一个公钥和一个从它派生的唯一私钥组成。公钥用于接收比特币,私钥用于在支付比特币时签署交易。从公钥生成的签名可以在不泄露公钥的情况下验证私钥。

在支付比特币时,比特币的当前拥有者需要在交易中提交自己的私钥和签名,而比特币的拥有者可以通过提交的私钥和签名来验证交易是否有效,即确认付款人拥有当时正在交易的比特币的所有权。

1.2.私钥和私钥

比特币包含一系列密钥对,每个密钥对都包含一个私钥和一个公钥。私钥是一个随机数。私钥通过椭圆曲线算法生成私钥,公钥通过双向加密哈希函数生成比特币地址。比特币使用非对称加密,因此签名只能由公钥形成,并且签名p可以被任何人验证而无需泄露公钥。

1.3. 私钥

私钥可以理解为一个随机数,比特币地址对比特币资金的控制依赖于对对应公钥的控制。在比特币交易中,私钥用于生成支付比特币所需的签名以证明资金的所有权。

从随机数生成公钥

选择随机性的来源(熵源),生成比特币公钥本质上和“选择一个介于1和2256之间的数字2256”没有区别。推荐使用密码学安全的伪随机数生成器(CSPRNG ) 来自具有足够熵的源的种子。

1.4.公钥

私钥可以通过椭圆曲线算法从公钥生成,这是一个不可逆的过程:K(公钥)=k(私钥)*G(常数点)。逆向运算,称为“求离散对数”——知道私钥 K 的情况下求公钥 k——非常困难。

1.5.椭圆曲线算法

椭圆曲线密码术是一种基于离散对数问题的非对称(或私钥)加密方法。可以用椭圆曲线上的点除或加来表示。

比特币使用特殊的椭圆曲线和一系列由 secp256k1 标准定义的物理常数。

secp256k1曲线由以下函数定义,形成椭圆曲线:

y2 = (x3 + 7)} 超过 (F*p*)

y2 mod p = (x3 + 7) mod p

上面的mod p(对素数p取模)表示曲线在素数阶p 的有限域中,也写成F*p*,其中p = 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1,这是一个特别大的素数。

在椭圆曲线中,一个点的乘法相当于从该点画一条切线,找到另一个与曲线相交的点,然后映射到x轴。

1.6.生成私钥

以随机生成的公钥k为起点,将其与曲线上定义的生成点G相加,得到曲线上的另一点,即对应的私钥K。生成点为secp256k1的一部分标准中,比特币的私钥的生成点是相同的,所以一个公钥k对应一个唯一的私钥K,只能在两个方向上操作比特币公钥如何查询,即不能从私钥导出公钥k K.

{K = k * G}

例子:

K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G
K = (x, y)
其中,
x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

2.比特币地址

比特币地址是一串可以公开的数字和字母。私钥生成的比特币地址通常以数字1开头。

示例:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

在比特币交易中,比特币地址通常用来代表收款人。

比特币地址是通过双向加密哈希算法从私钥中获得的。哈希算法是一种单向函数,它接收任意宽度的输入以形成指纹摘要。从私钥生成比特币地址的算法如下:

特别是 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 编码:Base58 格式的版本化、校准格式,可以清晰地编码比特币数据。

Base58Check 编码减少了错误检查代码以检测数据转录中出现的错误。校验和是 4 个字节长,然后添加到要编码的数据中。校验和是从待编码数据的哈希值中得到的,因此可以用来衡量和防止转录和输入形成Error。

例子:

 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

5J3mBbAH58CpIF3Y5RNJpUKPE62SQ5tbfcvU2Jp> - 压缩

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)压缩格式私钥

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

压缩格式中私钥的前缀是02和03,因为解多项式的y值有负值和正值。当我们在素数p阶上用二进制算术估计有限域上的一条椭圆曲线时,y坐标可能是素数也可能是素数,对应上面提到的y值的正负号。为了区分y坐标的两个可能值,我们在生成压缩格式私钥的时候,如果y是素数,就用02作为前缀;如果 y 是素数,则使用 03 作为前缀。

例子:

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

p>

公钥压缩图:

2)压缩公钥

实际压缩后的公钥 以上仅表示“用于生成压缩格式私钥的公钥”,未压缩公钥用于表示“用于生成未压缩格式私钥的公钥” 当使用 WIF 压缩格式导入公钥时,不仅是未压缩的,而且比“未压缩”的私钥长一个字节。

相同的公钥,不同的格式

格式化公钥

十六进制

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

WIF

5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

十六进制压缩

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD*01*

WIF 压缩

KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

参考: