主页 > imtoken中文版app > 4. 比特币密钥、地址和钱包 - 比特币精通笔记

4. 比特币密钥、地址和钱包 - 比特币精通笔记

imtoken中文版app 2023-07-05 05:13:28

简介

通过密钥、比特币地址和数字签名确认比特币的所有权。密钥不存在于比特币网络中,而是由用户自己存储,或者由管理私钥的软件钱包生成和管理。网络

比特币交易必须有有效的签名才能存储在区块中,因此拥有密钥意味着拥有相应账户中的比特币。密钥成对出现,由公钥和私钥组成。公钥与银行账号相关,私钥与银行卡密码相关。一般情况下,密钥由钱包软件管理,用户不直接使用密钥。算法

比特币地址一般通过公钥计算,但也可以从比特币脚本中获取。安全

公钥和私钥

比特币私钥一般都是数字,由比特币系统随机生成(由于算法的可靠性与随机性正相关,所以随机性一定是真正随机的,不是伪随机的,所以比特币系统可以作为随机源)生成,然后以私钥作为输入,利用椭圆曲线算法的单向加密函数生成对应的公钥,然后以公钥作为输入,使用a生成地址单向加密哈希函数。例如,通过公钥K获取地址A的计算方法是:server

A = Base58Check(RIPEMD160(SHA256(K)));

image.png

其中 SHA256 和 PIPEMD160 被称为双重哈希或 HASH160,Base58Check 是带有验证功能的 Base58 代码。验证方法是先计算原始数据的验证码(编码前),然后比较编码后数据的验证码。如果地址相同,则地址有效,否则无效。 在使用Base58Check编码之前,需要对数据进行处理。

处理方式为:版本前缀+双哈希数据+校验码

版本前缀是自定义的。比如比特币私钥的前缀是0x80,验证码就是将版本前缀和双哈希数据拼接起来,进行两次SHA256计算,取前4个字节。得到处理后的数据后,进行Base58编码,得到最终结果。

比特币离线钱包

image.png

网络

下图是Base58Check版本前缀和Base58编码的结果

image.png@ >

svg

私钥格式

密钥可以使用不同的编码格式,得到的编码结果也不同,但密钥本身并没有任何变化,采用哪种编码格式,视情况而定,最终目的是为了方便人们使用和准确识别钥匙。

下图是同一私钥使用不同编码方式的结果:

image.png

比特币离线钱包

功能

公钥格式

公钥的格式也有很多种,但最重要的是公钥分为压缩格式和非压缩格式。以 02 开头的公钥标识压缩格式。编码

未压缩的公钥格式

前面说过,公钥是椭圆曲线上的一个点,用一对坐标(x,y)表示,加上前缀,公钥可以表示为:前缀x y。

例如,一个公钥的坐标是:加密

x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

以未压缩格式为例,公钥为(稍长):spa

K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB 

比特币离线钱包

压缩格式的公钥

压缩格式的公钥可以节省一定的存储量,每天数千比特。对于货币交易记录而言,这点节省可以带来很大的不同。

由于椭圆曲线实际上是一个方程(y2 mod p = (x3 + 7)mod P,y2是y的平方,x3是x的立方),而公钥在椭圆上曲线上的一个点,那么公钥就是方程的解,如果公钥中只保留x,那么解方程就可以得到y,压缩后的公钥格式有两个前缀,因为y2,会得到正负两种解,在素数p阶的有限域上用二进制算术计算椭圆曲线时,y坐标是奇数或偶数,所以02表示y是奇数,03表示y是甚至。

image.png

所以压缩格式的公钥可以表示为:前缀x

根据上面公钥的坐标,y为奇数例如公钥K为:

K = 03F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A

不知道你有没有找到。这种压缩方式有一个问题,就是一个私钥可以派生出两个公钥,压缩后的公钥和未压缩的公钥。两个公钥对应同一个私钥,是合法的,但是生成的比特币地址不一样。这就涉及到钱包软件的实现,是使用压缩公钥还是非压缩公钥,或者两者都使用,这个问题后面会介绍。

钱包

比特币离线钱包

比特币钱包的主要功能是为用户保存比特币私钥。比特币钱包有很多种。它就像一个非确定性(随机)钱包和一个积极(种子)钱包。所谓非确定性,是指钱包在运行时会生成足够多的私钥(比如100个私钥),而每个私钥只会被使用一次,这样私钥管理就很麻烦。肯定钱包有一个公共种子,单向离散方程使用种子生成私钥。种子足以恢复所有私钥。因此,当钱包建立时,输入可以通过简单的备份在钱包之间转移。 .

这里专门介绍助记词。助记词是英文单词的序列比特币离线钱包,在 BIP0039 中提出。这些序列对应着钱包里的种子,种子可以生成随机数,随机数可以生成私钥,私钥生成公钥,你需要的东西都有了。所以词序是钱包的备份,通过助记词可以重构钱包,比记住一串随机数要强很多。

BIP0039定义助记词和种子创建过程如下:

1. 创建一个从 128 到 256 位的随机顺序(熵)。

2. 提议 SHA256 哈希的前几位来创建随机序列的校验和。

3.将校验和添加到随机序列的后面。

4. 将序列分成不同的 11 位集合,并使用这些集合对应一个预定义的 2048 个单词的字典

.

5. 为一个单词生成一个 12 到 24 位的助记码。

比特币离线钱包

另一个重要的钱包叫做HD钱包。 HD 钱包提供具有两个主要优势的随机(非确定性)密钥。

首先,树形结构可以用来表达额外的组织含义。例如,当某个分支的子键用于接收交易收入,而另一个分支的子键用于支付费用时。企业环境中可以使用不同的分公司key,可以控制不同的分公司、子公司、具体职能和会计类别。

其次,它允许用户创建一系列公钥,而无需访问相应的私钥。这允许 HD 钱包在不安全的服务器上使用或为每笔交易发布不同的公钥。公钥不需要提前预加载或者派生,但是服务器中没有可以用来支付的私钥。

高级密钥和地址加密私钥 (BIP0038)

BIP0038 提出了一个通用标准,使用密码对私钥进行加密,并使用 Base58Check 对私钥进行加密 编码后,加密后的私钥可以安全地存储在备份媒体上并在钱包之间安全传输,确保密钥安全,不会受到任何可能的泄露此加密标准使用 AES,该标准由 NIST 创建并广泛用于商业和军事应用的数据加密。

BIP0038的加密方案是:输入比特币私钥,通常使用WIF编码,base58chek字符串以“5”为前缀。此外,BIP0038 加密方案需要一个长密码作为密码,通常由多个单词或一个复杂的字母数字字符串组成。 BIP0038加密方案的结果是经过base58check编码的加密私钥,前缀为6P。如果您看到一个以 6P 开头的 A 密钥,这意味着该密钥已加密,需要密码才能将密钥转换(解码)回私钥(以 5)为前缀),该私钥可在 WIF 中的任何钱包中使用格式。 @>.现在很多钱包应用都可以识别BIP0038加密的私钥比特币离线钱包,并且会要求用户提供密码解码并导入密钥。

BIP0038 加密密钥的最常见用例是纸钱包——一张纸备份私钥。只要用户选择强密码,使用BIP0038加密私钥的纸质钱包就非常安全,这也是离线存储比特币(也称为“冷存储”)的好方法。

P2SH(Pay-To-Script Hash)和多重签名地址

P2SH 函数最常见的实现是用于多重签名地址脚本。顾名思义,底层脚本需要多次签名验证所有权限,然后才能花掉资金。这类似于在银行开设联名账户。

比特币特殊地址

你可以通过计算生成一个特殊的比特币地址,比如我需要一个以Hello开头的地址,你可以通过脚本生成这样一个地址。但是,每增加一个字符,计算量就会增加58倍。如果超过 7 个字符,则需要特殊的硬件或矿机来生成。如果是8~10个字符,那么计算量将是难以想象的。