硬件钱包如何用种子生成各种币的钱包的?
扫描二维码
随时随地手机看文章
关于种子&助记词
什么是哈希算法?有什么性质?
什么是公钥密码?什么是公钥与私钥?
分层确定性钱包表示方法与示例
1、关于种子&助记词
什么是种子 | Root Seed种子是一串由随机数生成器生成的随机数。这串随机数可以用来生成钱包中不同种币和不同账户的公私钥对,所以只需备份种子就相当于备份您的所有钱包了。由于网络空间存在各种各样的威胁,备份的私钥不接触电脑和手机等设备是最安全的,所以硬件钱包的备份方法是记在纸上。
什么是助记词 | Mnemonic Seed
种子是一串很长的随机数,看起来就是一串十六进制值,不利于人进行记录,所以我们用算法将其转化为一串助记词,人们就可以方便进行记录。助记词的产生过程如图:
不同长度的种子对应的单词数量如下表:
总结一下,就是将种子加上校验信息,每11位进行切分,按照得到的数字查询单词表索引得到单词。我们记录的英文单词是有校验信息的,所以不是随意MS个单词就能得到一个种子哦。以上的算法是可逆的,用记录下的助记词可以轻松得出种子。还记得硬件钱包初始化过程中让您记在纸上的那些英文单词吗?它们就相当于种子哦。
2、关于哈希和公私钥
哈希算法 | Hash Algorithm密码哈希函数是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值,也称为散列值。
哈希函数的性质:
1. 抗碰撞性
碰撞是与哈希函数相关的重要概念,体现着哈希函数的安全性,所谓碰撞是指两个不同的消息在同一个哈希函数作用下,具有相同的哈希值。哈希函数的安全性是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。
通俗地说,就是很难找到两个具有相同哈希值的不同消息。消息改变,输出的哈希值一般就会改变,哈希值可以看作消息的指纹。即使消息被略微篡改,这个指纹也会发生很大变化。所以哈希值可以用来做完整性校验。
2. 原像不可逆
通俗地说,知道输入值,很容易通过哈希函数计算出哈希值;但知道哈希值,没有办法计算出原来的输入值。
3. 难题友好性
难题友好性指的是没有便捷的方法去产生满足特殊要求的哈希值。
3、公钥密码算法
公钥密码算法需要两个密钥:公开密钥和私有密钥,简称公钥和私钥。公钥和私钥是一对,如果用公开密钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是不同的密钥,所以这种算法也叫做非对称密码算法。
区块链中所使用的公钥密码算法是椭圆曲线算法,每个用户拥有一对密钥,一个公开,另一个私有。利用椭圆曲线密码算法,用户可以用自己的私钥对交易进行签名,同时别的用户可以利用签名用户的公钥对签名进行验证。在比特币系统中,用户的公钥也被用来识别不同的用户,构造用户的比特币地址。
有一个很重要的特性,已知私钥通过密码学算法可以求出公钥,但知道公钥没办法反推出私钥。在下面的叙述中用point()表示由私钥求公钥的函数。在数字货币中,只要您能够用您的私钥对交易进行签名,就代表您有权利花出您手中这些币,别人只知道您的公钥,无法得到您的私钥,是没有办法使用您的币的。您可以简单认为您的私钥=您的所有币。硬件钱包就是要保护您的私钥,让它们远离被盗。
种子与公私钥对计算
由私钥创建公钥
椭圆曲线公钥创建函数,point(),输入为私钥,输出为公钥,即
point(私钥) == 公钥
主拓展公钥与主拓展私钥的生成
根种子为128、256或512位随机数,一般由随机数生成器生成。该根种子是用户唯一需要备份的,由该种子可以创建出用户所有钱包。
该种子经过哈希可以得到512位的哈希值,左右256位分别为主私钥m和主链码,主私钥与链码一起构成主拓展私钥。主公钥M由主私钥通过point()方式产生,主公钥与链码一起构成主拓展公钥。主拓展公钥和主拓展私钥位于分层钱包的最顶层。如图所示:
公钥生成函数的性质
由于point()的工作原理,可以把(父)公钥与一个通过整数值i创建的公钥相结合,得到(子)公钥。子公钥也可以通过point()方式产生,输入为父私钥加上整数i后取模p,用公式描述为
point( (父私钥 + i) % p ) == 父公钥 + point(i) == 子公钥
通过这种方式,只要确定一个整数序列,就可以从父公私钥对产生唯一确定的子公私钥对。如果仅需要子公钥,可以在不接触父私钥的情况下生成所有子公钥。
通过这种子密钥推导操作迭代,子公钥可以用于生成他们自己的子公钥(孙公钥),如下:
point( (子私钥+ i) % p ) == 子公钥 + point(i) == 孙公钥
普通的分层确定性密钥推导普通密钥推导的过程如图所示,
指定不同的索引号,可以从相同的父密钥中创建出不同的子密钥。使用子链码对子密钥重复这个过程可以创建出孙密钥,以此类推,分成结构的密钥就可以创建出来了。
加强的分层确定性密钥推导如果黑客得到了正常的父链码和父公钥,他就可以通过以上方式暴力枚举出所有由它推导出的链码和公钥。如果黑客也获得任何一个子孙的私钥,通过逆向上述普通分层确定性密钥算法,那么父私钥以及它子孙的所有私钥也就都泄露了。由于一个私钥泄露可以导致推导出一串私钥。图片中展示出了黑客的推导过程,红色框部分为黑客获得信息。
所以用户不应该导出链码和私钥到不可信的环境中。当然这种风险可以通过加强分层确定性密钥推导算法来避免。普通子私钥推导和加强子私钥推导的过程如图所示。
在加强子私钥推导中,父拓展公钥(父公钥+父链码)已经不能产生子链码了,子链码的产生需要父私钥的参与。加强拓展私钥就像防火墙一样,防止了上面攻击的发生。
使用普通密钥推导还是使用加强密钥推导是由索引决定的,索引号从0x00到0x7fffffff将产生普通密钥,当索引号从0x80000000到0xffffffff将产生加强密钥。
简化表示方法为了表述方便,使用撇号’来表示加强密钥,不加撇号为普通密钥,第一个普通密钥(0x00)和第一个加强密钥(0x80000000)都表示为0。
M和m表示密钥类型,M表示主公钥,m表示主私钥。斜杠/表示密钥的层次。例如m/0’/0/122’表示主私钥的第一个加强子私钥的第一个普通子私钥的第123个加强子私钥。
下图是简化表示方法的示意图,虚线代表密钥的推导过程,可以清晰看到加强密钥和普通密钥的区别。
每个层次代表的含义
m / purpose‘ / coin_type’ / account‘ / change / address_index
purpose为加强推导,为固定常数44’
coin_type为加强推导,代表币的种类,具体见附录。
account为加强推导,代表账户
change为普通推导,0代表外部链,1代表内部链。外部链用于地址,钱包外部可见,如用于收款。内部链钱包外部不可见,用于返回交易改变。
address_index为普通推导,从0开始递增。
一些栗子
现在你知道这些表示方法的含义了吧?
币的种类附录(常见)