深入理解比特币原理3----比特币密钥、地址、钱包

深入理解比特币原理3----比特币密钥、地址、钱包,第1张

比特币中包含的加密技术 密钥地址钱包
它们是用来控制资金所有权的加密技术 密钥

比特币系统采用椭圆曲线乘法作为其公钥加密的的基础算法。用公钥加密创建一个密钥对,用于控制比特币的获取。密钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接收比特币,而私钥用于比特币支付时的交易签名。

私钥、公钥以及比特币地址的关系


上述关系可以简述为:私钥(随机生成的256位数)采用单向的椭圆曲线乘法生成一个公钥,再利用单向的哈希函数生成比特币地址。

注意:为什么使用非对称加密呢?(公钥/私钥)
它不是用于对交易进行“加密”(保密)的。 相反,非对称加密技术的最有用特性是生成数字签名。 可以将私钥用作交易的数字指纹来产生数字签名。 该签名只能由知晓私钥的人生成。但是,任何访问公钥和交易指纹的人都可以验证签名。这种非对称密码学的适用性使得任何人都可以验证每笔交易的每个签名,并且确保只有私钥的所有者可以生成有效的签名。

私钥如何生成?

生成私钥是第一步,其核心与“在1到2的256次方之间选一个数字”无异。
从编程的角度来看,一般是通过在一个密码学安全的随机源中(使用密码学安全的伪随机数生成器(CSPRNG))取出一长串随机字节,对其使用SHA256哈希算法进行运算,这样就可以方便地产生一个256位的数字。如果运算结果小于n(n=1.158 * 10的77次方,略小于2的256次方),我们就有了一个合适的私钥。否则,我们就用另一个随机数再重复一次。

公钥如何生成?

核心:通过椭圆曲线乘法可以从私钥计算得到公钥,这是不可逆转的过程:K = k G 。其中 k 是私钥,G 是被称为生成点的常数点,而 K 是所得公钥。其反向运算,被称为“寻找离散对数”——已知公钥K来求出私钥k——是非常困难的

补充:椭圆曲线加密算法是一种基于离散对数问题的非对称或者公钥加密算法,可以用对椭圆曲线上的点进行加法或乘法运算来表达。
我们的目标是找到生成点G的倍数kG。也就是将G相加k次。 在椭圆曲线中,点的相加等于该点的切线与曲线相交的那个点,该点基于x轴的对称点。

上图显示了得到 G、2G、4G 的几何做法。

比特币地址如何生成?

以公钥 K 为输入,计算其SHA256哈希值,并以此结果计算RIPEMD160哈希值,得到一个长度为160比特(20字节)的数字:
A = RIPEMD160(SHA256(K))
公式中,K是公钥,A是生成的比特币地址。

注意:通常用户见到的比特币地址是经过 “Base58Check”编码的,这种编码使用了58个字符(Base58数字系统)和校验码,提高了可读性、避免歧义并有效防止了在地址转录和输入中产生的错误。

比特币的Base58字母表

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz


上图描述了Base58Check编码的过程。
其结果由三部分组成:前缀、数据和校验和。

前缀:对数据添加一个称作“版本字节”的前缀,这个前缀用来识别编码的数据的类型。数据:上述步骤中生成的公钥哈希地址校验和:从编码的数据的哈希值中得到的,所以可以用来检测并避免转录和输入中产生的错误。计算“双哈希”校验和,意味着要对之前的结果(前缀和数据)运行两次SHA256哈希算法,在产生的长度为32个字节的哈希值(两次哈希运算)中,我们只取前4个字节

checksum = SHA256(SHA256(prefix+data))

私钥的格式

常见的私钥格式有以下三种

公钥的格式

主要分为压缩格式公钥和非压缩格式公钥,前缀04是用来区分非压缩格式公钥,压缩格式公钥是以02或者03开头。

一个公钥是一个椭圆曲线上的点(x,y)。而椭圆曲线实际是一个数学方程,曲线上的点实际是该方程的一个解。因此,如果我们知道了公钥的x坐标,就可以通过解方程y2 mod p = (x3 + 7) mod p得到y坐标。这种方案可以让我们只存储公钥的x坐标,略去y坐标,从而将公钥的大小和存储空间减少了256比特。

钱包 定义

钱包是私钥的容器,一般是通过结构化文件或简单数据库来实现。
注意: 事实上,钱包里只含有密钥。 “币”被记录在比特币网络的区块链中。 用户使用钱包中的密钥签名交易,从而控制网络上的钱币。 某种意义上,比特币钱包是密钥链。

分类 非确定性钱包(随机钱包)

每个密钥都是从随机数独立生成的。密钥彼此无关。 随机密钥的缺点就是如果你生成很多密钥,就必须保存它们所有的副本。这就意味着这个钱包必须频繁地备份,难以管理、 备份以及导入。

确定性(基于种子)钱包

所有的密钥都是从一个主密钥派生出来,这个主密钥即为种子(seed)。该类型钱包中所有密钥都相互关联,如果有原始种子,则可以再次生成全部密钥。

确定性钱包中使用了许多不同的密钥推导方法。最常用的推导方法是使用树状结构,称为分层确定性(hierarchical deterministic)钱包或HD钱包

分层确定性钱包(HD Wallets (BIP-32/BIP-44))

确定性钱包的最高级形式是通过BIP-32标准定义的HD钱包。HD钱包包含的密钥以树状结构衍生,使得父密钥可以衍生一系列子密钥,每个子密钥又可以衍生出一系列孙密钥,以此类推,无限衍生。

注意:HD钱包有哪些优势?

树状结构可以被用来表达附加的组织含义,比如子密钥的特定分支用来接收交易收入款项,另一个分支用来负责接收对外付款的找零。用户可以创建一系列公钥,而不需要访问对应的私钥。这样,HD钱包就能用在不安全的服务器上,或者仅作为接收用途,它为每个交易发布不同的公钥。
现有钱包的标准
助记码,基于BIP-39HD钱包,基于BIP-32多用途HD钱包结构,基于BIP-43多币种和多帐户钱包,基于BIP-44
从种子中创造HD钱包

种子是由助记词经过一系列的处理生成的,用户只需保存助记词,便可恢复密钥

下图展示了从根种子创建主密钥,主链码

主私钥(m)使用标准椭圆曲线乘法过程m * G生成对应的主公钥(M)。
链码用于从父密钥创造子密钥的函数中引入熵。

私有子密钥如何产生?

分层确定性钱包使用子密钥衍生child key derivation,简称CKD函数从父密钥衍生出子密钥。

子密钥衍生函数是基于单向哈希函数。这个函数结合了:

一个父私钥或者公钥(ECDSA压缩密钥)一个叫做链码(256 位)的种子一个索引号(32 位)
注意: 链码是用来给这个过程引入确定性随机数据的,使得仅凭索引和子密钥也不足以衍生其他子密钥。

下图展示了扩展父私钥创建子私钥的过程,(父密钥,链码,索引)相结合并哈希计算生成子密钥

父公钥,链码以及索引号合并在一起用HMAC-SHA512算法哈希计算之后产生512位的哈希值。所得的哈希拆分为两部分。右半部分的256位成为子链链码。左半部分256位附加到父私钥来衍生子私钥。

产生的子密钥有什么作用? 子密钥不能被用来发现它的父密钥。子密钥也不能用来发现它们的相同层级的姊妹密钥。子私钥可以用来制作公钥和比特币地址。 扩展密钥有什么作用?

定义: 密钥以及链码这两个重要的部分被结合之后,就叫做扩展密钥(extended key),其作用可以用来衍生子密钥。
分类:

扩展私钥:私钥以及链码的结合。它可被用来衍生子私钥(子私钥可以衍生子公钥)扩展公钥:公钥以及链码组成扩展公钥,它可以用来创建子公钥(只能是公钥)

一个扩展密钥包括一个私钥或者公钥和一个链码。一个扩展密钥可以创造出子密钥并且能创造出密钥树结构中的整个分支。共享了扩展密钥就可以访问整个分支。
扩展密钥通过Base58Check来编码,很容易在不同的BIP-32兼容钱包之间导入导出。

子公钥如何产生?

分层确定性钱包的一个很有用的特点就是可以不通过私钥而直接从父公钥派生出子公钥

通过子私钥(由私钥使用椭圆曲线生成公钥)通过扩展父公钥(如下图所示)
硬化子密钥为何会出现?

从扩展公钥衍生一个分支公钥的能力是很重要的,但牵扯一些潜在风险。

扩展公钥中包含有链码,如果子私钥被知道或者被泄漏的话,链码就可以被用来衍生所有的其他子私钥(考虑扩展公钥的下一层,已具备子私钥、子公钥、链码三个条件,再指明索引号就可产生新的子私钥)泄露的私钥如果再加上父链码,就可能暴露所有子项的所有私钥(考虑扩展公钥这一层)子私钥与父链码可以用来推断父私钥

HD钱包使用一种替代衍生函数,叫做强化衍生(hardened
derivation,“打破”了父公钥以及子链码之间的关系这个强化衍生函数使用了父私钥去推导子链码,而不是父公钥。这就在父/子顺序中创造了一道“防火墙”,链码就不能危害父私钥或者同级私钥强化衍生函数看起来与常规的子私钥衍生相同,不同的是父私钥可以作为哈希函数的输入,而父公钥不行
子密钥的硬化推导,省略父公钥

当使用强化私钥衍生函数时,得到的子私钥以及链码与使用一般衍生函数所得到的结果完全不同。得到的密钥“分支”可以被用来生产不易被攻击的扩展公钥,因为它所含的链码不能被用来泄露任何私钥。强化衍生也因此被用在使用扩展公钥的密钥树的上一层创造“隔层”。
为了避免主密钥泄露,主密钥所衍生的第一层级的子密钥总是通过强化衍生得来。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/2991620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存