深入理解比特币系列(15): 密码学基础第一部分(密钥及地址)

比特币的所有权是通过数字密钥、比特币地址和数字签名来确立的。数字密钥实际上并不是存储在网络中,而是由用户生成并存储在一个文件或简单的数据库中,称为钱包。存储在用户钱包中的数字密钥完全独立于比特币协议,可由用户的钱包软件生成并管理,而无需区块链或网络连接。密钥实现了比特币的许多有趣特性,包括去中心化信任和控制、所有权认证和基于密码学证明的安全模型。本文将对涉及密码学中的私钥、公钥及比特币地址的生成做一介绍。

公钥加密

公钥加密发明于20世纪70年代。它是计算机和信息安全的数学基础。

自从公钥加密被发明之后,一些合适的数学函数被提出,譬如:素数幂和椭圆曲线乘法。这些数学函数都是不可逆的,也就是单向计算很容易,但无法反向倒推。比特币正是使用椭圆曲线乘法作为其公钥加密的基础算法。

在比特币系统中,我们用公钥加密创建一个密钥对,用于控制比特币的获取。密钥对包括一个私钥,和由其衍生出的唯一的公钥。

公钥和私钥之间的数学关系,使得私钥可用于生成特定消息的签名。此签名可以在不泄露私钥的同时对公钥进行验证。

支付比特币时,比特币的当前所有者需要在交易中提交其公钥和签名(每次交易的签名都不同,但均从同一个私钥生成)。比特币网络中的所有人都可以通过所提交的公钥和签名进行验证,并确认该交易是否有效,即确认支付者在该时刻对所交易的比特币拥有所有权。

私钥、公钥与比特币地址

私钥(k)、公钥(K)及比特币地址(A)的计算关系如下图:

私钥(k)是一个随机生成的256位二进制数。Andreas强烈建议读者不要使用自己写的代码或使用编程语言内建的简易随机数生成器来获得一个随机数。

Bitcoin Core可以通过getnewaddress来生成新的密钥。为安全起见,getnewaddress只显示生成的公钥。dumpprivkey命令可以用来显示对应的私钥:

$ bitcoin-cli getnewaddress
1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
$ bitcoin-cli dumpprivkey 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ

公钥(K)可以通过椭圆曲线算法从私钥计算获得,且计算过程不可逆。

比特币地址(A)与公钥不同,是通过单向计算公钥的哈希函数获得。

A = RIPEMD160(SHA256(K))

上图中0x00是比特币地址的前缀设定。比特币系统中采用的Base58是所有字母数字组合除去“0”,“O”,“1”,“I”,即:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Base58Check Encode是基于Base58的编码格式。具体的计算流程如下图:

Base58CheckEncoding

通过以上的计算过程,便可以通过公钥计算出比特币地址了。

另,除去比特币地址外,Base58Check还有其他的前缀设定:

Type Version prefix (hex) Base58 result prefix
Bitcoin Address 0x00 1
Pay-to-Script-Hash Address 0x05 3
Bitcoin Testnet Address 0x6F m or n
Private Key WIF 0x80 5, K, or L
BIP-38 Encrypted Private Key 0x0142 6P
BIP-32 Extended Public Key 0x0488B21E xpub