比特币钱包的原理

比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的。数字密钥由用户生成并存储在数字钱包(也称比特币钱包)。钱包中包含成对的私钥和公钥。用户用私钥来签名交易,从而证明他们拥有交易的输出(其中的比特币);而通过公钥生成的比特币地址,则用于收款。以下分别对公/私钥、比特币地址、比特币钱包进行说明。

(1)公钥和私钥

比特币使用椭圆曲线算法作为其公钥加密的基础算法。

每个密钥对包括一个私钥和一个公钥。私钥是一个随机选择的数字,由256位的二进制数字组成,由随机数生成。

使用椭圆曲线算法这个单向加密函数,由私钥生成公钥;而反向用公钥求解私钥的过程是非常困难的,被称为“寻找离散对数”。

在椭圆曲线上,公钥计算方法为:

K=k*G

其中,k是私钥,G是生成点,在该曲线上所得的点K是公钥。比特币中的生成点G都是相同的。

在比特币中,私钥和公钥可以用多种编码格式表示。公钥分为非压缩格式公钥和压缩格式公钥两种。其中,非压缩格式公钥的前缀是04,压缩格式公钥的前缀是02或者03。

(2)比特币地址

比特币地址是一个由数字和字母组成的字符串,通常作为收款方出现。由公钥生成比特币地址时使用的算法是SHA (Secure Hash Algorithm)和RIPEMD (RACE Integrity Primitives Evaluation Message Digest),特别是SHA256和RIPEMD160。

以公钥K为输入,计算其SHA256哈希值,并用该结果计算RIPEMD160哈希值,得到一个长度为160比特(20字节)的数字:

A=RIPEMD160(SHA256(K))

其中,K是公钥,A是生成的比特币地址。

通常,比特币地址是经过Base58Check编码的,这种编码使用了58个字符(一种Base58数字系统)和校验码,提高了可读性,避免了歧义,并有效防止了在地址转录和输入中产生的错误。下图是公钥生成比特币地址的过程。

blob.png

从公钥生成比特币地址

(3)比特币钱包

作为私钥的容器,比特币钱包有两种类型,即非确定性(随机)钱包和确定性(种子)钱包。

早期的比特币钱包属于非确定性(随机)钱包,钱包是随机生成的私钥集合,通过有序文件或简单的数据库实现。这种钱包的缺点是对于钱包中的多个随机私钥,需要经常性地备份,以免钱包不能访问时,钱包所控制的资金将不能再被使用。

目前使用较多的确定性(种子)钱包通过使用单项离散方程可从公共的种子生成私钥,只需在初始创建时做一次备份即可。该类型钱包中,代表性的是分层确定性钱包(Hierarchical Deterministic Wallet或HDWallet),简称HD钱包。

HD钱包由单个根种子创建,根种子为128〜256位的随机数。为了便于用户抄写和备份,根种子表示为助记码词汇序列。使用HMAC-SHA512算法,可以由根种子衍生出子密钥序列,继而衍生出孙密钥序列,以此无穷类推。

助记码和种子的创建过程如下:

1)创造一个128〜256位的随机顺序(熵)。

2)提出SHA256哈希前几位,就可以创造一个随机序列的校验和。

3)把校验和加在随机顺序的后面。

4)把顺序分解成11位的不同集合,并用这些集合去和一个预先己经定义的由2048个单词组成的字典做对比;

5)生成一个12〜24个词的助记码。

创建主密钥以及HD钱包的主链编码的过程如图7-2所示。根种子输入到HMAC-SHA512算法中,就可以得到一个可用来创造主私钥m和主链编码的哈希。使用椭圆曲线上的K=k*G可以由主私钥m生成相对应的主公钥M。

由根种子创建主密钥以及主链编码

如图7-3所示。

由父私钥创建子私钥以及子链编码

868区块链学习网为您整理《比特币钱包的原理》仅供参考。